Redamancy785's Blog

在不动声色的日子里,遇见你真好

0%

🚗造轮子—智能小夜灯

今天练习的程序是实现智能小夜灯的控制,首先,通过太极创客的视频来看看最终的实现结果:🍬

本次程序例程来自太极创客官网,此平台的Arduino教程深入浅出,对于想学习Arduino的同学,首推太极创客团队。(๑•̀ㅂ•́)و✧

以下便是今天练习的造轮子程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
/*
*基本功能介绍:
* 用户可通过传感器控制RGB-LED点亮和关闭
* 小夜灯配备人体红外感应传感器以及光敏电阻实现照明自动化
* 点亮和熄灭时产生渐明渐暗效果
* 点亮时色彩不断变化
*
* 基本电路连接说明:
* 共阴极RGB-LED引脚R 连接 Arduino控制器引脚6
* 共阴极RGB-LED引脚G 连接 Arduino控制器引脚5
* 共阴极RGB-LED引脚B 连接 Arduino控制器引脚3
* 红外人体感应模块信号输出引脚 连接 Arduino控制器引脚8
* 光敏电阻分压电路信号输出引脚 连接 Arduino控制器引脚A0
*/

//宏定义引脚
#define rLedPin 6
#define gLedPin 5
#define bLedPin 3

#define irSensorPin 8
#define lightSensorPin A0

//led亮度
int ledR=0;
int ledG=0;
int ledB=0;

bool irReading; //红外人体感应模块输出
int lightRedaing; //光敏电阻分压电路信号输出
bool onOffState; //小夜灯开关状态

unsigned long previousIrMillis; //上一次检查红外传感器的时间
unsigned long previousLightMillis; //上一次检查光敏传感器的时间
int irCheckInterval=500; //红外传感器检查时间间隔
int irCheckInterval=1000; //光敏传感器检查时间间隔

int colorIndex; //颜色序列号
int colorChangeDelay=1; //颜色改变速度控制变量

void setup(){
//设置引脚工作模式
pinMode(rLedPin,OUTPUT);
pinMode(gLedPin,OUTPUT);
pinMode(bLedPin,OUTPUT);
pinMode(irSensorPin,INPUT);

Serial.begin(9600);
Serial.println("Welcome!");
Serial.println("===System Start Sensor Cheak===");

//读取红外人体感应模块
irReading=digitalRead(irSensorPin);
lightRedaing=anologRead(lightSensorPin);

Serial.println("===Checking Sensor===");
Serial.print("irReading");Serial.println(irReading);
Serial.print("lightRedaing");Serial.println(lightRedaing);
Serial.println("======================");

}

//六个函数
void loop(){
unsigned long currentMillis=millis();//millis()函数可以用来获取Arduino开机后的运行时间

irCheak(currentMillis);//检查红外传感器时间
lightCheak(currentMillis);//检查光敏电阻时间

if(irReading==HIGH){
irCheckInterval=30000;
}else{
irCheckInterval=500;
}

if(irReading==HIGH&&lightRedaing>=880){
if(onOffState==0)
fadeOn();
onOffState=1;

if(colorIndex<=1535){
colorIndex++;
}else if(colorIndex>1535){
colorIndex=0;
}
ledShowColor(colorIndex)
}else{
if(onOffState==1)
fadeOff();
onOffState=0;
}
}


void irCheak(unsigned long currentMillis){
if(currentMillis-previousIrMillis)>=irCheakInterval){
irReading=digitalRead(irSensorPin);

Serial.println("===Checking IR Sensor===");
Serial.print("irReading=");Serial.println(irReading);
Serial.print("currentMillis");Serial.println(currentMillis);
Serial.print("previousIrMillis");Serial.println(previousIrMillis);
Serial.println("=========================");
previousIrMillis=currentMillis;
}
}

void lightCheak(unsigned long currentMillis){
if(currentMillis-previousLightMillis)>=lightCheakInterval){
lightRedaing=anologRead(lightSensorPin);

Serial.println("===Checking Light Sensor===");
Serial.print("lightReading=");Serial.println(lightRedaing);
Serial.print("currentMillis");Serial.println(currentMillis);
Serial.print("previousLightMillis");Serial.println(previousLightMillis);
Serial.println("===========================");

previousLightMillis=currentMillis;
}
}


void ledShowColor(int colorIndex){
if(colorIndex>=0&&colorIndex<=255){
ledR=255-colorIndex;
anologWrite(rLedPin,ledR);
}else if(colorIndex>=256&&colorIndex<=511){
ledR=colorIndex-256;
anologWrite(rLedPin,ledR);
}else if(colorIndex>=512&&colorIndex<=767){
ledG=767-colorIndex;
anologWrite(gLedPin,ledG);
}else if(colorIndex>=768&&colorIndex<=1023){
ledG=colorIndex-768;
anologWrite(gLedPin,ledG);
}else if(colorIndex>=1024&&colorIndex<=1279){
ledB=1279-colorIndex;
anologWrite(bLedPin,ledB);
}else if(colorIndex>=1280&&colorIndex<=1535){
ledB=colorIndex-1280;
anologWrite(bLedPin,ledB);
}
delay(colorChangeDelay);
}

void fadeOn(){
Serial.println("");
Serial.println("Fade On");
int i;
while(i<255){
i++;
ledR++;
ledG++;
ledB++;
anologWrite(rLedPin,ledR);
anologWrite(gLedPin,ledG);
anologWrite(bLedPin,ledB);
}
}

void fadeOff(){
while(ledR>0){
ledR--;
anologWrite(rLedPin,ledR);
}
while(ledG>0){
ledG--;
anologWrite(gLedPin,ledG);
}
while(ledB>0){
ledB--;
anologWrite(bLedPin,ledB);
}
colorIndex=0;
}

🎯心得:

变量的声明其实可以更加详细一点,可以使用完整的英文来表示,而不是只使用单词的开头字母。因为在真正写代码的过程中,变量其实大多不是自己拼出来,而是直接复制粘贴,而在此时,准确知道变量的含义并复制来使用尤为重要。所以不要忌讳变量名过长能快速识别并且能拿来使用是更重要的

我不管,我要吃棒棒糖~