一、實驗要求
通過按鍵來控制LED燈的亮暗,所採用的按鍵爲四引腳按鍵。當按下按鍵時,LED會亮,當再次按下LED燈時,LED會熄滅。
二、實驗材料
- 按鍵1個(4引腳)
- LED燈1個
- 電阻1個
- 杜邦線若干
- 樹莓派4B、RPi.GPIO庫
三、實物連接
本次實驗的樹莓派GPIO採用BCM編號方式。按鍵的一個引腳與樹莓派4B的5號引腳連接,對角引腳接地。LED燈的正極與樹莓派4B的26號引腳連接。
四腳按鍵的底部圖如下所示:
這種開關的工作原理,其實和普通按鈕開關的工作原理差不多,由常開觸點、常閉觸點組合而成,在四腳按鍵開關中,常開觸點的作用,就是當壓力向常開觸點施壓時,這個電路就呈現接通狀態;當撤銷這種壓力的時候,就恢復到了原始的常閉觸點,也就是所謂的斷開。
上圖是接線圖,1、2 腳是一端,3、4腳是另一端,不同廠家標示不同。每當按下去一次,信號就發生一次跳變。未按下時只有兩組引腳連接,按下之後,四個引腳連接在一起。
四腳按鍵開關怎麼接線呢?根據經驗,一般只要對角就可以進行直接接線。
四、實驗代碼
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM) #引腳是BCM編號方式
GPIO.setup(5, GPIO.IN, pull_up_down=GPIO.PUD_UP) #在5號引腳處設置上拉電阻
GPIO.setup(26, GPIO.OUT)
GPIO.output(26, GPIO.LOW) #初始化,26號引腳設置爲低電平
ledStatus = 0 #led燈的初始狀態默認爲暗
try:
while True:
if (GPIO.input(5) == 0):
time.sleep(0.2) #開關去抖,忽略由於開關抖動引起的小於 200ms 的邊緣操作
print("button pressed!") #可用於觀測開關去抖效果,如果忽略開關抖動的話,理論上每按下一次開關會輸出一次button pressed!
ledStatus = not ledStatus
if ledStatus:
GPIO.output(26, GPIO.HIGH)
else:
GPIO.output(26, GPIO.LOW)
except KeyboardInterrupt:
GPIO.cleanup() #程序中止時清理GPIO資源
第5行代碼GPIO.setup(5, GPIO.IN, pull_up_down=GPIO.PUD_UP),是在5號引腳處設置上拉電阻。一般來是,凡是用上了4引腳按鍵開關,一般都要設置上拉電阻。第13行代碼time.sleep(0.2),主要作用開關去抖,忽略由於開關抖動引起的小於0.2s 的邊緣操作
本實驗的代碼還可以這樣寫:
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM) #引腳是BCM編號方式
GPIO.setup(5, GPIO.IN, pull_up_down=GPIO.PUD_UP) #在5號引腳處設置上拉電阻
GPIO.setup(26, GPIO.OUT)
GPIO.output(26, GPIO.LOW) #初始化,26號引腳設置爲低電平
ledStatus = 0 #led燈的初始狀態默認爲暗
def led(channel):
global ledStatus #ledStatus爲全局變量
print("button pressed!") #可用於觀測開關去抖效果,如果忽略開關抖動的話,理論上每按下一次開關會輸出一次button pressed!
ledStatus = not ledStatus
if ledStatus:
GPIO.output(26, GPIO.HIGH)
else:
GPIO.output(26, GPIO.LOW)
try:
GPIO.add_event_detect(5, GPIO.RISING, callback=led, bouncetime=200) #當檢測到有按鍵被按下時,回調led()函數
except KeyboardInterrupt:
GPIO.cleanup() #程序中止時清理GPIO資源
第20行代碼GPIO.add_event_detect(5, GPIO.RISING, callback=led, bouncetime=200) 是通過檢測5號引腳的電平有沒上升沿出現來確定有沒按鍵被按下;callback=led是指一旦檢測到按鍵被按下,立即執行回調函數led();bouncetime=200是指忽略由於開關抖動引起的小於200ms 的邊緣操作。
五、視頻演示