You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

新手求助: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
  • millis()的优势:它会返回Arduino开机以来的毫秒数,通过计算currentMillis - previousMillis判断时间是否达标,整个过程不会卡住程序,后续加其他功能毫无压力。
  • 状态标记hasStarted:用来区分“等待亮灯”和“维持亮灯”两个阶段,避免逻辑混乱。

额外小技巧

如果需要循环重复执行这个流程(比如每次等30秒亮1分钟,周而复始),只需要把代码里被注释的两行取消注释就行:

hasStarted = false;
previousMillis = currentMillis;

内容的提问来源于stack exchange,提问作者JimmyBoi

火山引擎 最新活动