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

如何修复Python time函数数值取整导致的反应时间显示不准确问题

解决PicoZero反应时间测试代码的精准计时问题

问题根源

你的代码使用time.time()计时,但在树莓派Pico的MicroPython环境中,time.time()返回的是开机以来的整数秒数,并非带小数的高精度时间,所以计算出的反应时间只能是整数,导致显示0、1、2秒这类不精准的结果。

解决方案

改用MicroPython提供的高精度计时函数:

  • time.ticks_ms():返回当前时间的毫秒数(整数,范围0~2^30-1)
  • time.ticks_us():返回当前时间的微秒数(整数,范围0~2^30-1)
  • 必须用time.ticks_diff(new_ticks, old_ticks)计算时间差,避免计时溢出导致的错误结果

修改后的完整代码

from picozero import RGBLED, Button
import time
import random

rgb = RGBLED(red=18, green=17, blue=16)
button = Button(15)

times = []
index = 0

print("Press the button to start")

while not button.is_pressed:
    time.sleep(0.01)

while index != 5:
    rand_num = random.randrange(2, 4)
    index += 1

    rgb.color = (255, 0, 0)
    print("Wait for the green light")
    time.sleep(rand_num)

    rgb.color = (0, 255, 0)
    # 改用毫秒级计时
    start_ticks = time.ticks_ms()

    while not button.is_pressed:
        time.sleep(0.001)  # 缩小轮询间隔,提升按钮检测灵敏度

    # 计算时间差并转换为秒
    reaction_ms = time.ticks_diff(time.ticks_ms(), start_ticks)
    reaction_time = reaction_ms / 1000  # 转换为带小数的秒数
    times.append(reaction_time)
    rgb.color = (255, 0, 0)
    
    print(times)
    print(f"Reaction Time: {reaction_time:.3f} seconds")  # 格式化显示3位小数

关键修改点

  1. 用time.ticks_ms()替换time.time(),获取毫秒级起始时间
  2. 用time.ticks_diff()计算时间差,规避溢出问题
  3. 将毫秒差值转换为秒,通过格式化字符串输出精准到千分位的结果
  4. 可选优化:把按钮轮询的time.sleep(0.01)改为0.001,提升按钮按下的响应速度

内容的提问来源于stack exchange,提问作者123131312s

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 19:47:03