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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 00:47:37