GPIO Zero库是一个用于处理GPIO引脚的Python库,旨在直观和“友好”,它简化了大多数常规Raspberry Pi用例的Python代码。
类
- class Button
class Button 继承于 DigitalInputDevice,代表一个简单的按钮或者开关
按钮的一端连接地线,另一端连接到任何GPIO引脚;或者按钮的一端连接3V3引脚,另一端连接任何GPIO引脚,然后在Button的初始化构造方法设置pull_up为False
构造方法参数
class gpiozero.Button(pin, *, pull_up=True, active_state=None, bounce_time=None, hold_time=1, hold_repeat=False, pin_factory=None)
- pin
- 参数类型:int或者string
- 表示按钮连接的GPIO引脚号码,引脚号参考 Broadcom
- 若设置为None,会抛 GPIODeviceError 异常
- pull_up
- 参数类型:bool或者None
- 表示使用内部电阻器上拉该引脚
- 设置为True(默认)时,上拉电阻将GPIO引脚设置为“高”,按钮另一端需连接地线
- 设置为Flase时,上拉电阻将GPIO引脚设置为“低”,按钮另一端需连接3V3引脚
- 设置为None时,GPIO引脚悬空,gpiozero无法猜测活动状态,必须设置active_state
- active_state
- 参数类型:bool或者None
- 设置为True时,当硬件引脚状态为“高”,软件显示引脚状态也为“高”
- 设置为False时,则输入的极性相反,当硬件引脚状态为“高”,软件显示引脚状态为“低”
- 当pull_up设置为None时,使用该参数设置未知的引脚活动状态
- 当pull_up设置为True或者False时,引脚的活动状态被将自动赋值
- bounce_time
- 参数类型:float
- 一般开关在大约20ms内信号不稳定,存在所谓的“开关抖动”
- 设置为None时,将不执行软件抖动补偿,否则该参数是组件在初始更改后忽略的时间长度(秒),默认1s
- hold_time
- 按下按钮后直到 when_held 执行前等待的时间(秒)
- hold_repeat
- 参数类型:bool
- 当设置为True时:每隔hold_repeat秒重复执行 when_held
- 当设置为False(默认)时:when_held 仅执行1次
- pin_factory
- Gpiozero库对很多GPIO相关功能进行了封装,但它自己并不实现GPIO口底层的操作,而是借由一些现有的库来实现,Pin Factory就是用来连接上层和底层库的。
- 默认情况下大部分Gpiozero库功能都是由RPi.GPIO库来实现的,可以通过Pin Factory来更改所使用的库,参考 Pin Factory
from gpiozero.pins.native import NativeFactory
from gpiozero import Device, LED
Device.pin_factory = NativeFactory()
# 方式一
# led1和led2 均替换为 NativePin
led1 = LED(16)
led2 = LED(17)
# 方式二
# led1使用 NativePin 替换 RPiGPIOPin
# led2使用 RPiGPIOPin
led1 = LED(16, pin_factory=my_factory)
led2 = LED(17)
GPIO PIN Broadcom
Pin Factory
Name | Factory class | Pin class |
rpigpio | gpiozero.pins.rpigpio.RPiGPIOFactory | gpiozero.pins.rpigpio.RPiGPIOPin |
rpio | gpiozero.pins.rpio.RPIOFactory | gpiozero.pins.rpio.RPIOPin |
pigpio | gpiozero.pins.pigpio.PiGPIOFactory | gpiozero.pins.pigpio.PiGPIOPin |
native | gpiozero.pins.native.NativeFactory | gpiozero.pins.native.NativePin |
方法
- wait_for_press(timeout=None)
- wait_for_release(timeout=None)
- when_held
- when_pressed
- when_released
属性
- held_time
- hold_repeat
- hold_time
- is_held
- is_pressed
- pin
- pull_up
- value
Button 方法
wait_for_press(timeout=None)
暂停脚本,等待按钮被按下,timeout为超时时间(s)
from gpiozero import Button
# 实现开关按下效果
button = Button(4)
button.wait_for_press()
wait_for_release(timeout=None)
暂停脚本,等待按钮被松开,timeout为超时时间(s)
from gpiozero import Button
# 开关按下
button.wait_for_press()
# 开关松开
button.wait_for_release()
when_held
当按钮按下后 hold_time 秒后触发的回调函数,为None则禁用事件
from gpiozero import Button
def btn_held(): # when_held 回调函数
print('button held')
button.when_held = btn_held # 注册按钮长按事件回调函数
when_pressed
当按钮按下时触发的回调函数,为None则禁用事件
from gpiozero import Button
def btn_pressed(): # when_pressed 回调函数
print('button pressed')
button.when_pressed = btn_pressed # 注册按钮按下事件回调函数
when_released
当按钮松开时触发的回调函数,为None则禁用事件
from gpiozero import Button
def btn_released(): # when_released 回调函数
print('button released')
button.when_released = btn_released # 注册按钮按下事件回调函数
Button 属性
held_time
从 when_held 触发开始按钮被持续按下的时间(秒)
hold_repeat
当设置为True时:每隔hold_repeat秒重复执行 when_held,当设置为False(默认)时:when_held 仅执行1次
hold_time
按下按钮后直到 when_held 执行前等待的时间(秒)
is_held
是否正被长按,如果该值为True,则说明按钮至少被按下 hold_time 秒
is_pressed
是否正被按下,按钮被按下该值为True,否则为False
pin
GPIO引脚编号
pull_up
内部电阻器上下拉设置,True为启用上拉,False启用下拉,None不启动上下拉
value
按钮被按下该值为1,否则为0