基于STEP Pico实现的反应测试器
基于STEP Pico制作的反应测试器,随机点亮ws2812b上的一个LED,在3-5s之间的随机时间过后灯熄灭,按下板上的一个按键,在显示屏上显示出从灯灭到按键之间的时间,也可以发送到上位机,显示出的时间可以反映测试者的反应速度
标签
嵌入式系统
显示
2023寒假在家练
马海畅
更新2023-03-29
北京理工大学
354

1 项目需求

随机点亮板上的一个LED,在3-5s之间的随机时间过后灯熄灭,按下板上的一个按键,在显示屏上显示出从灯灭到按键之间的时间,也可以发送到上位机,显示出的时间可以反映测试者的反应速度

2 实现思路

  • 通过随机数生成函数生成一定范围内的随机数作为延迟时间,通过随机整数生成函数生成1-12内的一个数确定一次测试ws2812b上要点亮的led灯
  • 通过获得时间函数分得到ws2812b上led灯灭和k1按键按下的时间,可以计算出两者的间隔时间即反应时间
  • 通过控制对应引脚上的电平输出来控制led灯带,用led灯带上不同颜色的led灯表示所处阶段,黄灯亮起表示正在测试,绿灯亮起表示测试结束
  • 通过按键k1控制反应时间的计算和显示,通过k2按键控制测试结束后下一次测试的开始

3 完成的功能

  • 测试开始时经过-5s之间的随机时间后随机点亮板上ws2812b灯带的一个LED,在3-5s之间的随机时间过后灯熄灭,按下板上的k1按键,计算并在显示屏上显示出从灯灭到按键之间的时间,同时将数据上传到上位机显示,测试结束后可以按下k2按键开始下一次测试。
  • 通过led灯带上不同颜色的led灯表示所处阶段,黄灯亮起表示正在测试,绿灯亮起表示测试结束

4 代码及说明

引入用到的库文件

import ws2812b

from oled import oled

from button import button

from board import pin_cfg

from machine import Pin

import time

import random

import led

结果打印函数,分别把结果在oled屏幕和上位机上显示

def print_result(msg): #结果打印

    print(msg,"ms")

    oled.fill(0)

    oled.text("your reaction",0,18)

    oled.text("time is",0,30)

    oled.text(str(msg),0,42)

    oled.text("ms",36,42)

    oled.show()

按钮k1对应引脚检测到下降沿时调用的函数,获取当前时间并与led灯熄灭时间相减计算反应时间,调用结果打印函数,熄灭黄色led灯,点亮绿色led灯

def k1_callback(pin):  #按钮k1调用函数

    global timer_start

    timer_reaction=time.ticks_ms()-timer_start #计算间隔时间

    print_result(timer_reaction) #调用结果打印函数

    y.off() #熄灭黄色led灯,点亮绿色led灯

    g.on()

    

k1=button(pin_cfg.k1,k1_callback,trigger=Pin.IRQ_FALLING) #设置k1的调用函数为k1_callback,下降沿触发

按钮k2对应引脚检测到上升沿时调用的函数,将开始标志置1,在下一次主循环时开始下一次测试

def k1_callback(pin):  #按钮k1调用函数

    global timer_start

    timer_reaction=time.ticks_ms()-timer_start #计算间隔时间

    print_result(timer_reaction) #调用结果打印函数

    y.off() #熄灭黄色led灯,点亮绿色led灯

    g.on()

    

k1=button(pin_cfg.k1,k1_callback,trigger=Pin.IRQ_FALLING) #设置k1的调用函数为k1_callback,下降沿触发

程序主循环,开始标志为1时开始测试,点亮黄色led灯,关闭绿色led灯。先进入准备阶段,oled显示ready,准备阶段随机持续3-5s。准备阶段结束后点亮ws2812上随机的led,oled显示start game,随机等待3-5s后熄灭同时记录当前时间,将开始标志置0

while True:

    if flag==1: #判断开始标志是否为1

        y.on() #led灯控制

        g.off()

        oled.fill(0) #oled显示

        oled.text("ready",0,32)

        oled.show()

        n=random.randint(1,12)

        time.sleep(random.uniform(3,5)) #在3-5间随机选取一个数作为暂停时间

        ws2812b.on(n, color="#ffffff") #点亮ws2812上随机的led

        oled.fill(0)

        oled.text("start game",0,32)

        oled.show()

        time.sleep(random.uniform(3,5))

        ws2812b.off(n)

        timer_start=time.ticks_ms()

        flag=0 #开始标志置0

5 软件流程图

图片1

6 达到的性能

实现了项目要求的基本功能,随机点亮板上的一个LED,在3-5s之间的随机时间过后灯熄灭,按下板上的一个按键,在显示屏上显示出从灯灭到按键之间的时间,也可以发送到上位机,显示出的时间可以反映测试者的反应速度。

7 实物功能展示

IMG20230322230319IMG20230322230323IMG20230322230326IMG20230322230336IMG20230322230344

8 遇到的主要问题

  • 对python语言的语法和用到的库不太熟悉,经过在网上查找相应资料后解决
  • 对控制板子上各模块的代码不太清楚,在学习电子森林平台提供的直播课并查看所给模块的封装文件和树莓派给出的数据手册后解决
  • 在点亮ws2812b上随机led灯的过程中不能点亮led灯并出现了报错,在查看对应代码和网上搜索资料后发现是随机数生成函数生成了小数,在改用随机整数生成函数后问题解决

9 未来的计划和建议

目前已经实现所要求的功能,随机点亮板上的一个LED,在3-5s之间的随机时间过后灯熄灭,按下板上的一个按键,在显示屏上显示出从灯灭到按键之间的时间,也可以发送到上位机,显示出的时间可以反映测试者的反应速度。

因为时间比较紧张,加上自己初次接触MicroPython方面的编程,只实现了最基本的功能,还有许多有趣的想法没有实施,如在测试开始时使蜂鸣器短暂鸣叫,采用使ws2812b上随机led变色进行测试,随机进行多次测试最后取平均值等。可以在之后将功能加以完善。

硬禾课堂的这次活动,让我这有机会使用MicroPython对单片机进行编程。相比于之前常用的C和C++,使用MicroPython进行编程是一种不一样的体验。这让我对C、C++和Python的不同有了更深的体会,也加深了我在单片机编程方面的兴趣,开拓了我的眼界,扩展了我的知识面。对于这次项目的要求功能,在我这段时间的学习努力下,完成了最基础的实现方式,但比较可惜的是还有一部分有趣的创意没有实现,留待日后加以完善。我在完成该项目和思考完善的创意的时候认识到自己当前在该领域的学习还有许多不足,需要更多更深的知识来支撑自己完成更好的创意。计划在未来学习更多的相关知识,对程序进行修改完善,来实现自己的一些创意和想法。

附件下载
reaction-game.py
团队介绍
北京理工大学
团队成员
马海畅
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号