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

如何在Arduino代码中添加millis()定时器实现活塞延时复位?

Arduino 非阻塞式活塞触发复位实现(解决millis()使用后变量异常问题)

直接给你可运行的代码,再拆解问题原因:

// 引脚定义
const int buttonPin = 2;
const int pistonPin = 3;

// 状态与时间变量
bool pistonIsExtended = false;
bool buttonHasTriggered = false;
unsigned long triggerTimestamp = 0;
const unsigned long resetDelayMs = 5000; // 延时5秒复位

void setup() {
  pinMode(buttonPin, INPUT_PULLUP); // 用内部上拉,按钮接GND触发
  pinMode(pistonPin, OUTPUT);
  digitalWrite(pistonPin, LOW); // 初始状态活塞缩回
}

void loop() {
  // 按钮读取与消抖处理
  int btnState = digitalRead(buttonPin);
  if (btnState == LOW && !buttonHasTriggered) {
    // 按钮首次按下,触发活塞动作
    buttonHasTriggered = true;
    if (!pistonIsExtended) {
      digitalWrite(pistonPin, HIGH);
      pistonIsExtended = true;
      triggerTimestamp = millis(); // 记录触发时刻
    }
  } else if (btnState == HIGH) {
    // 按钮松开,重置触发标记
    buttonHasTriggered = false;
  }

  // 非阻塞延时复位逻辑
  if (pistonIsExtended && (millis() - triggerTimestamp >= resetDelayMs)) {
    digitalWrite(pistonPin, LOW);
    pistonIsExtended = false;
  }

  // 这里可以添加其他需要并行执行的代码,不会被阻塞
  // 比如读取传感器、更新LED状态等
}

你之前变量异常的常见原因:

  1. 变量类型错误:millis()返回的是unsigned long类型,如果你用int或普通long存储时间戳,数值溢出后会变成负数或乱码,直接导致延时判断失效。必须统一用unsigned long存时间相关变量。
  2. 状态变量逻辑混乱:没有正确维护活塞状态(pistonIsExtended)和按钮触发标记(buttonHasTriggered),比如按钮抖动导致多次触发状态切换,看起来像变量异常。
  3. 延时判断写法错误:如果写成millis() >= triggerTimestamp + resetDelayMs,当millis()运行约50天后溢出时,这个判断会直接失效;而millis() - triggerTimestamp的写法可以自动处理溢出问题。
  4. 按钮未消抖:机械按钮按下时会有几十毫秒的电平抖动,不处理的话会触发多次状态变更,造成逻辑混乱。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 05:42:40