如何在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状态等 }
你之前变量异常的常见原因:
- 变量类型错误:
millis()返回的是unsigned long类型,如果你用int或普通long存储时间戳,数值溢出后会变成负数或乱码,直接导致延时判断失效。必须统一用unsigned long存时间相关变量。 - 状态变量逻辑混乱:没有正确维护活塞状态(
pistonIsExtended)和按钮触发标记(buttonHasTriggered),比如按钮抖动导致多次触发状态切换,看起来像变量异常。 - 延时判断写法错误:如果写成
millis() >= triggerTimestamp + resetDelayMs,当millis()运行约50天后溢出时,这个判断会直接失效;而millis() - triggerTimestamp的写法可以自动处理溢出问题。 - 按钮未消抖:机械按钮按下时会有几十毫秒的电平抖动,不处理的话会触发多次状态变更,造成逻辑混乱。
内容的提问来源于stack exchange,提问作者budinzoid
相关产品推荐
相关产品推荐

