高阶用法
以下示例演示了 GPIO Zero 库的部分功能。请注意,所有配方都是假设 Python 3 编写的。在 Python 2 下可能也能运行,但并不保证!
LED板 (LEDBoard)
您可以逐个遍历 LEDBoard 对象中的 LED:
from gpiozero import LEDBoard
from time import sleep
leds = LEDBoard(5, 6, 13, 19, 26)
for led in leds:
led.on()
sleep(1)
led.off()
LEDBoard 还支持索引。这意味着你可以使用 leds[i] 访问单个 LED 对象,其中 i 是一个从 0 到(不包括)LED 数量的整数:
from gpiozero import LEDBoard
from time import sleep
leds = LEDBoard(2, 3, 4, 5, 6, 7, 8, 9)
leds[0].on() # first led on
sleep(1)
leds[7].on() # last led on
sleep(1)
leds[-1].off() # last led off
sleep(1)
这也意味着您可以使用切片来访问 LED 的子集:
from gpiozero import LEDBoard
from time import sleep
leds = LEDBoard(2, 3, 4, 5, 6, 7, 8, 9)
for led in leds[3:]: # leds 3 and onward
led.on()
sleep(1)
leds.off()
for led in leds[:2]: # leds 0 and 1
led.on()
sleep(1)
leds.off()
for led in leds[::2]: # even leds (0, 2, 4...)
led.on()
sleep(1)
leds.off()
for led in leds[1::2]: # odd leds (1, 3, 5...)
led.on()
sleep(1)
leds.off()
在构建 LEDBoard 对象时,可以对其 LED 对象进行命名。这意味着可以通过名称访问各个 LED:
from gpiozero import LEDBoard
from time import sleep
leds = LEDBoard(red=2, green=3, blue=4)
leds.red.on()
sleep(1)
leds.green.on()
sleep(1)
leds.blue.on()
sleep(1)
LEDBoard 对象还可以嵌套在其他 LEDBoard 对象中:
from gpiozero import LEDBoard
from time import sleep
leds = LEDBoard(red=LEDBoard(top=2, bottom=3), green=LEDBoard(top=4, bottom=5))
leds.red.on() ## both reds on
sleep(1)
leds.green.on() # both greens on
sleep(1)
leds.off() # all off
sleep(1)
leds.red.top.on() # top red on
sleep(1)
leds.green.bottom.on() # bottom green on
sleep(1)
多字符7段显示屏
上一章演示的 7 段显示器通常有多字符版本(通常 4 个字符)。这种显示屏是多路复用的,即 LED 引脚通常与单字符显示屏相同,但所有字符共享。然后,每个字符都有自己的公共线路,该线路可以接地(在共阴极显示屏的情况下),以启用该特定字符。通过快速依次激活每个字符,可以使眼睛误以为同时显示了四个不同的字符。
在此类电路中,您不应试图将单个字符(在有小数点的情况下,可能有多达 8 个 LED 处于激活状态)的所有电流都汇入单个 GPIO。相反,应使用一些适当的晶体管(或类似元件,如光耦合器)将数字的阴极与地相连,并通过 GPIO 控制该元件。
该电路演示了一个 4 字符 7 段(实际上是 8 段,带小数点)显示屏,由 Pi 的 GPIO 控制,4 个 2N-3904 NPN 晶体管控制数字。
注意
强烈建议您查看特定多字符 7 段显示器的数据表。这些显示器的引脚输出差别很大,很可能与上面面包板上显示的不同。因此,下面提供了该电路的原理图,请根据您的显示器进行调整。
以下代码可用于在显示屏上滚动信息:
from itertools import cycle
from collections import deque
from gpiozero import LEDMultiCharDisplay
from signal import pause
display = LEDMultiCharDisplay(
LEDCharDisplay(22, 23, 24, 25, 21, 20, 16, dp=12), 26, 19, 13, 6)
def scroller(message, chars=4):
d = deque(maxlen=chars)
for c in cycle(message):
d.append(c)
if len(d) == chars:
yield ''.join(d)
display.source_delay = 0.2
display.source = scroller('GPIO 2ER0 ')
pause()