前面講了什么是流程圖,今天我們就利用流程圖來幫我們設(shè)計(jì)程序,看看如何在開始程序設(shè)計(jì)時,借助流程圖來幫我們梳理思路。
要讓程序設(shè)計(jì)變得好玩,就要做一些有用或者有意思的程序出來,今天我們就要設(shè)計(jì)一個反應(yīng)檢測器,讓兩個人在看到一個信號燈變化時盡快按下按鈕,由程序來判斷誰先按下,先按下的人獲得勝利。
用流程圖幫助梳理思路
要做這樣的反應(yīng)檢測器,大概的思路如下:
那么如何判斷誰先按下呢?
我們可以設(shè)置2個按鈕,比如左按鈕和右按鈕,那么流程圖可以改為:
結(jié)合前面樹莓派讀取按鈕的知識,當(dāng)左右兩個按鈕都綁定一個函數(shù),先按下的按鈕就會觸發(fā)該程序,把按鈕對象作為參數(shù)傳入該函數(shù),然后判斷該按鈕的引腳數(shù)對應(yīng)左按鈕還是右按鈕就可以判斷出來哪個先按下了,從而判斷輸贏。
那么新的流程圖應(yīng)該如下:
電路和需要的器材
思路理清了,我們就可以設(shè)計(jì)電路了,變化的信號燈可以用LED。所以器件列表如下:
電路設(shè)計(jì)圖如下:
最終連接好的電路如下
Python代碼
現(xiàn)在可以按設(shè)計(jì)好的電路,讓指示燈點(diǎn)亮隨機(jī)時間后熄滅,左右2人看到燈熄滅后馬上按下按鈕。然后由程序來決出勝負(fù)。
隨機(jī)時間由random庫的uniform函數(shù)來生成,它的用法如下:
uniform(x,y) #生成一個介于x和y之間的隨機(jī)浮點(diǎn)數(shù),x是最小值,y是最大值
比如我們要讓燈亮5到10秒之間,那么可以使用uniform(5,10)來獲取隨機(jī)數(shù),數(shù)值將是大于5,小于10的浮點(diǎn)數(shù)。
我們的程序代碼:
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秒之間的隨機(jī)數(shù)
yellow.off() #指示燈熄滅,玩家開始按鍵。
運(yùn)行上面的程序,當(dāng)黃燈熄滅時,2個玩家都按下按鈕,程序可以判斷出來是誰先按下了,但是這個程序有一個限制,每運(yùn)行一次就退出了,要再次比賽,則需要重新啟動程序。
我們嘗試修改一下程序,每次決出勝負(fù)后,可以馬上進(jìn)行下一輪比賽。把指示燈控制部分移到while循環(huán)里。新代碼如下:
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() #等待按鈕被按下,在按鈕按下前暫停此處
結(jié)果執(zhí)行后發(fā)現(xiàn)如下的比賽結(jié)果:
從程序輸出看,雖然可以通過輸出的先后順序判斷出是左邊的按鈕先按下,但是因?yàn)橛疫叺陌存I也差不多同時調(diào)用了btnPressed程序,也打印了右邊贏的信息,這顯然是應(yīng)該改進(jìn)的。
怎么改呢?
是不是可以加一個標(biāo)志變量呢?當(dāng)?shù)谝粋€按下的按鈕觸發(fā)了btnPressed函數(shù)后,下一個按鈕再次進(jìn)入時應(yīng)該看到這個標(biāo)志位,并且知道自己已經(jīng)輸了。流程圖應(yīng)該改為這樣
最終的程序如下:
from gpiozero import LED,Button
from time import sleep
from random import uniform
from os import _exit
yellow= LED(5) #黃燈鏈接了GPIO5
isWon = False # 標(biāo)志變量,第一個按下的按鈕會改變它為True
right = Button(17) #按鈕連接了GPIO17
left = Button(22) #左按鈕連接GPIO22
def btnPressed(button):
global isWon #使用全局變量isWon
if isWon == True: # 已經(jīng)被更新為True,表示自己按晚了
return #什么也不做,直接退出該函數(shù)
else:
isWon = True # 表示自己是贏家,把這個標(biāo)志位設(shè)為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()
運(yùn)行上面的代碼,可以每次循環(huán)進(jìn)行一次比賽,只有當(dāng)2個按鈕都按下,決出勝負(fù)后才會進(jìn)入下一個循環(huán)。從而實(shí)現(xiàn)了程序運(yùn)行時可以不斷進(jìn)行比賽的效果。
-
led
+關(guān)注
關(guān)注
242文章
23375瀏覽量
663387 -
檢測器
+關(guān)注
關(guān)注
1文章
870瀏覽量
47792 -
流程圖
+關(guān)注
關(guān)注
2文章
63瀏覽量
18797 -
GPIO
+關(guān)注
關(guān)注
16文章
1217瀏覽量
52411 -
樹莓派
+關(guān)注
關(guān)注
117文章
1710瀏覽量
105887
發(fā)布評論請先 登錄
相關(guān)推薦
樹莓派2接USB設(shè)備后沒有反應(yīng)是怎么回事?
如何快速入門樹莓派
快速反應(yīng)電子體溫計(jì)應(yīng)用方案
![<b class='flag-5'>快速反應(yīng)</b>電子體溫計(jì)應(yīng)用方案](https://file1.elecfans.com//web2/M00/A5/7F/wKgZomUMOLKAE7d5AAIJZgfpGII272.jpg)
快速反應(yīng)智能安全監(jiān)控系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
![<b class='flag-5'>快速反應(yīng)</b>智能安全監(jiān)控系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)](https://file1.elecfans.com//web2/M00/A5/D3/wKgZomUMOkiAYrfCAABgYYMCI1Q390.gif)
樹莓派的種類_樹莓派安裝教程
樹莓派3wifi配置_樹莓派3開啟wifi熱點(diǎn)_樹莓派3的wifi使用教程
樹莓派3硬件配置_樹莓派3都能裝什么系統(tǒng)_樹莓派3系統(tǒng)安裝教程
樹莓派用什么語言編程_樹莓派python編程詳解
樹莓派是什么樹莓派的簡單介紹
![<b class='flag-5'>樹莓</b><b class='flag-5'>派</b>是什么<b class='flag-5'>樹莓</b><b class='flag-5'>派</b>的簡單介紹](https://file.elecfans.com/web1/M00/91/DC/o4YBAFzbw0SAFINqAAIJSGdGQdQ187.png)
商鋪治安聯(lián)防快速反應(yīng)系統(tǒng)解決方案
![商鋪治安聯(lián)防<b class='flag-5'>快速反應(yīng)</b>系統(tǒng)解決方案](https://file.elecfans.com/web1/M00/C4/28/o4YBAF83QT2AYuhBAAFfvdr6apw042.png)
距離檢測報(bào)警使用樹莓派Pico
![距離<b class='flag-5'>檢測</b>報(bào)警使用<b class='flag-5'>樹莓</b><b class='flag-5'>派</b>Pico](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
ADL5308 快速反應(yīng) 188 dB范圍(10 PA至25 mA)對數(shù)轉(zhuǎn)換器數(shù)據(jù)表 ADL5308 快速反應(yīng) 188 dB范圍(10 PA至25 mA)對數(shù)轉(zhuǎn)換器數(shù)據(jù)表
![ADL5308 <b class='flag-5'>快速反應(yīng)</b> 188 dB范圍(10 PA至25 mA)對數(shù)轉(zhuǎn)換<b class='flag-5'>器</b>數(shù)據(jù)表 ADL5308 <b class='flag-5'>快速反應(yīng)</b> 188 dB范圍(10 PA至25 mA)對數(shù)轉(zhuǎn)換<b class='flag-5'>器</b>數(shù)據(jù)表](http://www.delux-kingway.cn/uploads/190218/2927106-1Z21P94211255.png)
評論