如视频无法正常播放,可点击这里前往B站观看
小夜灯控制程序-2:(无法复制本站示例程序代码?请点击这里获得解决方法。)
在示例程序2后面有示例程序-3
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 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 |
/* * TC-Light-fade-OnOff-Breathe-Custom-Color * 太极创客-环保小夜灯-示例程序-2 * by 太极创客 (2017-11-21) * www.taichi-maker.com * * 此示例程序为配合太极创客制作的 * 零基础入门学用ARDUINO教程-智能应用篇使用 * * 基本功能介绍: * 小夜灯配备人体红外感应传感器以及光敏电阻实现照明自动化 * 点亮和熄灭时产生渐明渐暗效果 * 在点亮过程中产生呼吸灯的效果 * 用户可以通过变量 maxRVal、maxGVal、maxBVal 自定义小夜灯点亮的颜色 * 用户可以通过变量 breathStep、breathStepDelay 自定义小夜灯渐明渐暗的速度 * * 基本电路连接说明: * 共阴极RGB-LED引脚R 连接 Arduino控制器引脚6 * 共阴极RGB-LED引脚G 连接 Arduino控制器引脚5 * 共阴极RGB-LED引脚B 连接 Arduino控制器引脚3 * 红外人体感应模块信号输出引脚 连接 Arduino控制器引脚8 * 光敏电阻分压电路信号输出引脚 连接 Arduino控制器引脚A0 * * 如需获取太极创客-环保小夜灯的具体电路连接 * 请参见太极创客网站: www.taichi-maker.com * */ #define rLedPin 6 //RGB-LED引脚R #define gLedPin 5 //RGB-LED引脚G #define bLedPin 3 //RGB-LED引脚B #define irSensorPin 8 //红外人体感应模块信号输出 #define lightSensorPin A0 //光敏电阻分压电路信号输出 int ledR = 0; //R Led 亮度 (请勿改变数值) int ledG = 0; //G Led 亮度 (请勿改变数值) int ledB = 0; //B Led 亮度 (请勿改变数值) bool irReading; //红外人体感应模块输出 int lightReading; //光敏电阻分压电路信号输出 //用户可以通过变量 maxRVal、maxGVal、maxBVal 自定义RGB-LED颜色 int maxRVal = 125; //夜灯R LED最大亮度 (允许数值:0 - 255) int maxGVal = 200; //夜灯G LED最大亮度 (允许数值:0 - 255) int maxBVal = 33; //夜灯B LED最大亮度 (允许数值:0 - 255) int minRVal = 39; //夜灯呼吸时R LED最小亮度 (允许数值:0 - 255) int minGVal = 95; //夜灯呼吸时G LED最小亮度 (允许数值:0 - 255) int minBVal = 11; //夜灯呼吸时B LED最小亮度 (允许数值:0 - 255) int breathStep = 1; //呼吸起伏速度 数值越大 速度越快 int breathStepDelay = 18; //呼吸起伏速度延迟 数值越大 起伏速度越慢 bool breatheOnOff = 0; //小夜灯呼吸状态 //breatheOnOff = 1 开启呼吸灯模式 //breatheOnOff = 0 关闭呼吸灯模式 bool onOffState; //小夜灯开关状态 bool debugOn = 0; /* * Arduino在控制LED亮度变化时,对于时间的要求很苛刻。 * 每一次Arduino通过串口监视器输出信息时都会让Arduino短暂停顿 * 这些短暂停顿会影响小夜灯的渐明渐暗效果。 * 因此建议在程序开发时令debugOn = 1,以便于观察Arduino * 的工作状态并作出必要的修改。 * 但是在正常工作时,建议将debugOn = 0, 从而确保Arduino * 的最佳工作效果。 * */ void setup() { //设置引脚为相应工作模式 pinMode(rLedPin, OUTPUT); pinMode(gLedPin, OUTPUT); pinMode(bLedPin, OUTPUT); pinMode(irSensorPin, INPUT); if(debugOn){ Serial.begin(9600); Serial.println("Welcome to Taichi-Maker RGB Led Night-Light."); } //检测是否LED亮度参数符合程序要求(min数值小于等于 max数值) if (minRVal > maxRVal || minGVal > maxGVal || minBVal > maxBVal) { while(true){ //如果出现数值设置问题,持续闪烁红灯 analogWrite(rLedPin, 255); delay(500); analogWrite(rLedPin, 0); delay(500); Serial.begin(9600); Serial.println("Bad LED Settings!!!"); } } } void loop() { irReading = digitalRead(irSensorPin); //读取红外人体感应模块 lightReading = analogRead(lightSensorPin); //读取光敏电阻分压电路信号输出 if(irReading == HIGH && lightReading >= 880){ //如感应到人且亮度达到需照明程度 if (onOffState == 0) fadeUp(maxRVal, maxGVal, maxBVal); //点亮小夜灯照明 onOffState = 1; //告知Arduino小夜灯被点亮了 if (breatheOnOff == 1)ledBreathe(); } else { //如未感应到人且亮度未达到需照明程度 if (onOffState == 1) fadeDown(0, 0, 0); //保持小夜灯熄灭 onOffState = 0; //告知Arduino小夜灯被熄灭了 } //通过串口监视器实时输出各个传感器检测的数据结果 //可用于调试小夜灯工作参数使用 if(debugOn){ Serial.println(""); Serial.println("==========================="); Serial.print("irReading = "); Serial.println(irReading); Serial.print("lightReading = "); Serial.println(lightReading); Serial.println("==========================="); delay(50); } } void fadeUp(int rTopVal, int gTopVal, int bTopVal){ while(ledR < rTopVal || ledG < gTopVal || ledB < bTopVal){ if (ledR+breathStep < rTopVal ) { ledR+=breathStep ; analogWrite(rLedPin, ledR); } else { ledR = rTopVal ; analogWrite(rLedPin, ledR); } if (ledG + breathStep < gTopVal) { ledG+=breathStep; analogWrite(gLedPin, ledG); } else { ledG = gTopVal ; analogWrite(gLedPin, ledG); } if (ledB + breathStep < bTopVal) { ledB+=breathStep ; analogWrite(bLedPin, ledB); } else { ledB = bTopVal ; analogWrite(bLedPin, ledB); } delay(breathStepDelay); if (debugOn){ Serial.println("================"); Serial.print("rVal = "); Serial.println(ledR); Serial.print("gVal = "); Serial.println(ledG); Serial.print("bVal = "); Serial.println(ledB); Serial.println("================"); } } } void fadeDown(int rBottomVal, int gBottomVal, int bBottomVal){ while(ledR > rBottomVal || ledG > gBottomVal || ledB > bBottomVal){ if (ledR-breathStep > rBottomVal) { ledR-=breathStep; analogWrite(rLedPin, ledR); } else { ledR = rBottomVal; analogWrite(rLedPin, ledR); } if (ledG-breathStep > gBottomVal) { ledG-=breathStep ; analogWrite(gLedPin, ledG); } else { ledG = gBottomVal; analogWrite(gLedPin, ledG); } if (ledB-breathStep > bBottomVal) { ledB-=breathStep ; analogWrite(bLedPin, ledB); } else { ledB = bBottomVal; analogWrite(bLedPin, ledB); } delay(breathStepDelay); if (debugOn){ Serial.println("================"); Serial.print("rVal = "); Serial.println(ledR); Serial.print("gVal = "); Serial.println(ledG); Serial.print("bVal = "); Serial.println(ledB); Serial.println("================"); } } } void ledBreathe(){ //亮度先降低 fadeDown(minRVal, minGVal, minBVal); //亮度再提高 fadeUp(maxRVal, maxGVal, maxBVal); } |
小夜灯控制程序-3
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 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 |
/* * TC-Light-fade-OnOff-Color-Change * 太极创客-环保小夜灯-示例程序-3 * by 太极创客 (2017-11-21) * www.taichi-maker.com * * 此示例程序为配合太极创客制作的 * 零基础入门学用ARDUINO教程-智能应用篇使用 * * 基本功能介绍: * 用户可通过传感器控制RGB-LED点亮和关闭 * 小夜灯配备人体红外感应传感器以及光敏电阻实现照明自动化 * 点亮和熄灭时产生渐明渐暗效果 * 点亮时色彩不断变化 * * 基本电路连接说明: * 共阴极RGB-LED引脚R 连接 Arduino控制器引脚6 * 共阴极RGB-LED引脚G 连接 Arduino控制器引脚5 * 共阴极RGB-LED引脚B 连接 Arduino控制器引脚3 * 红外人体感应模块信号输出引脚 连接 Arduino控制器引脚8 * 光敏电阻分压电路信号输出引脚 连接 Arduino控制器引脚A0 * * 如需获取太极创客-环保小夜灯的具体电路连接 * 请参见太极创客网站: www.taichi-maker.com * */ #define rLedPin 6 //RGB-LED引脚R #define gLedPin 5 //RGB-LED引脚G #define bLedPin 3 //RGB-LED引脚B #define irSensorPin 8 //红外人体感应模块信号输出 #define lightSensorPin A0 //光敏电阻分压电路信号输出 int ledR = 0; //R Led 亮度 int ledG = 0; //G Led 亮度 int ledB = 0; //B Led 亮度 bool irReading; //红外人体感应模块输出 int lightReading; //光敏电阻分压电路信号输出 bool onOffState; //小夜灯开关状态 unsigned long previousIRMillis; //上一次检查红外传感器的时间 unsigned long previousLightMillis; //上一次检查光敏传感器的时间 int irCheckInterval = 500; //红外传感器检查时间间隔 int lightCheckInterval = 1000; //光敏传感器检查时间间隔 int colorIndex; //颜色序列号 int colorChangeDelay = 1; //颜色改变速度控制变量(数值越大,颜色改变速度越慢) void setup() { //设置引脚为相应工作模式 pinMode(rLedPin, OUTPUT); //pinMode(6, OUTPUT); pinMode(gLedPin, OUTPUT); pinMode(bLedPin, OUTPUT); pinMode(irSensorPin, INPUT); Serial.begin(9600); Serial.println("Welcome to Taichi-Maker RGB Led Night-Light."); Serial.println("System Start Sensor Check."); irReading = digitalRead(irSensorPin); //读取红外人体感应模块 lightReading = analogRead(lightSensorPin); //读取光敏电阻分压电路信号输出 //通过串口监视器实时输出各个传感器检测的数据结果 //可用于调试小夜灯工作参数使用 Serial.println(""); Serial.println("======Checking Sensor.====="); Serial.println("==========================="); Serial.print("irReading = "); Serial.println(irReading); Serial.print("lightReading = "); Serial.println(lightReading); Serial.println("==========================="); Serial.println(""); } void loop() { unsigned long currentMillis = millis(); //millis函数可用来获取Arduino开机后运行的时间 irCheck(currentMillis); //检查红外传感器时间(currentMillis为当前Arduino开机运行的时间) lightCheck(currentMillis); //检查光敏电阻时间(currentMillis为当前Arduino开机运行的时间) if (irReading ==HIGH ) { irCheckInterval = 30000; //感应到人时人体传感器检查时间间隔较长 } else { irCheckInterval = 500; //未感应到人时人体传感器检查时间间隔较短 } /* * 以下语句将循环改变RGB-LED的颜色。 * 函数ledShowColor中共定义了约1536种颜色, * 而每种颜色都被编上一个独立的序号, * 且相邻两个编号色彩之间的色差极小。 * 于是RGB-LED在循环显示这些色彩时, * 小夜灯将会产生逐渐颜色变化的效果。 */ if(irReading ==HIGH && lightReading>=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 fadeOn(){ Serial.println(""); Serial.println("Fade ON"); int i; while(i < 255){ i++; ledR++; ledG++; ledB++; analogWrite (rLedPin, ledR); analogWrite (gLedPin, ledG); analogWrite (bLedPin, ledB); Serial.println(""); Serial.print("ledR = ");Serial.println(ledR); Serial.print("ledG = ");Serial.println(ledG); Serial.print("ledB = ");Serial.println(ledB); } } void fadeOff(){ Serial.println(""); Serial.println("Fade OFF"); while(ledR > 0){ ledR--; analogWrite (rLedPin, ledR); Serial.print("ledR = ");Serial.println(ledR); } while(ledB > 0){ ledB--; analogWrite (bLedPin, ledB); Serial.print("ledB = ");Serial.println(ledB); } while(ledG > 0){ ledG--; analogWrite (gLedPin, ledG); Serial.print("ledG = ");Serial.println(ledG); } colorIndex = 0; } void ledShowColor(int ledColorIndex){ /* * ledColorIndex参数为颜色序列号。 * 以下语句根据参数ledColorIndex让RGB-LED显示相应颜色。 * 从而产生小夜灯色彩渐变的效果。 * 您可以将程序上传并观察小夜灯在工作时候的串口监视器数据输出 * 从而找到小夜灯颜色变化的规律。 */ if (ledColorIndex >= 0 && ledColorIndex <= 255){ ledR = 255 - ledColorIndex; analogWrite (rLedPin, ledR); } else if(ledColorIndex >= 256 && ledColorIndex <= 511){ ledR = ledColorIndex -256; analogWrite (rLedPin, ledR); } else if(ledColorIndex >= 512 && ledColorIndex <= 767){ ledG = 767 - ledColorIndex; analogWrite (gLedPin, ledG); } else if(ledColorIndex >= 768 && ledColorIndex <= 1023){ ledG = ledColorIndex - 768; analogWrite (gLedPin, ledG); } else if(ledColorIndex >= 1024 && ledColorIndex <= 1279){ ledB = 1279 - ledColorIndex; analogWrite (bLedPin, ledB); } else if(ledColorIndex >= 1280 && ledColorIndex <= 1535){ ledB = ledColorIndex - 1280; analogWrite (bLedPin, ledB); } Serial.println(""); Serial.print("ledR = ");Serial.println(ledR); Serial.print("ledG = ");Serial.println(ledG); Serial.print("ledB = ");Serial.println(ledB); delay(colorChangeDelay); } void irCheck(unsigned long thisIRMillis) { /* * 每一次调用irCheck函数,都需要将当前Arduino的开机 * 时间传递给irCheck函数的thisIRMillis参数。 * 而irCheck函数中的previousIRMillis变量是上一次传感器检查时间 * 通过比较变量thisIRMillis和变量previousIRMillis之间的间隔 * (当前的Arduino开机运行时间和上一次检查传感器时间的间隔) * 来确定Arduino是否需要该检查传感器了。而控制这个时间间隔 * 的变量就是irCheckInterval。 */ if ((unsigned long)(thisIRMillis - previousIRMillis >= irCheckInterval)) { //如果时间间隔到达了 irReading = digitalRead(irSensorPin); //读取红外人体感应模块 //通过串口监视器实时输出传感器检测的数据结果 //可用于调试小夜灯工作参数使用 Serial.println(""); Serial.println("=== Checking IR Sensor ===="); Serial.println("==========================="); Serial.print("irReading = "); Serial.println(irReading); Serial.print("thisIRMillis = "); Serial.println(thisIRMillis); Serial.print("previousIRMillis = "); Serial.println(previousIRMillis); Serial.println("==========================="); Serial.println(""); // 每一次检查完传感器以后,都要将这一次检查传感器的时间更新给previousIRMillis。 // 这一个操作是通过将thisIRMillis存储的时间信息赋值给previousIRMillis完成的。 // 这样下次irCheck函数被调用时,previousIRMillis将保持为最近一次传感器检查时间。 previousIRMillis = thisIRMillis; } } void lightCheck(unsigned long thisLightMillis) { //检查是否到达时间间隔 if ((unsigned long)(thisLightMillis - previousLightMillis >= lightCheckInterval)) { //如果时间间隔到达了 lightReading = analogRead(lightSensorPin); //读取光敏电阻分压电路信号输出 //通过串口监视器实时输出各个传感器检测的数据结果 //可用于调试小夜灯工作参数使用 Serial.println(""); Serial.println("== Checking Light Sensor =="); Serial.println("==========================="); Serial.print("lightReading = "); Serial.println(lightReading); Serial.print("thisLightMillis = "); Serial.println(thisLightMillis); Serial.print("previousLightMillis = "); Serial.println(previousLightMillis); Serial.println("==========================="); Serial.println(""); previousLightMillis = thisLightMillis; // 记录最新一次的传感器检查时间 } } |