如何在MicroPython中为树莓派Pico实现时间重置循环
树莓派Pico闹钟长按返回设置模式解决方案
核心问题分析
你的show_current_Time死循环如果使用了time.sleep(1),会直接阻塞整个程序——这1秒内系统完全无法响应按键输入,自然检测不到长按操作。另外,长按检测逻辑如果没做非阻塞计时、按键消抖处理,也会导致触发失败。
具体修复步骤
1. 替换阻塞式延时为非阻塞计时
把show_current_Time里的time.sleep(1)换成基于时间戳的非阻塞判断,确保程序每秒更新时间的同时,能持续检测按键状态:
import utime def show_current_time(rtc, lcd): last_update = utime.ticks_ms() while True: # 每次循环都检测长按 if check_button4_long_press(): # 长按触发,跳出显示循环进入设置流程 enter_time_setting(rtc, lcd) break # 每秒更新一次时间显示 if utime.ticks_diff(utime.ticks_ms(), last_update) >= 1000: dt = rtc.datetime() # 替换为你的LCD时间显示逻辑 lcd.display_time(dt[4], dt[5], dt[6]) last_update = utime.ticks_ms()
2. 实现非阻塞的长按检测逻辑
单独写一个函数处理Button4的长按,用时间戳记录按下起始点,持续判断按下时长是否达到3秒,同时处理按键消抖:
from machine import Pin # 根据你的接线调整上拉/下拉配置 button4 = Pin(4, Pin.IN, Pin.PULL_UP) LONG_PRESS_DURATION = 3000 # 3秒,单位毫秒 press_start = 0 def check_button4_long_press(): global press_start # 按键按下(低电平,根据接线调整判断逻辑) if not button4.value(): if press_start == 0: press_start = utime.ticks_ms() else: elapsed = utime.ticks_diff(utime.ticks_ms(), press_start) if elapsed >= LONG_PRESS_DURATION: press_start = 0 # 重置计时,避免重复触发 return True else: press_start = 0 # 按键松开,重置计时 return False
3. 重构主流程,用模式切换替代独立死循环
把显示和设置逻辑整合到主循环里,用变量标记当前模式,避免单个死循环阻塞程序:
def main(): # 初始化硬件 rtc = machine.RTC() lcd = your_lcd_instance() # 替换为你的LCD实例 current_mode = "show" # show:显示模式,setting:设置模式 while True: if current_mode == "show": update_time_display(rtc, lcd) if check_button4_long_press(): current_mode = "setting" elif current_mode == "setting": # 执行原有时间设置逻辑,完成后返回显示模式 current_mode = handle_time_setting(rtc, lcd) def update_time_display(rtc, lcd): global last_update if 'last_update' not in globals(): last_update = utime.ticks_ms() if utime.ticks_diff(utime.ticks_ms(), last_update) >= 1000: dt = rtc.datetime() lcd.display_time(dt[4], dt[5], dt[6]) last_update = utime.ticks_ms() def handle_time_setting(rtc, lcd): # 你的原有时间设置逻辑,完成后返回"show" # ... 设置时、分、秒的代码 ... rtc.datetime((year, month, day, weekday, hour, minute, second, 0)) return "show"
4. 硬件接线检查
确认Button4的接线是否正确:如果按键一端接GPIO、另一端接地,GPIO必须设置为Pin.PULL_UP;如果另一端接VCC,GPIO要设为Pin.PULL_DOWN。错误的接线会导致按键状态读取异常,长按检测自然失效。
内容的提问来源于stack exchange,提问作者Hans_im_Unglück
相关产品推荐
相关产品推荐

