樹莓派的GPIO可以控制發(fā)光二極管,這是GPIO的Output(輸出)能力,它也具有input(讀?。┑哪芰?,所以才能叫做I/O(輸入/輸出)端口。今天我們就來用GPIO的引腳來讀取按鈕的狀態(tài)。
需要的材料
要完成本次實(shí)驗(yàn),我們需要如下的元器件。
- 開關(guān)按鈕,2腳或四腳都可以。
- 兩條跳線
- 面包板(可選,沒有面包板,需要把元器件直接連接,容易出問題)
- 樹莓派GPIO擴(kuò)展組件(可選)
開關(guān)按鈕
在我們?nèi)粘I钪校_關(guān)按鈕非常常見,每個(gè)電器的開關(guān)都是一個(gè)開關(guān)按鈕。今天我們用的按鈕如下圖:
平時(shí)按鈕的2個(gè)引腳是斷開的,當(dāng)按鈕按下時(shí),會(huì)連通2個(gè)引腳。四個(gè)引腳的按鈕原理一樣,只是兩邊的引腳是相通的,方便在電路中與其他元器件的連接。開關(guān)在電路圖中的符合較多,常見的如下:
其他元器件上一節(jié)講過,這里不再贅述。
所有器件的全家福如下:
讓我們按下面的電路把元器件連接起來。
把開關(guān)的一端引腳連到GPIO的GND(接地點(diǎn)),另一端連接到GPIO 27引腳。最終連接好后電路實(shí)物如下
電路好了,接下來我們編寫程序來讀取按鈕狀態(tài)。
讀取按鈕狀態(tài)的Python程序
我們先用gpiozero庫(kù)來讀取按鈕狀態(tài),上一講提到過這個(gè)類庫(kù)對(duì)讀取按鈕狀態(tài)做了封裝,可以直接使用它的button類。在Thonny中新建一個(gè)python程序,代碼如下:
复制 from gpiozero import Button #引入Button類
button = Button(27) #按鈕鏈接了GPIO27
button.wait_for_press() #等待按鈕被按下
print("你按了按鈕") #輸出語句
運(yùn)行這個(gè)程序,當(dāng)按鈕被按下時(shí),可以看到在Thonny的輸出窗口打印出來“你按了按鈕”
這個(gè)程序在打印語句后就會(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í)行下面的打印語句,然后繼續(xù)下一個(gè)循環(huán)。雖然我們按了一下很快放開了按鈕,但是按鈕被按下的時(shí)間可能有幾百毫秒,而每個(gè)循環(huán)只需要幾毫秒,循環(huán)被執(zhí)行了多次,我們就看到了很多的”“你按了按鈕”。
那么如何實(shí)現(xiàn)我們按一次按鈕,打印一句“你按了按鈕”呢?我們可以加入一個(gè)等待語句,打印后稍等一下再進(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ù)來讀取按鈕狀態(tài)
剛才我們用gpiozero來讀取按鈕狀態(tài),語句容易理解,編寫程序也容易,如果我們換成RPi.GPIO庫(kù)應(yīng)該怎么寫程序呢?
這就比較復(fù)雜了,當(dāng)把GPIO引腳設(shè)置為輸入時(shí),需要定義該引腳連接了上拉電阻還是下拉電阻,這2個(gè)概念對(duì)于孩子理解起來并不容易,可以簡(jiǎn)單理解為上拉電阻是引腳通過電阻連接高電位,下拉電阻是引腳通過電阻連接低電位。在我們的電路中沒有接入電阻,但按原理應(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ù)一樣的效果,只是理解起來更難一些而已。
好了,現(xiàn)在我們已經(jīng)知道如何通過GPIO來讀取外部數(shù)據(jù)(按鈕狀態(tài)),也知道如何控制外部世界(發(fā)光二極管),接下來我們將用樹莓派制作一個(gè)具有實(shí)用價(jià)值的東西:紅綠燈。
-
發(fā)光二極管
+關(guān)注
關(guān)注
13文章
1214瀏覽量
67311 -
GPIO
+關(guān)注
關(guān)注
16文章
1276瀏覽量
53622 -
Output
+關(guān)注
關(guān)注
0文章
31瀏覽量
10703 -
面包板
+關(guān)注
關(guān)注
4文章
299瀏覽量
18014 -
樹莓派
+關(guān)注
關(guān)注
121文章
1954瀏覽量
107030
發(fā)布評(píng)論請(qǐng)先 登錄
采用單個(gè)ADC端口來讀取多個(gè)按鈕狀態(tài)的方法

可以在讀取SPI時(shí)使用GPIO控制嗎?求解
ESP8266幾個(gè)GPIO引腳的狀態(tài),沒有任何內(nèi)容可以只讀取狀態(tài)的原因?
基于按鈕的GPIO切換不起作用如何解決?
樹莓派的gpio有什么用_怎么用
樹莓派GPIO入門04-使用按鈕
stm32 hal庫(kù)tim3觸發(fā)dma讀取gpio狀態(tài)

GPIO的8種工作模式詳細(xì)介紹!

sunplus gpio使用

APM32F072CBT6_GPIO問題_PB12無法正確讀取外接的電平狀態(tài)

如何使用GPIO引腳將按鈕連接到Raspberry Pi

Windows IoT和Raspberry Pi:讀取按鈕

評(píng)論