跳到主要内容

基本用法

以下示例演示了 GPIO Zero 库的部分功能。请注意,所有配方都是假设 Python 3 编写的。在 Python 2 下可能也能运行,但并不保证!

导入 GPIO Zero

在 Python 中,脚本中使用的库和函数必须在文件顶部按名称导入,Python 默认内置的函数除外。

例如,要使用 GPIO Zero 中的 Button 接口,必须明确导入:

from gpiozero import Button

现在 Button 可以直接在脚本中使用了:

button = Button(2)

或者,也可以导入整个 GPIO Zero 库:

import gpiozero

在这种情况下,对 GPIO Zero 中所有项目的引用都必须加上前缀:

button = gpiozero.Button(2)

引脚编号

该库的 GPIO 引脚使用 Broadcom (BCM) 引脚编号,而非物理 (BOARD) 编号。与 RPi.GPIO 库不同的是,它不可配置。不过,可以通过为引脚编号提供前缀来转换其他方案(见下文)。

下图中任何标有 GPIO 的引脚都可以用作引脚编号。例如,如果 LED 连接到 GPIO17,则应将引脚编号指定为 17,而不是 11

GPIO 引脚布局3V3PowerGPIO2SDA I²CGPIO3SCL I²CGPIO4GroundGPIO17GPIO27GPIO223V3PowerGPIO10SPI MOSIGPIO9SPI MISOGPIO11SPI SCLKGroundID SDI²C IDGPIO5GPIO6GPIO13GPIO19GPIO26Ground5VPower5VPowerGroundGPIO14UART0 TXDGPIO15UART0 RXDGPIO18GroundGPIO23GPIO24GroundGPIO25GPIO8SPI CE0GPIO7SPI CE1ID SCI²C IDGroundGPIO12GroundGPIO16GPIO20GPIO21All Models40-pinmodels only113579111315171921232527293133353739246810121416182022242628303234363840USB Ports

如果希望使用物理(BOARD)编号,则可将引脚编号指定为 BOARD11。如果您熟悉 wiringPi 引脚编号(另一种物理布局),可以使用 WPI0 来代替。最后,还可以将引脚指定为 header:number(头:编号),例如 J8:11 表示头 J8(现代 Pis 上的 GPIO 头)上的物理引脚 11。因此,以下几行都是等价的:

led = LED(17)
led = LED("GPIO17")
led = LED("BCM17")
led = LED("BOARD11")
led = LED("WPI0")
led = LED("J8:11")

请注意,这些备用方案只是转换。如果您在命令行上请求设备状态,相关引脚编号将始终以 Broadcom (BCM) 方案报告:

led = LED("BOARD11")
led
<gpiozero.LED object on pin GPIO17, active_high=True, is_active=False>

在本手册中,我们将按照上图所示的 Broadcom (BCM) 布局使用默认的整数引脚编号。

LED (LED)

LED 接线图Raspberry Pi Model 2 v1.1© Raspberry Pi 2014http://www.raspberrypi.orgPowerHDMIAudioUSB 2xUSB 2xETHERNETDSI (DISPLAY)CSI (CAMERA)GPIO

反复打开和关闭 LED

from gpiozero import LED
from time import sleep

red = LED(17)

while True:
red.on()
sleep(1)
red.off()
sleep(1)

或者

from gpiozero import LED
from signal import pause

red = LED(17)

red.blink()

pause()
提示

Python 脚本结束时会终止进程,GPIO 可能会被重置。请使用 signal.pause() 使脚本继续运行。更多信息,请参阅 如何保持脚本运行?

亮度可变的 LED

LED 接线图Raspberry Pi Model 2 v1.1© Raspberry Pi 2014http://www.raspberrypi.orgPowerHDMIAudioUSB 2xUSB 2xETHERNETDSI (DISPLAY)CSI (CAMERA)GPIO

任何普通 LED 都可以使用 PWM(脉宽调制)设置其亮度值。在 GPIO Zero 中,可以使用 PWMLED(亮度值在 0 和 1 之间)来实现这一功能:

from gpiozero import PWMLED
from time import sleep

led = PWMLED(17)

while True:
led.value = 0 # off
sleep(1)
led.value = 0.5 # half brightness
sleep(1)
led.value = 1 # full brightness
sleep(1)

与连续闪亮和熄灭类似,PWMLED 也可以脉冲(连续淡入淡出):

from gpiozero import PWMLED
from signal import pause

led = PWMLED(17)

led.pulse()

pause()

按钮 (Button)

Button 接线图Raspberry Pi Model 2 v1.1© Raspberry Pi 2014http://www.raspberrypi.orgPowerHDMIAudioUSB 2xUSB 2xETHERNETDSI (DISPLAY)CSI (CAMERA)GPIO

检查 Button 是否被按下:

from gpiozero import Button

button = Button(2)

while True:
if button.is_pressed:
print("Button is pressed")
else:
print("Button is not pressed")

等待按下按钮后再继续:

from gpiozero import Button

button = Button(2)

button.wait_for_press()
print("Button was pressed")

每次按下按钮都运行一个功能:

from gpiozero import Button
from signal import pause

def say_hello():
print("Hello!")

button = Button(2)

button.when_pressed = say_hello

pause()
提示

请注意,button.when_pressed = say_hello 这一行并不运行 say_hello 函数,而是创建一个指向按下按钮时要调用的函数的引用。意外使用 button.when_pressed = say_hello(),会将 when_pressed 操作设置为 None(该函数的返回值),这意味着按下按钮时什么也不会发生。

同样,按钮释放也可以附加功能:

from gpiozero import Button
from signal import pause

