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

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

修复说明

  1. 用ticks_ms()替代阻塞式sleep实现非阻塞计时,避免卡住主循环和中断响应。
  2. 按钮回调仅修改状态变量,不执行长时间操作,保证系统能及时响应所有按钮事件。
  3. 主循环中统一处理蜂鸣器切换和计数逻辑,同时保留了计数到10自动停止、手动按钮停止的功能。

内容的提问来源于stack exchange,提问作者Lars Falc0n

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 14:55:10