从RPi.GPIO移植
如果您熟悉 RPi.GPIO 库,就会习惯于编写处理引脚和引脚状态的代码。在本文档的示例中,您会发现我们通常使用的是 LED 和 Button,而不是输入引脚和输出引脚。
GPIO Zero 提供了代表设备的类,因此,与其说有一个引脚编号并告诉它高电平,不如说有一个 LED 并告诉它亮起来;与其说有一个引脚编号并询问它是高电平还是低电平,不如说有一个按钮并询问它是否按下。此外,GPIO Zero 没有模板代码,只需导入需要的部分即可。
GPIO Zero 提供了许多设备类,每个类都有专门针对该设备的特定方法和属性。例如,HC-SR04 距离传感器的功能可在 DistanceSensor 类中找到。
除了特定的设备类,我们还提供基类 InputDevice 和 OutputDevice。这些类与 RPi.GPIO 中对应类的一个主要区别是,它们是类而不是函数,这意味着您需要初始化一个类,并提供其引脚编号,但之后您再也不需要使用该引脚编号,因为它已被对象存储。
GPIO Zero 最初只是 RPi.GPIO 的顶层,但后来我们增加了对其他各种底层引脚库的支持。RPi.GPIO 目前是默认使用的引脚库。如需了解更多 信息,请参阅 更改引脚工厂。
输出设备
在 RPi.GPIO 中打开 LED:
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(2, GPIO.OUT)
GPIO.output(2, GPIO.HIGH)
在 GPIO Zero 中打开 LED:
from gpiozero import LED
led = LED(2)
led.on()
LED 类还通过 blink() 方法支持线程闪烁。
OutputDevice 是输出设备的基类,其使用方式与 RPi.GPIO 中的输出设备类似。
请查看支持的 输出设备 的完整列表。其他输出设备也有类似的属性和方法名称。基类的命名有共性,如 OutputDevice.is_active,在设备类中有别名,如 LED.is_lit。
输入设备
在 RPi.GPIO 中读取按下的按钮:
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(4, GPIO.IN, GPIO.PUD_UP)
if not GPIO.input(4):
print("button is pressed")
在 GPIO Zero 中读取按下的按钮:
from gpiozero import Button
btn = Button(4)
if btn.is_pressed:
print("button is pressed")
请注意,在 RPi.GPIO 示例中,按钮的设置选项是 GPIO.PUD_UP,意思是 "上拉",因此当按钮未按下时,引脚为高电平。当按钮被按下时,引脚变为低电平,因此需要否定条件(if not)。如果按钮配置为下拉,则逻辑相反,条件将变为 if GPIO.input(4):
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(4, GPIO.IN, GPIO.PUD_DOWN)
if GPIO.input(4):
print("button is pressed")
在 GPIO Zero 中,按钮的默认配置是上拉,但可以在初始化时进行配置,其余代码保持不变:
from gpiozero import Button
btn = Button(4, pull_up=False)
if btn.is_pressed:
print("button is pressed")
RPi.GPIO 还支持阻塞边缘检测。
在 RPi.GPIO 中 等待上拉按钮被按下:
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(4, GPIO.IN, GPIO.PUD_UP)
GPIO.wait_for_edge(4, GPIO.FALLING):
print("button was pressed")
GPIO Zero 中的等效值:
from gpiozero import Button
btn = Button(4)
btn.wait_for_press()
print("button was pressed")
同样,如果按钮被下拉,逻辑就会颠倒。我们不再等待下降沿,而是等待上升沿:
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(4, GPIO.IN, GPIO.PUD_UP)
GPIO.wait_for_edge(4, GPIO.FALLING):
print("button was pressed")
同样,在 GPIO Zero 中,唯一的区别在于初始化:
from gpiozero import Button
btn = Button(4, pull_up=False)
btn.wait_for_press()
print("button was pressed")
RPi.GPIO 具有线程回调功能。您需要创建一个函数(必须包含一个参数),并将其与引脚编号和边缘方向一起传递给 add_event_detect:
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
def pressed(pin):
print("button was pressed")
def released(pin):
print("button was released")
GPIO.setup(4, GPIO.IN, GPIO.PUD_UP)
GPIO.add_event_detect(4, GPIO.FALLING, pressed)
GPIO.add_event_detect(4, GPIO.RISING, released)
在 GPIO Zero 中,通过分配 when_pressed 和 when_released 属性,可以为这些操作设置回调:
from gpiozero import Button
def pressed():
print("button was pressed")
def released():
print("button was released")
btn = Button(4)
btn.when_pressed = pressed
btn.when_released = released
此外,还提供了 when_held