树莓派GPIO入门(二):按键控制LED灯的亮暗

一、实验要求

通过按键来控制LED灯的亮暗,所采用的按键为四引脚按键。当按下按键时,LED会亮,当再次按下LED灯时,LED会熄灭。

二、实验材料

  • 按键1个(4引脚)
  • LED灯1个
  • 电阻1个
  • 杜邦线若干
  • 树莓派4B、RPi.GPIO库

三、实物连接

树莓派GPIO入门(二):按键控制LED灯的亮暗_第1张图片

本次实验的树莓派GPIO采用BCM编号方式。按键的一个引脚与树莓派4B的5号引脚连接,对角引脚接地。LED灯的正极与树莓派4B的26号引脚连接。

四脚按键的底部图如下所示:

树莓派GPIO入门(二):按键控制LED灯的亮暗_第2张图片

这种开关的工作原理,其实和普通按钮开关的工作原理差不多,由常开触点、常闭触点组合而成,在四脚按键开关中,常开触点的作用,就是当压力向常开触点施压时,这个电路就呈现接通状态;当撤销这种压力的时候,就恢复到了原始的常闭触点,也就是所谓的断开。

树莓派GPIO入门(二):按键控制LED灯的亮暗_第3张图片

上图是接线图,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 的边缘操作。

五、视频演示

 

  

你可能感兴趣的:(树莓派)