0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

树莓派快速反应检测器设计

CHANBAEK 来源:和娃一起玩树莓派 作者:老孟K 2023-07-02 15:12 次阅读

前面讲了什么是流程图,今天我们就利用流程图来帮我们设计程序,看看如何在开始程序设计时,借助流程图来帮我们梳理思路。

要让程序设计变得好玩,就要做一些有用或者有意思的程序出来,今天我们就要设计一个反应检测器,让两个人在看到一个信号灯变化时尽快按下按钮,由程序来判断谁先按下,先按下的人获得胜利。

用流程图帮助梳理思路

要做这样的反应检测器,大概的思路如下:

图片

那么如何判断谁先按下呢?

我们可以设置2个按钮,比如左按钮和右按钮,那么流程图可以改为:

图片

结合前面树莓派读取按钮的知识,当左右两个按钮都绑定一个函数,先按下的按钮就会触发该程序,把按钮对象作为参数传入该函数,然后判断该按钮的引脚数对应左按钮还是右按钮就可以判断出来哪个先按下了,从而判断输赢。

那么新的流程图应该如下:

图片

电路和需要的器材

思路理清了,我们就可以设计电路了,变化的信号灯可以用LED。所以器件列表如下:

  • 一个LED,颜色不限
  • 一个1K欧姆电阻,配合LED使用。
  • 两个按钮。
  • 若干跳线,用于连接器
  • 面包板,可选,推荐使用
  • GPIO扩展板,可选,推荐使用

电路设计图如下:

图片

最终连接好的电路如下

图片

Python代码

现在可以按设计好的电路,让指示灯点亮随机时间后熄灭,左右2人看到灯熄灭后马上按下按钮。然后由程序来决出胜负。

随机时间由random库的uniform函数来生成,它的用法如下:

uniform(x,y)  #生成一个介于xy之间的随机浮点数,x是最小值,y是最大值

比如我们要让灯亮5到10秒之间,那么可以使用uniform(5,10)来获取随机数,数值将是大于5,小于10的浮点数。

我们的程序代码

from gpiozero import LED,Button


from time import sleep
from random import uniform
from os import _exit



yellow= LED(5)   #黄灯链接了GPIO5


right = Button(17) #右按钮连接了GPIO17
left = Button(22)  #左按钮连接GPIO22


def btnPressed(button):
    btnpin = button.pin.number  #读取按下的引脚编号
    print("pressed: "+str(btnpin))
    if btnpin == 17:   #是否为右引脚
        print("右边按钮被先按下,右边赢!")
    else:
        print("左边按钮被先按下,左边赢!")
    _exit(0)      #退出程序




right.when_pressed = btnPressed
left.when_pressed = btnPressed
yellow.on()   #黄灯亮
sleep(uniform(5,10))   # 等待5-10秒之间的随机数
yellow.off()   #指示灯熄灭,玩家开始按键。

运行上面的程序,当黄灯熄灭时,2个玩家都按下按钮,程序可以判断出来是谁先按下了,但是这个程序有一个限制,每运行一次就退出了,要再次比赛,则需要重新启动程序。

我们尝试修改一下程序,每次决出胜负后,可以马上进行下一轮比赛。把指示灯控制部分移到while循环里。新代码如下:

from gpiozero import LED,Button


from time import sleep
from random import uniform
from os import _exit
   
yellow= LED(5)   #黄灯链接了GPIO5


right = Button(17) #按钮连接了GPIO17
left = Button(22)


def btnPressed(button):
    btnpin = button.pin.number
    print("pressed: "+str(btnpin))
    if btnpin == 17:
        print("右边按钮被先按下,右边赢!")
    else:
        print("左边按钮被先按下,左边赢!")


right.when_pressed = btnPressed
left.when_pressed = btnPressed
while True:
    yellow.on()
    sleep(uniform(5,10))
    yellow.off()
    print("waiting")
    left.wait_for_press()    #等待按钮被按下,在按钮按下前暂停此处
    right.wait_for_press()  #等待按钮被按下,在按钮按下前暂停此处

结果执行后发现如下的比赛结果:

图片

从程序输出看,虽然可以通过输出的先后顺序判断出是左边的按钮先按下,但是因为右边的按键也差不多同时调用了btnPressed程序,也打印了右边赢的信息,这显然是应该改进的。

怎么改呢?

是不是可以加一个标志变量呢?当第一个按下的按钮触发了btnPressed函数后,下一个按钮再次进入时应该看到这个标志位,并且知道自己已经输了。流程图应该改为这样

图片

最终的程序如下:

from gpiozero import LED,Button


from time import sleep
from random import uniform
from os import _exit

yellow= LED(5)   #黄灯链接了GPIO5


isWon = False   # 标志变量,第一个按下的按钮会改变它为True


right = Button(17) #按钮连接了GPIO17
left = Button(22)  #左按钮连接GPIO22


def btnPressed(button):
    global isWon      #使用全局变量isWon
    if isWon == True:  # 已经被更新为True,表示自己按晚了
        return       #什么也不做,直接退出该函数
    else:
        isWon = True    # 表示自己是赢家,把这个标志位设为True 
    btnpin = button.pin.number   #读取按下的引脚编号
    print("pressed: "+str(btnpin))
    if btnpin == 17:
        print("右边按钮被先按下,右边赢!")
    else:
        print("左边按钮被先按下,左边赢!")


right.when_pressed = btnPressed
left.when_pressed = btnPressed


while True:
    isWon  = False
    yellow.on()
    sleep(uniform(5,10))
    yellow.off()
    print("waiting")
    left.wait_for_press()
    right.wait_for_press()

