python数字输入开关模块_使用 RPi.GPIO 模块的输入(Input)功能

html

更新日志:

2013 年 5 月 27 日更新:根据 2013 年 4 月 8 日更新的官方文档完成了初步翻译。

本文会在适当的时间里进行增删改等操做,若是您对该文感兴趣,能够仅收藏本页。

本文连接:使用 RPi.GPIO 模块的输入功能python

这篇日志的内容应该算是《RPi.GPIO 模块使用基础》Input 部分的扩展讲解,详细讲解了 Input 部分的一些高级应用技巧。

目前有几种途径能够在您的程序中得到 GPIO 的输入信息。第一种也是最简易的一种为在某个时间点检查输入值。这便是所谓的“轮询(polling)”,并且若是您的程序在错误的时间里进行了读取,可能会错过某个输入值。在循环中运用轮询,有可能使处理器资源紧张。另外一种对 GPIO 输入进行响应的方式可使用“中断(interruots)”(边缘检测(edge detection))。边缘能够是从 HIGH 到 LOW 的过分(降低临界值(falling edge))或从 LOW 到 HIGH 的过分(上升临界值(rising edge))。

函数

上拉/下拉电阻

若是您在输入针脚上没有链接任何元件,那么它将是“浮动(float)”的。换句话说,由于您没有链接任何元件,在按下按钮或开关以前,读取的值是没有意义的。因为电源的波动,获取到的值可能会有很大的变化。测试

为了解决这个问题,咱们须要使用上拉/下拉电阻。这样,咱们就可设定输入的默认值了。在这里,可使用硬件或软件对电阻进行上拉/下拉。使用硬件方式,将一个 10K 的电阻链接在输入通道与 3.3V(上拉)或 0V(下拉)之间是经常使用的作法。而 RPi.GPIO 也容许您经过软件的方式对配置 Broadcom SOC 来达到目的:网站

GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_UP)或者

GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)(通道编号是基于您所使用的编号系统所指定的(BOARD 或 BCM)。)

输入测试(轮询(polling))

您能够在某个时间点得到一次输入的快照:google

if GPIO.input(channel):

print('Input was HIGH')

else:

print('Input was LOW')在循环中等待按钮被按下后进行轮询:

while GPIO.input(channel)==GPIO.LOW:

time.sleep(0.01) # 为 CPU 留出 10 毫秒,供其处理其它事物(这里假设为当按下按钮时,输入状态从 LOW 到 HIGH)

中断和边检检测

边缘的定义为电信号从 LOW 到 HIGH(上升临界值)或从 HIGH 到 LOW(降低临界值)状态的改变。正常状况下,对于输入的值来讲,咱们更关心的是输入的状态是否发生了改变。这种状态上的改变是很重要的。spa

为了不您的程序在忙于处理其它的事物时而错过了您按下按钮的操做,这里有两种方法能够解决:.net

wait_for_edge() 函数

event_detected() 函数

在检测到边缘时执行线程回调函数

wait_for_edge() 函数

wait_for_edge() 函数被设计用于在检测到边缘以前阻止程序的运行。换句话说,上面的示例中,等待按钮被按下的语句能够改写为:线程

GPIO.wait_for_edge(channel, GPIO.RISING)注意,您能够输入 GPIO.RISING、GPIO.FALLING、GPIO.BOTH 对边缘进行检测。这种方式的优势是占用 CPU 资源不多,所以系统能够有充裕的资源处理其它事物。

event_detected() 函数

event_detected() 函数被设计用于循环中有其它东西时使用,但不一样于轮询的是,它不会错过当 CPU 忙于处理其它事物时输入状态的改变。这在相似使用 Pygame 或 PyQt 时主循环实时监听和响应 GUI 的事件是颇有用的。翻译

GPIO.add_event_detect(channel, GPIO.RISING) # 在通道上添加上升临界值检测

do_something()

if GPIO.event_detected(channel):

print('Button pressed')注意,您能够输入 GPIO.RISING、GPIO.FALLING、GPIO.BOTH 对边缘进行检测。

线程回调

RPi.GPIO 在第二条线程中执行回调函数。这意味着回调函数能够同您的主程序同时运行,而且能够当即对边缘进行响应。例如:

def my_callback(channel):

print('这是一个边缘事件回调函数!')

print('在通道 %s 上进行边缘检测'%channel)

print('该程序与您的主程序运行在不一样的进程中')

GPIO.add_event_detect(channel, GPIO.RISING, callback=my_callback) # 在通道上添加上升临界值检测

... 其它程序代码 ...若是您须要多个回调函数:

def my_callback_one(channel):

print('回调 1')

def my_callback_two(channel):

print('回调 2')

GPIO.add_event_detect(channel, GPIO.RISING)

GPIO.add_event_callback(channel, my_callback_one)

GPIO.add_event_callback(channel, my_callback_two)注意,在该示例中,回调函数为顺序运行而不是同时运行。这是由于当前只有一个进程供回调使用,而回调的运行顺序是依据它们被定义的顺序。

开关防抖

您可能会注意到,每次按钮按下时,回调操做被调用不止一次。这种现象被称做“开关抖动(switch bounce)”。这里有两种方法解决开关抖动问题:

将一个 0.1uF 的电容链接到开关上。

软件防止抖动

两种方式一块儿用

使用软件方式抖动,能够在您指定的回调函数中添加 bouncetime= 参数。

抖动时间须要使用毫秒为单位进行书写。例如:

# 在通道上添加上升临界值检测,忽略因为开关抖动引发的小于 200ms 的边缘操做

GPIO.add_event_detect(channel, GPIO.RISING, callback=my_callback, bouncetime=200)或者

GPIO.add_event_callback(channel, my_callback, bouncetime=200)

remove_event_detect()

因为某种缘由,您不但愿您的程序检测边缘事件,您能够将它中止:

GPIO.remove_event_detect(channel)

相关网站

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值