Arduino 2小时计时LCD显示及蜂鸣器触发功能实现问题求助
Arduino 2小时计时器修复方案
原有代码核心问题
- 全局定义的
hours变量仅在上电时计算一次,不会实时更新,2小时触发逻辑完全无效 - 1小时对应的毫秒数计算错误,1小时=3600000毫秒,原代码少写1个0,计时速度是实际的10倍
- LCD坐标参数写反,
setCursor(列, 行),1602LCD仅2行,行号最大为1,原代码行号超出显示范围 - 时分秒计算未取余,会出现秒数、分钟数大于60的异常显示
- 2小时触发逻辑未放在计时分支内,且触发后未重置计时状态,会反复执行清屏和响铃逻辑
修复后完整代码
#include <LiquidCrystal.h> LiquidCrystal lcd(1,2,4,5,6,7); #define button 3 int timerMode=0; int buzzer=8; int wait=400; int longWait=5000; unsigned long startTime; // 用unsigned long存毫秒数避免溢出 void setup() { lcd.begin(16,2); lcd.clear(); pinMode(button, INPUT_PULLUP); pinMode(buzzer, OUTPUT); lcd.print("Ergo timer"); } void loop() { if (digitalRead(button) == LOW){ startTime = millis(); timerMode++; delay(wait); } if (timerMode == 1){ unsigned long passTime = millis() - startTime; unsigned int hours = passTime / 3600000; unsigned int mins = (passTime % 3600000) / 60000; unsigned int secs = (passTime % 60000) / 1000; lcd.setCursor(0,0); lcd.print("Over 2 uur pause"); // 第二行显示 时:分:秒 格式 lcd.setCursor(0,1); if(hours <10) lcd.print("0"); // 补前导0更美观 lcd.print(hours); lcd.print(":"); if(mins <10) lcd.print("0"); lcd.print(mins); lcd.print(":"); if(secs <10) lcd.print("0"); lcd.print(secs); // 清空同一行后面多余的残留字符 lcd.print(" "); // 2小时触发逻辑 if(hours >= 2){ lcd.clear(); lcd.setCursor(0,0); lcd.print("---Nu pause---"); tone(buzzer,200,1000); timerMode = 2; // 退出计时模式 } } if (timerMode > 1){ delay(longWait); timerMode=0; lcd.clear(); lcd.print("---Ergo timer---"); } }
功能说明
- 按下按键后开始计时,第二行实时显示
XX:XX:XX格式的时分秒 - 计时满2小时自动触发蜂鸣器响1秒,屏幕提示休息
- 休息提示显示5秒后自动回到初始待机状态,可再次按按键启动计时
内容的提问来源于stack exchange,提问作者Pileala
相关产品推荐
相关产品推荐

