You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Arduino使用millis()实现非阻塞定时依次打印数字问题求助

问题根源

你当前的代码设置了两个独立的定时规则:事件1每1秒触发一次、事件2每5秒触发一次,两个事件的执行逻辑完全无关联,自然会出现每5秒先打印5次1再打印1次2的结果,和你要的每隔5秒交替输出1、2,最终依次循环输出1-6的需求不符。

正确实现方案

你只需要保留1个5秒的定时触发器,再新增一个状态变量记录下一次需要打印的数字即可,逻辑完全非阻塞,也更容易扩展到1-6的循环输出:

适配你当前1/2交替测试的代码

const unsigned long eventInterval = 5000; // 统一5秒间隔
unsigned long previousTime = 0;
int nextNum = 1; // 下一次要打印的数字

void setup() {
  Serial.begin(9600);
}

void loop() {
  unsigned long currentTime = millis();
  // 每5秒触发一次
  if (currentTime - previousTime >= eventInterval) {
    Serial.println(nextNum);
    // 切换下一个要打印的数字,1和2交替
    nextNum = nextNum == 1 ? 2 : 1;
    // 更新上次执行时间
    previousTime = currentTime;
  }
}

扩展到1-6依次循环打印的代码

如果要实现你最初的1-6依次打印需求,只需要修改状态切换的逻辑即可:

const unsigned long eventInterval = 5000; // 每5秒打印一个数字
unsigned long previousTime = 0;
int currentNum = 1; // 从1开始打印

void setup() {
  Serial.begin(9600);
}

void loop() {
  unsigned long currentTime = millis();
  if (currentTime - previousTime >= eventInterval) {
    Serial.println(currentNum);
    // 数字自增,到6之后回到1循环
    currentNum++;
    if (currentNum > 6) {
      currentNum = 1;
    }
    previousTime = currentTime;
  }
}

运行说明

上述代码不会阻塞loop()函数的其他逻辑,每5秒触发一次打印,输出顺序完全符合你的预期,如果需要调整打印间隔只需要修改eventInterval的参数即可。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 21:18:01