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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 19:39:03