樹莓派GPIO入門(二):按鍵控制LED燈的亮暗

一、實驗要求

通過按鍵來控制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 的邊緣操作。

五、視頻演示

 

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章