运行上面的代码,可以每次循环进行一次比赛,只有当2个按钮都按下,决出胜负后才会进入下一个循环。从而实现了程序运行时可以不断进行比赛的效果。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • led
    led
    +关注

    关注

    242

    文章

    23252

    浏览量

    660572
  • 检测器
    +关注

    关注

    1

    文章

    863

    浏览量

    47676
  • 流程图
    +关注

    关注

    2

    文章

    63

    浏览量

    18737
  • GPIO
    +关注

    关注

    16

    文章

    1204

    浏览量

    52052
  • 树莓派
    +关注

    关注

    116

    文章

    1706

    浏览量

    105607
收藏 人收藏

    评论

    相关推荐

    树莓2接USB设备后没有反应是怎么回事?

    不存在,开udevadm监控,也没有反应) B公司产品,直接插入,可以检测到。 情况二,接一个USBHUB: USBHUB接入到树莓2的USB口,有
    发表于 07-19 05:56

    如何快速入门树莓

    树莓的简单入门默认的账号和密码Raspberry PiCentOS 7Ubuntu开启ssh连接方式一创建空白的ssh文件方式二1.SSH服务安装检查树莓SSH服务是否开启SSH服
    发表于 02-23 06:58

    快速反应电子体温计应用方案

    快速反应电子体温计应用方案  传统测量体温的方法是使用水银体温计,由于水银温度计破损后会导致有害重金属外泄不利于环保,甚至对人体产生伤害,电子体温计
    发表于 03-09 11:31 1809次阅读
    <b class='flag-5'>快速反应</b>电子体温计应用方案

    快速反应智能安全监控系统的设计与实现

    摘  要: 设计了一套快速反应嵌入式智能安防监控系统,实现对运动目标的跟踪、定位,快速捕获人脸图像。利
    发表于 01-05 13:43 743次阅读
    <b class='flag-5'>快速反应</b>智能安全监控系统的设计与实现

    树莓装机教程

    树莓装机教程树莓装机教程树莓装机教程树莓
    发表于 11-25 10:14 52次下载

    井下用定电位电解式CO检测器对通风的反应特性

    井下用定电位电解式CO检测器对通风的反应特性
    发表于 12-17 11:38 9次下载

    树莓的种类_树莓安装教程

    树莓(Raspberry Pi)是尺寸仅有信用卡大小的一个小型电脑,您可以将树莓连接电视、显示、键盘鼠标等设备使用。目前,
    发表于 11-27 22:01 5386次阅读

    树莓3wifi配置_树莓3开启wifi热点_树莓3的wifi使用教程

    树莓3在2016年2月29号正式发布了,树莓3几乎和树莓2代板型一致,大外观没什么变化小电
    发表于 12-08 11:47 3.1w次阅读

    树莓3硬件配置_树莓3都能装什么系统_树莓3系统安装教程

    树莓3一直颇受电子发烧友的青睐,这篇文章主要讨论的就是树莓3的硬件配置、树莓3都能装什么系
    发表于 12-08 14:36 2.6w次阅读

    树莓用什么语言编程_树莓python编程详解

    树莓是一个非常廉价的、只有手掌大小的完全可编程的计算机。虽然树莓的体积小,但是它的潜力无限。你可以像使用常规台式计算机一样在树莓派上创建
    发表于 01-15 17:00 3.9w次阅读

    树莓怎么用

    连接树莓和电脑.用网线直连电脑,不经过路由。这个方法最大的特点用最少的工具玩树莓
    的头像 发表于 11-07 16:21 2.4w次阅读

    树莓是什么树莓的简单介绍

    要想玩转树莓,首先得知道树莓是什么。在本节中,作者将带领大家揭开树莓的神秘面纱,了解
    发表于 05-15 18:09 30次下载
    <b class='flag-5'>树莓</b><b class='flag-5'>派</b>是什么<b class='flag-5'>树莓</b><b class='flag-5'>派</b>的简单介绍

    商铺治安联防快速反应系统解决方案

    针对沿街商铺这块,目前简单的监控防范已不能够满足当前治安状况的需要,社会急需一套能覆盖城市每个角落尤其是沿街商铺的治安联防快速反应系统,来预警每个角落所发生的紧急事情,从而全面掌控社会治安状况,维护社会大局稳定。
    发表于 08-15 10:02 1309次阅读
    商铺治安联防<b class='flag-5'>快速反应</b>系统解决方案

    距离检测报警使用树莓Pico

    电子发烧友网站提供《距离检测报警使用树莓Pico.zip》资料免费下载
    发表于 11-09 11:49 0次下载
    距离<b class='flag-5'>检测</b>报警使用<b class='flag-5'>树莓</b><b class='flag-5'>派</b>Pico

    ADL5308 快速反应 188 dB范围(10 PA至25 mA)对数转换数据表 ADL5308 快速反应 188 dB范围(10 PA至25 mA)对数转换数据表

    电子发烧友网为你提供ADI(ADI)ADL5308 快速反应 188 dB范围(10 PA至25 mA)对数转换数据表相关产品参数、数据手册,更有ADL5308 快速反应 188 dB范围(10
    发表于 10-07 17:52
    ADL5308 <b class='flag-5'>快速反应</b> 188 dB范围(10 PA至25 mA)对数转换<b class='flag-5'>器</b>数据表 ADL5308 <b class='flag-5'>快速反应</b> 188 dB范围(10 PA至25 mA)对数转换<b class='flag-5'>器</b>数据表