一、项目描述
总体概括:制作一个反应测试器
具体要求:随机点亮板上的一个LED,按下板上的一个按键,在显示屏上显示出从灯亮到按键之间的时间
实现方式:通过软件产生随机数,程序启动以后在随机数控制的时间下随即点亮板上的一个LED灯。被测试者按下按键之后,处理器将处理从点亮灯到按下按键之间的时间差,并将时间差间隔显示在OLED屏上以及PC上。
设计思路:想要完成这个项目需要有以下几点条件:
1.懂得随机数如何生成,也就是掌握随机数函数,以此可用在随机时间后点亮LED灯以及随机点亮任意一个LED灯这两个地方。
2.懂得如何点亮LED灯,也就是掌握开关LED灯的函数
3.在灯亮之时以及按下按钮之时,让处理器进行反应,测量时间差,也就是掌握时间方面的函数,顺便说一下,我选择的按钮是k1按钮
4.让时间差反映在OLED屏以及PC屏上,也就是掌握输出函数以及OLED屏的显示函数
懂得以上这些函数,想要实现反应测试器的功能便轻而易举,由点到面即可。
框图:
流程图:
二、软件介绍
本次开发使用的软件是thonny,thonny是硬禾平台官方推荐的开发软件,页面简洁、使用方便,和STEP Pico板子搭配起来非常舒服,安装完即可上手,开始对于板子指令的编写。
三、硬件介绍
本次开发使用硬件为STEP Pico。STEP Pico是一款低成本,高性能的微控制器开发板,具有灵活数字接口,同时其还搭载了Raspberry Pi官方自主研发的RP2040微控制器芯片,与ARM Cortex M0+双核处理器,具有高达133MHz的运行频率。其专为嵌入式系统学习而设计,可以通过C/C++以及MicroPython的编程来学习嵌入式系统的工作原理和应用,小巧方便,功能多样。
三、实现功能及图片展示
实现的功能为测试反应速度
图片展示:
四、主要代码及代码介绍
import ws2812b
from oled import oled
from button import button
from board import pin_cfg
from machine import Pin
import random
import time
def print_result(msg):
print(msg)
oled.text(msg,0,0)
oled.show()
timer_start = 0
def k1_callback(Pin):
global timer_start
y.off()
r.off()
g.off()
b.off()
timer_reaction = time.ticks_ms() - timer_start
print_result(str(timer_reaction) + "ms")
k1 = button(pin_cfg.k1, k1_callback, trigger=Pin.IRQ_FALLING)
while True:
oled.fill(0)
r = Pin(pin_cfg.red_led, Pin.OUT)
y = Pin(pin_cfg.yellow_led, Pin.OUT)
g = Pin(pin_cfg.green_led, Pin.OUT)
b = Pin(pin_cfg.blue_led, Pin.OUT)
time.sleep(random.uniform(1,10))
light_led = random.uniform(0,4)
if light_led > 0 and light_led < 1:
y.on()
if light_led >= 1 and light_led < 2:
r.on()
if light_led >= 2 and light_led < 3:
g.on()
if light_led >= 3 and light_led < 4:
b.on()
timer_start = time.ticks_ms()
time.sleep(15)
import ws2812b
from oled import oled
from button import button
from board import pin_cfg
from machine import Pin
import random
import time
以上都是库,不做太多赘述
def print_result(msg): #显示函数
print(msg) #在PC上显示时间差
oled.text(msg,0,0) #编辑OLED屏上的文本,这里是时间差
oled.show() #OLED屏显示
上面这部分都是显示函数,用来进行时间差在PC屏幕上以及OLED屏幕上的显示
timer_start = 0
对起始时间变量进行初定义,无太多作用
def k1_callback(Pin): #k1按钮反馈函数
global timer_start #全局变量,联系起始时间变量
y.off() #将LED灯关闭
r.off()
g.off()
b.off()
timer_reaction = time.ticks_ms() - timer_start #再次对时间进行测量并计算时间差
print_result(str(timer_reaction) + "ms") #显示函数的运用
以上函数中还运用了time.ticks_ms()函数,这个函数能对当前时间进行测量,单位是毫秒级别,也就是说只要进行初始时间的测量与按下按钮这一刻时间的测量,便能通过差值得出你的反应速度
k1 = button(pin_cfg.k1, k1_callback, trigger=Pin.IRQ_FALLING)
对k1按下按钮的定义:运行k1按钮反馈函数,触发时刻为下降沿,也就是按下按钮的这一刻,不是松开按钮的那一刻。
while True:
oled.fill(0) #使得再次显示时间差时屏幕会重置
r = Pin(pin_cfg.red_led, Pin.OUT) #定义LED红灯开关函数
y = Pin(pin_cfg.yellow_led, Pin.OUT) #定义LED黄灯开关函数
g = Pin(pin_cfg.green_led, Pin.OUT) #定义LED绿灯开关函数
b = Pin(pin_cfg.blue_led, Pin.OUT) #定义LED蓝灯开关函数
time.sleep(random.uniform(1,10)) #随机时间后点亮LED灯,范围在1到10秒之间
light_led = random.uniform(0,4) #定义随机点亮LED灯变量,范围在0到4之间
if light_led > 0 and light_led < 1: #0到1区间黄灯亮
y.on()
if light_led >= 1 and light_led < 2: #1到2区间红灯亮
r.on()
if light_led >= 2 and light_led < 3: #2到3区间绿灯亮
g.on()
if light_led >= 3 and light_led < 4: #3到4区间蓝灯亮
b.on()
timer_start = time.ticks_ms() #对点亮LED灯时的时间进行测量并赋给起始时间变量,为后面计算时间差做准备
time.sleep(15) #每15秒循环一次
主函数区域,设定了何时亮灯,随机亮灯,为测量时间差做准备并设定了循环测试,另外用了random.uniform(i,j)的随机数函数,随机生成的数会在i与j之间,概率均匀分布
五、遇到的主要难题及解决办法
首先遇到的难题是如何搭建平台,如何对Pico板进行编程,这个难题在我看了硬禾平台的第一节直播课便迎刃而解,知道了thonny这个好用的编程软件,在下载安装完成后,摁住Pico板上的boot键并将USB接入PC即可完成平台搭建与对Pico板的识别,开始编程。
其次是如何了解完成项目所需的函数,获取进行项目所需思路。函数在进入到MicroPython的专用库介绍网页中即可了解,听硬禾平台的直播课与15节Micropython配套课程也可以进一步了解;思路的话在项目介绍中有所提示,直播课的老师也讲的面面俱到,我的担心很快消散。
最后就是在编程过程中的编译错误了,这个没办法,只能细心检查了,thonny软件在下面sheel中也有提示错误出在哪一行。我出现的错误有:
if结构没加:;
没把一些代码加入到if结构中,得在前面有四格空格;
库没添加。
六、未来的计划与建议
我计划在未来也多多学习硬禾平台的各种硬件练习项目,增长自己的经验,提高自己的能力与见识,多多上手一些额外技能。对于硬禾平台本身没有太多建议,各方面做得都很好,完成项目还能免除费用,鼓励学生去动手,是一个非常优秀的平台,感谢硬禾平台,让我多了一个寒假的难忘经历。