基于STEP Pico的嵌入式系统学习平台制作一个反应测试器
随机点亮板上的一个LED,按下板上的一个按键,在显示屏上显示出从灯亮到按键之间的时间。
标签
嵌入式系统
测试
显示
2023寒假在家练
轻描淡写
更新2023-03-29
北京理工大学
620

1 项目需求

随机点亮板上的一个LED,按下板上的一个按键,在显示屏上显示出从灯亮到按键之间的时间。

2 设计思路

  通过随机函数产生随机数,程序启动以后,在随机数控制的时间下点亮板上的LED,且点亮哪一个LED灯也由随机数控制。在灯随机亮起之后,被测试者需要凭自身反应按下按键,按下按键以后,处理器计算从点亮灯到接收到按键之间的时间差,并将时间差显示在在OLED屏幕上。

3 程序流程

FiIDcSdmmIr6qMRhB8gi3iLL49rl

4 实现过程展示

每一轮实验过程开始时,所有绿灯亮起并闪烁一秒,表示实验开始,提醒被测试者做好准备。

FpLHdR8Gbnwv_Kyz6JGlpiAdezdL

在绿灯熄灭后,经过随机一段时间,十二个LED中的随机一个会以黄灯形式短暂闪烁,被测试者需要在看到黄灯闪烁之后的本能反应时间内按下左侧按钮,以完成测试。

为了保证每次测试的随机性和准确性,每次黄灯亮起的位置和时间都是不同的,分别由两个随机数控制。如图,下为几次实验中黄灯亮起的位置。

FkHfF9xnJDQXPIpaOi1WCQZi6GRYFvqWY7Gx4UOVHWgEJNNkTIzgu3ZWFmUd5He-bE5-uX2DcGuisaauFGHq

在被测试者按下按钮时,内部的数据处理器会根据预先设置,计算按下按钮时刻与黄灯亮起时刻的差值,即可作为被测试者的反应时间,并将反应时间以毫秒为单位显示在OLED屏幕上。

FpMikj0EN6lhDsi2istTCHT5Vl-J

反应时间的显示即表示一轮实验结束。如想继续进行多次实验,只需稍微等待片刻,程序会自动重置,并开始新一轮实验。新一轮实验中,随着被测试者按下按钮,处理器会自动清除上次实验的数据,并将新的反应时间计算出来并显示在屏幕上。

5 代码实现

     wb.on_all("#00ff00")
     time.sleep(1)
     wb.off_all()

这是实验开始部分。在程序开始运行之后,12个LED灯以绿灯状态全部亮起,延时一秒后关闭,以此达到闪烁的效果,用以提醒被测试者集中注意力,准备实验。

 

 

     time.sleep(random.uniform(2,5))
     light_random = int(random.uniform(1,13))
     wb.on(light_random, "#ffff00")
     time.sleep(0.2)
     wb.off(light_random)

此处是两个随机数函数,第一个随机数函数用于控制黄灯亮起的时间,即在绿灯熄灭之后随机2至5秒内亮起。第二个随机函数用于控制黄灯亮起的位置。引入变量“light_random”,变量的值是先从1至13中取一个随机数,取整之后赋予的,即变量的值是1至12中的随机一个整数。该变量的值与12个LED灯一一对应,不同的值会导致不同位置的LED灯亮起,用于控制黄灯亮起的位置。黄灯亮起后延时0.2秒关闭,即短暂闪烁,为被测试者提供视觉信号。

末尾部分的代码用于记录时间,精确地记录黄灯亮起的时刻,为计算反应时间做准备。

 

 

def k1_callback(pin):
    global timer_start
    timer_reaction = time.ticks_ms() - timer_start
    print_result(str(timer_reaction) + "ms")
    
k1 = button(pin_cfg.k1, k1_callback, trigger=Pin.IRQ_FALLING)

该部分代码用于设定按钮以及计算反应时间。在被测试者按下按钮时,记录对应时刻,与起始时刻作差计算出反应时间,并赋予给输出,最终通过之后的输出代码显示在OLED屏幕上。

完整代码见最底部。

 

6 遇到的主要难题

本项目相对比较简单,主要难点在于如何使用随机函数控制黄灯亮起的时间和位置,以及如何调用按钮,编写合适的程序使得按钮能够完成相应的功能。最初进行试验时,我在编写按钮代码部分一直遭遇到瓶颈,测试过程中证明按钮功能和OLED屏幕显示的功能正常运作,但是在黄灯亮起之后按下按钮的同时,并没能像与其一样,在屏幕上显示反应时间。后来为了找到问题所在,我重新更加详细的学习了老师的课程相关部分,老师讲解的十分详细,也给出了相关的资源,有相关的帮助文档,深刻的学习之后,我对相关部分的代码有了更深的认识,了解了自己最初设计的代码问题所在,通过不断的设计和修改,最终顺利实现了预期功能。此外,随机数部分也因为程序设计的思路出现了一些失误,使用同一个随机函数来控制黄灯亮起的时间和位置,导致黄灯亮起的位置被限制在很小的一个范围内,降低了实验的准确性。后来调整思路,重新设计了程序结构,使用额外的随机数变量来控制黄灯亮起的位置,重新编写了代码,保证黄灯在十二个位置都有相等的可能亮起,增大了实验的随机程度。

7 未来规划

这次是我第一次尝试参加硬禾学堂的电子森林项目,由于缺乏经验选择了相对简单轻松的项目。在学习过程中我学到了许多有意义的知识,除了与项目相关的知识,也尝试了解并实践了老师拓展的部分。最终顺利完成了本次项目,并且在项目完成后尝试了许多额外的部分,发现对相关内容十分感兴趣,计划之后通过硬禾学堂了解更多相关方面的知识,也可能会选择更加困难一些的项目,锻炼自己的思维能力和动手能力,在不断思考和动手实践中提升自己。

8  完整代码

import ws2812b as wb
from oled import oled
from button import button
from board import pin_cfg

import time
from machine import Pin
import random


def print_result(msg):
    oled.text(msg,40,32)
    oled.show()
    
timer_start = 0

def k1_callback(pin):
    global timer_start
    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:
     wb.on_all("#00ff00")
     time.sleep(1)
     wb.off_all()
     time.sleep(random.uniform(2,5))
     light_random = int(random.uniform(1,13))
     wb.on(light_random, "#ffff00")
     time.sleep(0.2)
     wb.off(light_random)
     timer_start = time.ticks_ms()
     oled.fill(0)
     time.sleep(10)
附件下载
reaction.zip
主要代码文件"reaction",以及基础环境
团队介绍
本项目由个人制作,作者为北京理工大学学生,爱好学习新鲜有趣的知识
团队成员
轻描淡写
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号