AoboSir 博客

与15年前的我比,我现在是大人;与15年后的我比,我现在还是个婴儿

树莓派 Learning 003 — GPIO 003 中断模式 — 按键控制LED


我的树莓派型号:Raspberry Pi 2 Model B V1.1 装机系统:NOOBS v1.9.2


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# -*- coding:UTF-8 -*-

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)

GPIO.setup(24, GPIO.IN, pull_up_dwon=GPIO.PUD_DOWN)
GPIO.setup(25, GPIO.OUT)

ledStatus = True

def my_callback(channel):
    print("button pressed!")
    global ledStatus
    ledStatus = not ledStatus
    if ledStatus:
        GPIO.output(25, GPIO.HIGH)
        pass
    else:
        GPIO.output(25, GPIO.LOW)
        pass
    pass

GPIO.add_event_detect(24, GPIO.RISING, callback=my_callback)

while True:
    try:
        print("I'm working...")
        time.sleep(5)
        pass
    except KeyboardInterrupt:
        break
        pass
    pass

GPIO.cleanup()

代码讲解:

  • global ledStatushttp://c.biancheng.net/cpp/html/1827.html
  • GPIO.add_event_detect(24, GPIO.RISING, callback=my_callback) :给24引脚添加一个事件函数,触发条件是:捕获到上升沿(GPIO.RISING)。这个参数还可以是:GPIO.FALLING(下降沿)、GPIO.BOTH(两者都有)
  • except KeyboardInterrupt: 是用来捕获用户是否按了Ctrl + C 组合键。退出程序
  • GPIO.cleanup():之前都没有使用过这个函数。这个函数的功能是:jaingaobo所有的GPIO还原回初始输入状态。我们建议在使用RPi.GPIO模块的所有Python程序的最后,都写上这个函数。

现在这个程序我们来运行一下:

1
2
sudo chmod +x key_control_led_callback.py
python key_control_led_callback.py

现在的运行效果就已经很好的,即使我们上面写的程序脚本里面没有编写按键去抖的相关程序,并且我们也没有安装硬件去抖的电容。但是为了安全起见,我们还是应该摆去抖的程序给它加上。

对于中断模式的检测按键,我们给这种程序添加去抖程序,相当的简单,我们只需要将上面的程序中的这行语句:

1
GPIO.add_event_detect(24, GPIO.RISING, callback=my_callback)

修改为:

1
GPIO.add_event_detect(24, GPIO.RISING, callback=my_callback, bouncetime=200)

其中bouncetime=200 是延时200ms的意思。就是当检测到上升沿后,进入这个中断,要延时200ms才会执行这个中断里面的程序。

这就是软件去抖。


搞定


参考网站:https://sourceforge.net/p/raspberry-gpio-python/wiki/Inputs/

Comments