新手求助:Arduino Uno定时控制类灯泡装置的代码实现方法
Arduino Uno 定时控制灯泡的非阻塞实现方案
嘿,作为刚入坑Arduino的新手,你选millis()计时绝对是走对了方向——比起会把程序卡死的delay(),它是非阻塞式计时,哪怕以后你想加个按键或者其他传感器,程序也能正常跑。下面直接给你能上手的代码和详细解释,保证你看得懂:
完整代码示例
// 定义灯泡连接的引脚(这里默认用数字13,你也可以改成其他数字引脚) const int bulbPin = 13; // 可按需调整的核心参数,直接改数值就行 const unsigned long delayBeforeOn = 30000; // 开启前的等待时长,单位毫秒(示例是30秒) const unsigned long bulbOnDuration = 60000; // 灯泡点亮时长,单位毫秒(示例是60秒/1分钟) // 计时用的变量,不用手动修改 unsigned long previousMillis = 0; int bulbState = LOW; // 初始状态:灯泡关闭 bool hasStarted = false; // 标记是否进入过点亮阶段 void setup() { pinMode(bulbPin, OUTPUT); digitalWrite(bulbPin, bulbState); // 初始化时关闭灯泡 } void loop() { unsigned long currentMillis = millis(); // 分阶段逻辑:先等延迟,再亮灯,最后关灯 if (!hasStarted) { // 还没亮灯,等待设定的延迟时间 if (currentMillis - previousMillis >= delayBeforeOn) { bulbState = HIGH; digitalWrite(bulbPin, bulbState); previousMillis = currentMillis; // 更新计时起点,开始算亮灯时长 hasStarted = true; // 标记进入亮灯阶段 } } else { // 已经亮灯,等待时长到后关闭 if (currentMillis - previousMillis >= bulbOnDuration) { bulbState = LOW; digitalWrite(bulbPin, bulbState); // 如果需要循环重复这个流程,取消下面两行注释即可 // hasStarted = false; // previousMillis = currentMillis; } } }
关键细节解释
- 引脚与接线:
bulbPin是灯泡连接的数字引脚,如果是普通LED,记得串联220Ω左右的电阻;如果是市电灯泡,必须用继电器模块,绝对不能直接接Arduino引脚(会烧板子!)。 - 参数调整:
- 想让灯泡等10分钟再亮,就把
delayBeforeOn改成600000(10601000); - 想让灯泡亮30秒,就把
bulbOnDuration改成30000。
- 想让灯泡等10分钟再亮,就把
millis()的优势:它会返回Arduino开机以来的毫秒数,通过计算currentMillis - previousMillis判断时间是否达标,整个过程不会卡住程序,后续加其他功能毫无压力。- 状态标记
hasStarted:用来区分“等待亮灯”和“维持亮灯”两个阶段,避免逻辑混乱。
额外小技巧
如果需要循环重复执行这个流程(比如每次等30秒亮1分钟,周而复始),只需要把代码里被注释的两行取消注释就行:
hasStarted = false; previousMillis = currentMillis;
内容的提问来源于stack exchange,提问作者JimmyBoi




