吴忠躺衫网络科技有限公司

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

    文章

    23362

    瀏覽量

    663241
  • 檢測器
    +關注

    關注

    1

    文章

    869

    瀏覽量

    47787
  • 流程圖
    +關注

    關注

    2

    文章

    63

    瀏覽量

    18792
  • GPIO
    +關注

    關注

    16

    文章

    1216

    瀏覽量

    52391
  • 樹莓派
    +關注

    關注

    117

    文章

    1710

    瀏覽量

    105882
收藏 人收藏

    評論

    相關推薦

    樹莓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 ?1835次閱讀
    <b class='flag-5'>快速反應</b>電子體溫計應用方案

    快速反應智能安全監控系統的設計與實現

    摘  要: 設計了一套快速反應嵌入式智能安防監控系統,實現對運動目標的跟蹤、定位,快速捕獲人臉圖像。利
    發表于 01-05 13:43 ?753次閱讀
    <b class='flag-5'>快速反應</b>智能安全監控系統的設計與實現

    樹莓裝機教程

    樹莓裝機教程樹莓裝機教程樹莓裝機教程樹莓
    發表于 11-25 10:14 ?52次下載

    井下用定電位電解式CO檢測器對通風的反應特性

    井下用定電位電解式CO檢測器對通風的反應特性
    發表于 12-17 11:38 ?9次下載

    樹莓的種類_樹莓安裝教程

    樹莓(Raspberry Pi)是尺寸僅有信用卡大小的一個小型電腦,您可以將樹莓連接電視、顯示、鍵盤鼠標等設備使用。目前,
    發表于 11-27 22:01 ?5422次閱讀

    樹莓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.7w次閱讀

    樹莓用什么語言編程_樹莓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 ?1334次閱讀
    商鋪治安聯防<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>數據表
    大发888娱乐城官| 菲律宾百家乐官网排行| 皇冠代理网| 大发888娱乐场游戏| 布加迪百家乐的玩法技巧和规则 | 百家乐官网大路图| 牟定县| 太阳城网上娱乐| 易胜博娱乐| 名门国际娱乐| 大发娱乐| 百家乐好津乐汇| 百家乐赌场游戏平台| 百家乐赢家电子书| 百家乐游戏作弊| 百家乐在线赌场娱乐网规则| 免佣百家乐规则| 真人百家乐蓝盾娱乐平台| 百家乐是不是有技巧| 澳门百家乐庄闲和| 玩百家乐游戏的最高技巧| 不夜城百家乐的玩法技巧和规则| 亚洲百家乐的玩法技巧和规则 | 大发888娱乐城真钱游戏| 顶级赌场直营| 澳门葡京赌场图片| 金寨县| 百家乐官网麻关于博彩投注| 揭秘百家乐官网百分之50| 哪里有百家乐官网游戏下载| 百家乐官网策略网络游戏信誉怎么样 | 威尼斯人娱乐场骗人| 大发888虎牌官方下载| 二八杠绝技| 百家乐官网怎么才会赢| 保单百家乐官网游戏机厂家| 百家乐官网免费下| 24山向吉凶详解| 网络百家乐公式打法| 大发888出纳柜台 2014| 金盈娱乐|