樹莓派的GPIO可以控制發(fā)光二極管,這是GPIO的Output(輸出)能力,它也具有input(讀?。┑哪芰?,所以才能叫做I/O(輸入/輸出)端口。今天我們就來(lái)用GPIO的引腳來(lái)讀取按鈕的狀態(tài)。
需要的材料
要完成本次實(shí)驗(yàn),我們需要如下的元器件。
- 開關(guān)按鈕,2腳或四腳都可以。
- 兩條跳線
- 面包板(可選,沒(méi)有面包板,需要把元器件直接連接,容易出問(wèn)題)
- 樹莓派GPIO擴(kuò)展組件(可選)
開關(guān)按鈕
在我們?nèi)粘I钪?,開關(guān)按鈕非常常見(jiàn),每個(gè)電器的開關(guān)都是一個(gè)開關(guān)按鈕。今天我們用的按鈕如下圖:
平時(shí)按鈕的2個(gè)引腳是斷開的,當(dāng)按鈕按下時(shí),會(huì)連通2個(gè)引腳。四個(gè)引腳的按鈕原理一樣,只是兩邊的引腳是相通的,方便在電路中與其他元器件的連接。開關(guān)在電路圖中的符合較多,常見(jiàn)的如下:

其他元器件上一節(jié)講過(guò),這里不再贅述。
所有器件的全家福如下:

讓我們按下面的電路把元器件連接起來(lái)。

把開關(guān)的一端引腳連到GPIO的GND(接地點(diǎn)),另一端連接到GPIO 27引腳。最終連接好后電路實(shí)物如下

電路好了,接下來(lái)我們編寫程序來(lái)讀取按鈕狀態(tài)。
讀取按鈕狀態(tài)的Python程序
我們先用gpiozero庫(kù)來(lái)讀取按鈕狀態(tài),上一講提到過(guò)這個(gè)類庫(kù)對(duì)讀取按鈕狀態(tài)做了封裝,可以直接使用它的button類。在Thonny中新建一個(gè)python程序,代碼如下:
from gpiozero import Button #引入Button類
button = Button(27) #按鈕鏈接了GPIO27
button.wait_for_press() #等待按鈕被按下
print("你按了按鈕") #輸出語(yǔ)句
運(yùn)行這個(gè)程序,當(dāng)按鈕被按下時(shí),可以看到在Thonny的輸出窗口打印出來(lái)“你按了按鈕”

這個(gè)程序在打印語(yǔ)句后就會(huì)退出,如果我們希望程序可以一直讀取按鈕狀態(tài),需要加入while循環(huán)。我們修改代碼如下:
from gpiozero import Button #引入Button類
button = Button(27) #按鈕鏈接了GPIO27
while True:
button.wait_for_press()
print("你按了按鈕")
執(zhí)行程序,然后按一下按鈕,你發(fā)現(xiàn)了什么?是不是和我們預(yù)想的不同?是的,你的程序打印了很多的“你按了按鈕”,而不是只有一個(gè)。

為什么會(huì)這樣呢?
這是因?yàn)橛?jì)算機(jī)的世界里事情發(fā)生的非???,當(dāng)我們按下按鈕時(shí),程序打印了“你按了按鈕”后會(huì)馬上回到while循環(huán)的第一句,也就是button.wait_for_press(),這僅需要幾毫秒的時(shí)間,此時(shí),我們的按鈕還在被按下的狀態(tài),不需要等待被按下,所以就會(huì)馬上執(zhí)行下面的打印語(yǔ)句,然后繼續(xù)下一個(gè)循環(huán)。雖然我們按了一下很快放開了按鈕,但是按鈕被按下的時(shí)間可能有幾百毫秒,而每個(gè)循環(huán)只需要幾毫秒,循環(huán)被執(zhí)行了多次,我們就看到了很多的”“你按了按鈕”。
那么如何實(shí)現(xiàn)我們按一次按鈕,打印一句“你按了按鈕”呢?我們可以加入一個(gè)等待語(yǔ)句,打印后稍等一下再進(jìn)入下一個(gè)循環(huán),此時(shí)按鈕應(yīng)該已經(jīng)彈起了。新程序如下:
from gpiozero import Button
from time import sleep
button = Button(27)
while True:
button.wait_for_press()
print("你按了按鈕")
sleep(0.3) #等待300毫秒,然后再進(jìn)入下一次循環(huán)。
執(zhí)行程序,我們可以看到每次按下,"你按了按鈕"只會(huì)打印一次。

