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