本项目基于 Raspberry Pi Pico(RP2040) 微控制器,实现了一个功能完整的 反应速度测试器。系统会在随机时间点点亮板载 LED,用户在看到灯光后立即按下指定按键,程序将自动计算并实时显示从 LED 点亮到按键触发之间的精确时间差。
在实现上,该项目综合运用了 GPIO 控制、按键中断、随机数生成、高精度计时以及 OLED 显示驱动 等嵌入式开发基础模块,并加入了简单的防误触逻辑,以确保测量结果的准确性。
硬件平台介绍
项目使用的硬件是基于树莓派Pico的嵌入式学习平台,包含一块扩展板及一个核心模块。核心板采用了 Raspberry Pi 官方自主研发的 RP2040 微控制器芯片,搭载双核 ARM Cortex M0+ 处理器,运行频率高达 133MHz,内置 264KB SRAM 和 2MB 闪存,并提供了多达 26 个多功能 GPIO 引脚,非常适合进行此类需要精确时序控制与硬件交互的项目。

软件层面,开发者可以选择使用官方的 C/C++ SDK 或 MicroPython 进行编程。本项目采用 MicroPython 实现,得益于其简洁的语法和丰富的硬件库,能够快速完成原型开发。
项目设计思路
整个程序流程围绕点灯、按键检测与结果显示三个核心功能展开。系统启动后,首先在 OLED 屏上显示操作引导,等待用户按下启动键。随后,程序在随机延时后点亮随机一个 LED,并开始计时。用户看到灯光后按下反应键,程序立即停止计时,计算时间差并显示结果。程序流程图清晰地描述了这一逻辑。

功能实现详解
-
用户引导界面
程序启动后,OLED 屏显示“Press K2 button to start”,提示用户开始测试。

按下 K2 键后,屏幕更新为“Please press K1 button when the led light is on”,明确接下来的操作规则,等待约 2 秒后进入测试状态。

-
随机 LED 触发
测试开始,四个彩色 LED 中的一个会在随机时间后被点亮,同时 OLED 屏清屏,确保用户注意力集中在灯光信号上。


-
结果显示
当用户在 LED 亮起时正确按下 K1 键,OLED 屏将立即显示本次的反应时间,单位为毫秒 (ms)。

-
防误触设计
为防止误操作影响结果,程序增加了判断逻辑。如果用户在 LED 未亮起时按下 K1 键,屏幕会显示“Error!”进行提示。

-
结束测试
完成一次或多次测试后,再次按下 K2 按钮即可退出测试循环。
核心代码解析
1. 随机点灯与灭灯控制
通过 random 模块生成随机数来决定点亮哪个 LED,点灯和灭灯操作被封装为独立的函数。
from led import r, g, b, y
def Led_off(): # 灭灯
y.off()
r.off()
g.off()
b.off()
def Led_on(): # 随机点灯
seed = random.randint(1, 4)
if seed == 1:
y.on()
elif seed == 2:
r.on()
elif seed == 3:
g.on()
elif seed == 4:
b.on()
其中,y, r, g, b 是四个 Pin 对象,在 led.py 中定义,它们对应板上的四个 LED 引脚。
from board import pin_cfg
from machine import Pin
r = Pin(pin_cfg.red_led, Pin.OUT)
g = Pin(pin_cfg.green_led, Pin.OUT)
b = Pin(pin_cfg.blue_led, Pin.OUT)
y = Pin(pin_cfg.yellow_led, Pin.OUT)
2. 按键中断与时间计算
按键检测使用了中断机制,以实现毫秒级的精确响应。当 K1 键被按下时,触发回调函数计算反应时间。
from button import button
import time
lock = False
timer_start = 0 # 初始化计时起点
def Error(): # 防呆函数
msg = "Error!"
print(msg)
oled.init_display()
oled.text(msg, 0, 32)
oled.show()
def k1_callback(pin):
global timer_start
global lock
if not lock: # 如果灯没亮就按键
Error()
return
# 计算反应时间
timer_reaction = time.ticks_ms() - timer_start
oled.text('Your reaction', 0, 20, 1)
oled.text('time was ' + str(timer_reaction) + 'ms', 0, 40, 1)
oled.show()
Led_off() # 熄灭LED
lock = False # 重置锁
# 实例化K1按键对象,设置下降沿触发中断
k1 = button(pin_cfg.k1, k1_callback, trigger=Pin.IRQ_FALLING)
3. OLED 屏幕驱动
OLED 显示基于 SSD1306 驱动芯片,使用 SPI 接口进行通信。
from machine import Pin, SPI
from ssd1306 import SSD1306_SPI
from board import pin_cfg
# 初始化 SPI 总线
spi = SPI(1, 100000, mosi=Pin(pin_cfg.spi1_mosi), sck=Pin(pin_cfg.spi1_sck))
# 实例化 OLED 对象
oled = SSD1306_SPI(128, 64, spi, Pin(pin_cfg.spi1_dc), Pin(pin_cfg.spi1_rstn), Pin(pin_cfg.spi1_cs))
项目总结与展望
本项目成功实现了基于 树莓派Pico 和 MicroPython 的反应速度测试器,涵盖了从硬件初始化、信号触发、精确计时到结果显示的完整嵌入式开发流程。通过这个实践,可以深入理解 GPIO 控制、中断处理等核心概念。
项目仍有进一步的优化空间,例如:
- 在每次测试间隔增加 OLED 屏上的倒计时提示。
- 为按键动作添加声音反馈,提升交互体验。
- 实现多次测试自动计算并显示平均反应时间的功能,使测量更具统计意义。
这个项目展示了如何使用低成本、高性能的微控制器平台快速验证一个有趣的交互式硬件应用,为学习更复杂的嵌入式系统与云原生设备开发打下了良好的基础。