0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

用GPIO读取按钮状态

CHANBAEK 来源:和娃一起玩树莓派 作者:老孟K 2023-07-02 15:06 次阅读

树莓派的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

    文章

    1138

    浏览量

    65679
  • GPIO
    +关注

    关注

    16

    文章

    1133

    浏览量

    50570
  • Output
    +关注

    关注

    0

    文章

    31

    浏览量

    10415
  • 面包板
    +关注

    关注

    2

    文章

    296

    浏览量

    17432
  • 树莓派
    +关注

    关注

    113

    文章

    1639

    浏览量

    104741
收藏 人收藏

    评论

    相关推荐

    采用单个ADC端口来读取多个按钮状态的方法

    利用单片机的ADC端口,可以读取多个按钮状态。在设计过程中,需要综合考虑到按扭的个数与读取的可靠性,特别是对选择电阻的阻值进行优化,使得不同分压数值之间相差最大。
    的头像 发表于 10-07 15:19 1470次阅读
    采用单个ADC端口来<b class='flag-5'>读取</b>多个<b class='flag-5'>按钮</b><b class='flag-5'>状态</b>的方法

    Xcontrol 多状态选择按钮实现

    鼠标按下次数的累加,每次鼠标按下按钮一次则转换一次状态。详细可以参见程序框图。(7)最后添加选项名称的属性节点,分为“**读取.vi”和“**写入.vi”,还记得“状态.ctl”中
    发表于 08-28 19:24

    如何对GPIO IO口的状态进行读取

    如何对GPIO IO口的状态进行读取呢?有什么方法吗?
    发表于 01-25 07:16

    可以在读取SPI时使用GPIO控制吗?求解

    的是STM32F767II,CubeIDE,HAL驱动。我想在读取 SPI 时使用 GPIO 控制。我使用 SPI 大师。SPI Master 读操作在 MOSI 操作之后操作 MISO。
    发表于 12-12 07:42

    ESP8266几个GPIO引脚的状态,没有任何内容可以只读取状态的原因?

    对不起,这是一个非常基本的问题,但是编写代码是我的弱项。我需要做的就是在网站上显示来自 ESP8266 的几个 GPIO 引脚的状态。我发现有很多教程可以显示和更改 gpio,但没有任何内容可以只
    发表于 06-01 14:02

    基于按钮GPIO切换不起作用如何解决?

    使用 ESP8266 nodemcu 开发板。我已在此链接中购买了电路板。 我已经完成了切换 LED 的程序(连接到 GPIO0)。我已将开关连接到 GPIO5。我附上了我的c程序的word文档。我试着
    发表于 06-12 06:05

    DMA_读取GPIO电平到内存

    DMA_读取GPIO电平到内存,单片机程序
    发表于 01-12 18:19 10次下载

    树莓派GPIO入门04-使用按钮

    模式,并且默认拉到高电平。当某个按钮被按下,即联通GND端到GPIO口上,此时从GPIO口取到的状态为低电平。程序侦测到低电平时就认为按钮
    发表于 04-02 14:42 1212次阅读

    如何让1个GPIO控制2个LED显示出4种状态

    很多电子产品有状态指示灯,比如电视机: 待机状态亮红灯 开机状态亮绿灯 实现起来很简单,微控制器MCU的两个GPIO分别控制就行: 不过资源总是紧张的,有时候会碰到
    的头像 发表于 05-03 10:08 2561次阅读
    如何让1个<b class='flag-5'>GPIO</b>控制2个LED显示出4种<b class='flag-5'>状态</b>?

    基于hal库的stm32f411re的GPIO输出模式下电平的读取

    基于hal库的stm32f411re的GPIO输出模式下电平的读取1.硬件的配置对GPIO的参数配置首先需要创建一个结构体指针:GPIO_InitTypeDef
    发表于 11-29 16:06 5次下载
    基于hal库的stm32f411re的<b class='flag-5'>GPIO</b>输出模式下电平的<b class='flag-5'>读取</b>

    GPIO的8种工作模式详细介绍!

    :如图1所示,浮空输入模式#define GPIO_MODE_INPUT 0x00000000U / *!<输入浮动模式* /当GPIO采用浮空输入模式时,STM32的引脚状态是不确定的,此时STM32得到的电平
    发表于 11-30 13:36 9次下载
    <b class='flag-5'>GPIO</b>的8种工作模式详细介绍!

    sunplus gpio使用

    /d=1 RISCGPIO_E_SET(a,d)//设置IO口输入d=0/输出模式d=1如果没有上面的设置,直接使用下面函数是不对的。GPIO_O_SET(a,d)//设置IO口状态GPIO_I_GET(a) //
    发表于 12-20 19:08 5次下载
    sunplus <b class='flag-5'>gpio</b>使用

    APM32F072CBT6_GPIO问题_PB12无法正确读取外接的电平状态

    APM32F072CBT6_GPIO问题_PB12无法正确读取外接的电平状态
    发表于 11-09 21:04 2次下载
    APM32F072CBT6_<b class='flag-5'>GPIO</b>问题_PB12无法正确<b class='flag-5'>读取</b>外接的电平<b class='flag-5'>状态</b>

    如何使用GPIO引脚将按钮连接到Raspberry Pi

    电子发烧友网站提供《如何使用GPIO引脚将按钮连接到Raspberry Pi.zip》资料免费下载
    发表于 12-23 17:04 0次下载
    如何使用<b class='flag-5'>GPIO</b>引脚将<b class='flag-5'>按钮</b>连接到Raspberry Pi

    Windows IoT和Raspberry Pi:读取按钮

    电子发烧友网站提供《Windows IoT和Raspberry Pi:读取按钮.zip》资料免费下载
    发表于 07-10 11:13 0次下载
    Windows IoT和Raspberry Pi:<b class='flag-5'>读取</b><b class='flag-5'>按钮</b>