樹莓派的GPIO可以控制發光二極管,這是GPIO的Output(輸出)能力,它也具有input(讀取)的能力,所以才能叫做I/O(輸入/輸出)端口。今天我們就來用GPIO的引腳來讀取按鈕的狀態。
需要的材料
要完成本次實驗,我們需要如下的元器件。
- 開關按鈕,2腳或四腳都可以。
- 兩條跳線
- 面包板(可選,沒有面包板,需要把元器件直接連接,容易出問題)
- 樹莓派GPIO擴展組件(可選)
開關按鈕
在我們日常生活中,開關按鈕非常常見,每個電器的開關都是一個開關按鈕。今天我們用的按鈕如下圖:
平時按鈕的2個引腳是斷開的,當按鈕按下時,會連通2個引腳。四個引腳的按鈕原理一樣,只是兩邊的引腳是相通的,方便在電路中與其他元器件的連接。開關在電路圖中的符合較多,常見的如下:
其他元器件上一節講過,這里不再贅述。
所有器件的全家福如下:
讓我們按下面的電路把元器件連接起來。
把開關的一端引腳連到GPIO的GND(接地點),另一端連接到GPIO 27引腳。最終連接好后電路實物如下
電路好了,接下來我們編寫程序來讀取按鈕狀態。
讀取按鈕狀態的Python程序
我們先用gpiozero庫來讀取按鈕狀態,上一講提到過這個類庫對讀取按鈕狀態做了封裝,可以直接使用它的button類。在Thonny中新建一個python程序,代碼如下:
from gpiozero import Button #引入Button類
button = Button(27) #按鈕鏈接了GPIO27
button.wait_for_press() #等待按鈕被按下
print("你按了按鈕") #輸出語句
運行這個程序,當按鈕被按下時,可以看到在Thonny的輸出窗口打印出來“你按了按鈕”
這個程序在打印語句后就會退出,如果我們希望程序可以一直讀取按鈕狀態,需要加入while循環。我們修改代碼如下:
from gpiozero import Button #引入Button類
button = Button(27) #按鈕鏈接了GPIO27
while True:
button.wait_for_press()
print("你按了按鈕")
執行程序,然后按一下按鈕,你發現了什么?是不是和我們預想的不同?是的,你的程序打印了很多的“你按了按鈕”,而不是只有一個。
為什么會這樣呢?
這是因為計算機的世界里事情發生的非常快,當我們按下按鈕時,程序打印了“你按了按鈕”后會馬上回到while循環的第一句,也就是button.wait_for_press(),這僅需要幾毫秒的時間,此時,我們的按鈕還在被按下的狀態,不需要等待被按下,所以就會馬上執行下面的打印語句,然后繼續下一個循環。雖然我們按了一下很快放開了按鈕,但是按鈕被按下的時間可能有幾百毫秒,而每個循環只需要幾毫秒,循環被執行了多次,我們就看到了很多的”“你按了按鈕”。
那么如何實現我們按一次按鈕,打印一句“你按了按鈕”呢?我們可以加入一個等待語句,打印后稍等一下再進入下一個循環,此時按鈕應該已經彈起了。新程序如下:
from gpiozero import Button
from time import sleep
button = Button(27)
while True:
button.wait_for_press()
print("你按了按鈕")
sleep(0.3) #等待300毫秒,然后再進入下一次循環。
執行程序,我們可以看到每次按下,"你按了按鈕"只會打印一次。
如果我們再按幾次,每次都會打印一句"你按了按鈕",而不是每次打印非常多句了。
使用RPi.GPIO庫來讀取按鈕狀態
剛才我們用gpiozero來讀取按鈕狀態,語句容易理解,編寫程序也容易,如果我們換成RPi.GPIO庫應該怎么寫程序呢?
這就比較復雜了,當把GPIO引腳設置為輸入時,需要定義該引腳連接了上拉電阻還是下拉電阻,這2個概念對于孩子理解起來并不容易,可以簡單理解為上拉電阻是引腳通過電阻連接高電位,下拉電阻是引腳通過電阻連接低電位。在我們的電路中沒有接入電阻,但按原理應該算成是上拉電阻模式。最終的程序如下:
import RPi.GPIO as GPIO
from time import sleep
GPIO.setmode(GPIO.BCM)
GPIO.setup(27,GPIO.IN,pull_up_down=GPIO.PUD_UP) #設置GPIO27為上拉電阻模式的輸入
while True:
in_value = GPIO.input(27)
if in_value == False:
print("你按了按鈕")
sleep(0.3)
執行這個程序,可以得到和前面用gpiozero庫一樣的效果,只是理解起來更難一些而已。
好了,現在我們已經知道如何通過GPIO來讀取外部數據(按鈕狀態),也知道如何控制外部世界(發光二極管),接下來我們將用樹莓派制作一個具有實用價值的東西:紅綠燈。
-
發光二極管
+關注
關注
13文章
1213瀏覽量
67253 -
GPIO
+關注
關注
16文章
1270瀏覽量
53550 -
Output
+關注
關注
0文章
31瀏覽量
10690 -
面包板
+關注
關注
4文章
299瀏覽量
17983 -
樹莓派
+關注
關注
121文章
1936瀏覽量
106968
發布評論請先 登錄
采用單個ADC端口來讀取多個按鈕狀態的方法

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

GPIO的8種工作模式詳細介紹!

sunplus gpio使用

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

Windows IoT和Raspberry Pi:讀取按鈕

評論