如果我們?cè)侔磶状?,每次都?huì)打印一句"你按了按鈕",而不是每次打印非常多句了。
使用RPi.GPIO庫(kù)來(lái)讀取按鈕狀態(tài)
剛才我們用gpiozero來(lái)讀取按鈕狀態(tài),語(yǔ)句容易理解,編寫程序也容易,如果我們換成RPi.GPIO庫(kù)應(yīng)該怎么寫程序呢?
這就比較復(fù)雜了,當(dāng)把GPIO引腳設(shè)置為輸入時(shí),需要定義該引腳連接了上拉電阻還是下拉電阻,這2個(gè)概念對(duì)于孩子理解起來(lái)并不容易,可以簡(jiǎn)單理解為上拉電阻是引腳通過(guò)電阻連接高電位,下拉電阻是引腳通過(guò)電阻連接低電位。在我們的電路中沒(méi)有接入電阻,但按原理應(yīng)該算成是上拉電阻模式。最終的程序如下:
import RPi.GPIO as GPIO
from time import sleep
GPIO.setmode(GPIO.BCM)
GPIO.setup(27,GPIO.IN,pull_up_down=GPIO.PUD_UP) #設(shè)置GPIO27為上拉電阻模式的輸入
while True:
in_value = GPIO.input(27)
if in_value == False:
print("你按了按鈕")
sleep(0.3)
執(zhí)行這個(gè)程序,可以得到和前面用gpiozero庫(kù)一樣的效果,只是理解起來(lái)更難一些而已。
好了,現(xiàn)在我們已經(jīng)知道如何通過(guò)GPIO來(lái)讀取外部數(shù)據(jù)(按鈕狀態(tài)),也知道如何控制外部世界(發(fā)光二極管),接下來(lái)我們將用樹莓派制作一個(gè)具有實(shí)用價(jià)值的東西:紅綠燈。
-
發(fā)光二極管
+關(guān)注
關(guān)注
14文章
1250瀏覽量
69286 -
GPIO
+關(guān)注
關(guān)注
16文章
1333瀏覽量
56431 -
Output
+關(guān)注
關(guān)注
0文章
31瀏覽量
11056 -
面包板
+關(guān)注
關(guān)注
4文章
299瀏覽量
18900 -
樹莓派
+關(guān)注
關(guān)注
122文章
2082瀏覽量
110753
發(fā)布評(píng)論請(qǐng)先 登錄
采用單個(gè)ADC端口來(lái)讀取多個(gè)按鈕狀態(tài)的方法
可以在讀取SPI時(shí)使用GPIO控制嗎?求解
基于按鈕的GPIO切換不起作用如何解決?
樹莓派的gpio有什么用_怎么用
樹莓派GPIO入門04-使用按鈕
stm32 hal庫(kù)tim3觸發(fā)dma讀取gpio狀態(tài)
GPIO的8種工作模式詳細(xì)介紹!
sunplus gpio使用
APM32F072CBT6_GPIO問(wèn)題_PB12無(wú)法正確讀取外接的電平狀態(tài)
如何使用GPIO引腳將按鈕連接到Raspberry Pi
Windows IoT和Raspberry Pi:讀取按鈕
GPIO靜電放電防護(hù)方案
用GPIO讀取按鈕狀態(tài)
評(píng)論