0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

用GPIO讀取按鈕狀態(tài)

CHANBAEK ? 來源:和娃一起玩樹莓派 ? 作者:老孟K ? 2023-07-02 15:06 ? 次閱讀

樹莓派的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à)值的東西:紅綠燈。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 發(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
收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    采用單個(gè)ADC端口來讀取多個(gè)按鈕狀態(tài)的方法

    利用單片機(jī)的ADC端口,可以讀取多個(gè)按鈕狀態(tài)。在設(shè)計(jì)過程中,需要綜合考慮到按扭的個(gè)數(shù)與讀取的可靠性,特別是對(duì)選擇電阻的阻值進(jìn)行優(yōu)化,使得不同分壓數(shù)值之間相差最大。
    的頭像 發(fā)表于 10-07 15:19 ?4442次閱讀
    采用單個(gè)ADC端口來<b class='flag-5'>讀取</b>多個(gè)<b class='flag-5'>按鈕</b><b class='flag-5'>狀態(tài)</b>的方法

    如何對(duì)GPIO IO口的狀態(tài)進(jìn)行讀取

    如何對(duì)GPIO IO口的狀態(tài)進(jìn)行讀取呢?有什么方法嗎?
    發(fā)表于 01-25 07:16

    可以在讀取SPI時(shí)使用GPIO控制嗎?求解

    的是STM32F767II,CubeIDE,HAL驅(qū)動(dòng)。我想在讀取 SPI 時(shí)使用 GPIO 控制。我使用 SPI 大師。SPI Master 讀操作在 MOSI 操作之后操作 MISO。
    發(fā)表于 12-12 07:42

    ESP8266幾個(gè)GPIO引腳的狀態(tài),沒有任何內(nèi)容可以只讀取狀態(tài)的原因?

    對(duì)不起,這是一個(gè)非常基本的問題,但是編寫代碼是我的弱項(xiàng)。我需要做的就是在網(wǎng)站上顯示來自 ESP8266 的幾個(gè) GPIO 引腳的狀態(tài)。我發(fā)現(xiàn)有很多教程可以顯示和更改 gpio,但沒有任何內(nèi)容可以只
    發(fā)表于 06-01 14:02

    基于按鈕GPIO切換不起作用如何解決?

    使用 ESP8266 nodemcu 開發(fā)板。我已在此鏈接中購(gòu)買了電路板。 我已經(jīng)完成了切換 LED 的程序(連接到 GPIO0)。我已將開關(guān)連接到 GPIO5。我附上了我的c程序的word文檔。我試著
    發(fā)表于 06-12 06:05

    DMA_讀取GPIO電平到內(nèi)存

    DMA_讀取GPIO電平到內(nèi)存,單片機(jī)程序
    發(fā)表于 01-12 18:19 ?11次下載

    樹莓派的gpio有什么_怎么

    ),控制硬件工作(如LED、蜂鳴器等),讀取硬件的工作狀態(tài)信號(hào)(如中斷信號(hào))等。GPIO口的使用非常廣泛。掌握了GPIO,差不多相當(dāng)于掌握了操作硬件的能力。
    發(fā)表于 12-06 09:05 ?1.6w次閱讀

    樹莓派GPIO入門04-使用按鈕

    我們通過程序控制彩色LED發(fā)出不同顏色的光。這次我們3個(gè)按鈕來手動(dòng)控制彩色LED燈分別發(fā)出紅,綠,藍(lán)光并可以同時(shí)按下不同按鈕以顯示混合顏色的光。最終效果樹莓派GPIO
    發(fā)表于 04-02 14:42 ?1603次閱讀

    stm32 hal庫(kù)tim3觸發(fā)dma讀取gpio狀態(tài)

    眾所周知,GPIO不屬于外設(shè),屬于內(nèi)存233最近有個(gè)東東需要頻繁對(duì)IO口進(jìn)行讀取,雖然說可以定時(shí)器中斷,但是頻繁地進(jìn)入中斷會(huì)影響性能,于是DMA來處理。cube和keil的工程在下
    發(fā)表于 11-30 13:21 ?7次下載
    stm32 hal庫(kù)tim3觸發(fā)dma<b class='flag-5'>讀取</b><b class='flag-5'>gpio</b><b class='flag-5'>狀態(tài)</b>

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

    我們?cè)谟肧TM32這顆MCU的時(shí)候,的最多的也是最基礎(chǔ)的應(yīng)該就是GPIO外設(shè)了,而在STM32的HAL庫(kù)中GPIO有8種工作模式4種輸入狀態(tài),4種輸出
    發(fā)表于 11-30 13:36 ?9次下載
    <b class='flag-5'>GPIO</b>的8種工作模式詳細(xì)介紹!

    sunplus gpio使用

    RISCGPIO_E_SET(a,d)//設(shè)置IO口輸入d=0/輸出模式d=1如果沒有上面的設(shè)置,直接使用下面函數(shù)是不對(duì)的。GPIO_O_SET(a,d)//設(shè)置IO口狀態(tài)GPIO_I_GET(a) //
    發(fā)表于 12-20 19:08 ?5次下載
    sunplus <b class='flag-5'>gpio</b>使用

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

    APM32F072CBT6_GPIO問題_PB12無法正確讀取外接的電平狀態(tài)
    發(fā)表于 11-09 21:04 ?2次下載
    APM32F072CBT6_<b class='flag-5'>GPIO</b>問題_PB12無法正確<b class='flag-5'>讀取</b>外接的電平<b class='flag-5'>狀態(tài)</b>

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

    電子發(fā)燒友網(wǎng)站提供《如何使用GPIO引腳將按鈕連接到Raspberry Pi.zip》資料免費(fèi)下載
    發(fā)表于 12-23 17:04 ?0次下載
    如何使用<b class='flag-5'>GPIO</b>引腳將<b class='flag-5'>按鈕</b>連接到Raspberry Pi

    Windows IoT和Raspberry Pi:讀取按鈕

    電子發(fā)燒友網(wǎng)站提供《Windows IoT和Raspberry Pi:讀取按鈕.zip》資料免費(fèi)下載
    發(fā)表于 07-10 11:13 ?0次下載
    Windows IoT和Raspberry Pi:<b class='flag-5'>讀取</b><b class='flag-5'>按鈕</b>

    GPIO使用教程 GPIO接口應(yīng)用

    GPIO(General-Purpose Input/Output,通用輸入/輸出)接口是電子設(shè)備中的一個(gè)重要組成部分,主要用于控制和讀取設(shè)備的數(shù)字信號(hào)。它通過簡(jiǎn)單的高(1)或低(0)電平來與系統(tǒng)
    的頭像 發(fā)表于 01-31 10:10 ?2961次閱讀

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品