如视频无法正常播放,可点击这里前往B站观看
本课示例代码:(无法复制本站示例程序代码?请点击这里获得解决方法。)
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 |
/* * 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 //光敏电阻分压电路信号输出 byte ledR = 0; //R Led 亮度 (请勿改变数值) byte ledG = 0; //G Led 亮度 (请勿改变数值) byte ledB = 0; //B Led 亮度 (请勿改变数值) bool irReading; //红外人体感应模块输出 int lightReading; //光敏电阻分压电路信号输出 //用户可以通过变量 maxRVal、maxGVal、maxBVal 自定义RGB-LED颜色 const int PROGMEM maxRVal = 125; //夜灯R LED最大亮度 (允许数值:0 - 255) const int PROGMEM maxGVal = 200; //夜灯G LED最大亮度 (允许数值:0 - 255) const int PROGMEM maxBVal = 33; //夜灯B LED最大亮度 (允许数值:0 - 255) const int PROGMEM minRVal = 39; //夜灯呼吸时R LED最小亮度 (允许数值:0 - 255) const int PROGMEM minGVal = 95; //夜灯呼吸时G LED最小亮度 (允许数值:0 - 255) const int PROGMEM minBVal = 11; //夜灯呼吸时B LED最小亮度 (允许数值:0 - 255) const int PROGMEM breathStep = 1; //呼吸起伏速度 数值越大 速度越快 const int PROGMEM breathStepDelay = 18; //呼吸起伏速度延迟 数值越大 起伏速度越慢 const bool PROGMEM breatheOnOff = 1; //小夜灯呼吸状态 //breatheOnOff = 1 开启呼吸灯模式 //breatheOnOff = 0 关闭呼吸灯模式 bool onOffState; //小夜灯开关状态 const bool PROGMEM 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(F("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(F("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(F("")); Serial.println(F("===========================")); Serial.print(F("irReading = ")); Serial.println(irReading); Serial.print(F("lightReading = ")); Serial.println(lightReading); Serial.println(F("===========================")); 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(F("================")); Serial.print(F("rVal = ")); Serial.println(ledR); Serial.print(F("gVal = ")); Serial.println(ledG); Serial.print(F("bVal = ")); Serial.println(ledB); Serial.println(F("================")); } } } 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(F("================")); Serial.print(F("rVal = ")); Serial.println(ledR); Serial.print(F("gVal = ")); Serial.println(ledG); Serial.print(F("bVal = ")); Serial.println(ledB); Serial.println(F("================")); } } } void ledBreathe(){ //亮度先降低 fadeDown(minRVal, minGVal, minBVal); //亮度再提高 fadeUp(maxRVal, maxGVal, maxBVal); } |