def say_hello():
print("Hello!")

def say_goodbye():
print("Goodbye!")

button = Button(2)

button.when_pressed = say_hello
button.when_released = say_goodbye

pause()

按钮 控制 LED

Button 控制 LED 接线图7115510101515202025253030AABBCCDDEEFFGGHHIIJJRaspberry Pi Model 2 v1.1© Raspberry Pi 2014http://www.raspberrypi.orgPowerHDMIAudioUSB 2xUSB 2xETHERNETDSI (DISPLAY)CSI (CAMERA)GPIO

按下 Button 时打开 LED

from gpiozero import LED, Button
from signal import pause

led = LED(17)
button = Button(2)

button.when_pressed = led.on
button.when_released = led.off

pause()

或者

from gpiozero import LED, Button
from signal import pause

led = LED(17)
button = Button(2)

led.source = button

pause()

按钮 控制 摄像头

使用 button.when_pressed = camera.capture 来触发 PiCamera 拍照是行不通的,因为 capture() 方法需要一个 输出 参数。不过,可以使用无需参数的自定义函数来实现:

from gpiozero import Button
from picamera import PiCamera
from datetime import datetime
from signal import pause

button = Button(2)
camera = PiCamera()

def capture():
camera.capture(f'/home/pi/{datetime.now():%Y-%m-%d-%H-%M-%S}.jpg')

button.when_pressed = capture

pause()

另一个例子是使用一个按钮来启动和停止摄像头预览,另一个按钮用来捕捉:

from gpiozero import Button
from picamera import PiCamera
from datetime import datetime
from signal import pause

left_button = Button(2)
right_button = Button(3)
camera = PiCamera()

def capture():
camera.capture(f'/home/pi/{datetime.now():%Y-%m-%d-%H-%M-%S}.jpg')

left_button.when_pressed = camera.start_preview
left_button.when_released = camera.stop_preview
right_button.when_pressed = capture

pause()

关机按钮

Button 类还提供了在按住按钮一定时间后运行函数的功能。本示例将在按住按钮 2 秒时关闭 Raspberry Pi:

from gpiozero import Button
from subprocess import check_call
from signal import pause

def shutdown():
check_call(['sudo', 'poweroff'])

shutdown_btn = Button(17, hold_time=2)
shutdown_btn.when_held = shutdown

pause()

LED板 (LEDBoard)

LED板 接线图7115510101515202025253030AABBCCDDEEFFGGHHIIJJRaspberry Pi Model 2 v1.1© Raspberry Pi 2014http://www.raspberrypi.orgPowerHDMIAudioUSB 2xUSB 2xETHERNETDSI (DISPLAY)CSI (CAMERA)GPIO

使用 LEDBoard 可以访问 LED 集合:

from gpiozero import LEDBoard
from time import sleep
from signal import pause

leds = LEDBoard(5, 6, 13, 19, 26)

leds.on()
sleep(1)
leds.off()
sleep(1)
leds.value = (1, 0, 1, 0, 1)
sleep(1)
leds.blink()

pause()

使用 pwm=TrueLEDBoard 可以控制每个 LED 的亮度:

from gpiozero import LEDBoard
from signal import pause

leds = LEDBoard(5, 6, 13, 19, 26, pwm=True)

leds.value = (0.2, 0.4, 0.6, 0.8, 1.0)

pause()

高级 LEDBoard 方案 中查看更多 LEDBoard 示例。

LED条形图 (LEDBarGraph)

LED条形图 接线图7115510101515202025253030AABBCCDDEEFFGGHHIIJJRaspberry Pi Model 2 v1.1© Raspberry Pi 2014http://www.raspberrypi.orgPowerHDMIAudioUSB 2xUSB 2xETHERNETDSI (DISPLAY)CSI (CAMERA)GPIO

使用 LEDBarGraph 可以像条形图一样处理 LED 集合:

from gpiozero import LEDBarGraph
from time import sleep

graph = LEDBarGraph(5, 6, 13, 19, 26, 20)

graph.value = 1 # (1, 1, 1, 1, 1, 1)
sleep(1)
graph.value = 1/2 # (1, 1, 1, 0, 0, 0)
sleep(1)
graph.value = -1/2 # (0, 0, 0, 1, 1, 1)
sleep(1)
graph.value = 1/4 # (1, 0, 0, 0, 0, 0)
sleep(1)
graph.value = -1 # (1, 1, 1, 1, 1, 1)
sleep(1)

由于 LED 只能在 pwm=False 时开启或关闭(默认值),因此数值基本上是四舍五入的。

不过,在 pwm=True 时使用 LEDBarGraph 可以使用 LED 亮度获得更精确的数值:

from gpiozero import LEDBarGraph
from time import sleep

graph = LEDBarGraph(5, 6, 13, 19, 26, pwm=True)

graph.value = 1/10 # (0.5, 0, 0, 0, 0)
sleep(1)
graph.value = 3/10 # (1, 0.5, 0, 0, 0)
sleep(1)
graph.value = -3/10 # (0, 0, 0, 0.5, 1)
sleep(1)
graph.value = 9/10 # (1, 1, 1, 1, 0.5)
sleep(1)
graph.value = 95/100 # (1, 1, 1, 1, 0.75)
sleep(1)

LED字符显示屏 (LEDCharDisplay)

LED字符显示屏 接线图7115510101515202025253030AABBCCDDEEFFGGHHIIJJRaspberry Pi Model 2 v1.1© Raspberry Pi 2014http://www.raspberrypi.orgPowerHDMIAudioUSB 2xUSB 2xETHERNETDSI (DISPLAY)CSI (CAMERA)