Raspberry Pi Pico上MicroPython的while循环失效问题求助
问题1:cont_false函数未生效的原因
cont_false里误用了比较运算符==而非赋值运算符=,导致全局变量cont根本没有被设置为False,只需把cont == False改为cont = False即可修正。
问题2:while循环仅输出一次计数的原因
Timer_start作为按钮回调函数,包含了sleep(5)和循环内的sleep等阻塞操作。MicroPython的按钮回调运行在中断上下文,长时间阻塞会导致系统无法处理其他事件(比如另一个按钮的回调),甚至会让循环无法正常迭代,最终出现只输出一次计数、蜂鸣器异常持续响的情况。
修复后的代码
将计时逻辑移到主循环中,用状态变量控制,避免在回调里执行阻塞操作:
from picozero import pico_led, Button, LED, Buzzer from time import ticks_ms, sleep led16 = LED(16) button12 = Button(12, pull_up=False) button15 = Button(15, pull_up=False) buzzer14 = Buzzer(14) # 状态变量 cont = False count = 0 timer_start_time = 0 buzzer_state = False buzzer_tick = 0 def start_timer(): global cont, count, timer_start_time cont = True count = 0 timer_start_time = ticks_ms() led16.on() def stop_timer(): global cont cont = False led16.off() buzzer14.off() button15.when_pressed = start_timer button12.when_pressed = stop_timer while True: # 主循环处理板载LED闪烁 pico_led.toggle() sleep(0.5) if cont: # 等待5秒倒计时 if ticks_ms() - timer_start_time < 5000: continue # 非阻塞处理蜂鸣器和计数逻辑 current_tick = ticks_ms() if current_tick - buzzer_tick >= 500: # 0.2秒响 + 0.3秒停 = 0.5秒一个周期 buzzer14.toggle() if buzzer_state: # 蜂鸣器关闭时计数+1 count += 1 print(count) # 计数到10自动停止 if count >=10: stop_timer() buzzer_state = not buzzer_state buzzer_tick = current_tick
修复说明
- 用
ticks_ms()替代阻塞式sleep实现非阻塞计时,避免卡住主循环和中断响应。 - 按钮回调仅修改状态变量,不执行长时间操作,保证系统能及时响应所有按钮事件。
- 主循环中统一处理蜂鸣器切换和计数逻辑,同时保留了计数到10自动停止、手动按钮停止的功能。
内容的提问来源于stack exchange,提问作者Lars Falc0n
相关产品推荐
相关产品推荐

