官网地址:https://gpiozero.readthedocs.io/en/stable/source_values.htmlhtml
环境:UbuntuMeta-16.04编程
树莓派:3代B型dom
GPIO Zero提供了一种使用声明性编程范例将设备链接在一块儿的方法:将一个设备的值提供给另外一个设备,例如将按钮的值输入到LED中:函数
from gpiozero import LED, Button from signal import pause led = LED(17) button = Button(2) led.source = button.values pause()
这至关于:工具
from gpiozero import LED, Button from time import sleep led = LED(17) button = Button(2) while True: led.value = button.value sleep(0.01)
每一个设备都有一个value属性(设备的当前值)。 输入(Input)设备只能读取其值,但输出(Output)设备也能够设置其值以更改设备的状态:post
>>> led = PWMLED(17) >>> led.value # LED is initially off 0.0 >>> led.on() # LED is now on >>> led.value 1.0 >>> led.value = 0 # LED is now off
每一个设备一样都有一个值属性(一个生成器连续产生设备的当前值)。 全部输出设备都有一个source属性,能够设置为任何迭代器。 设备将迭代所提供的值,以source_delay属性中指定的速率将设备的值设置为每一个元素。学习
最多见的用法是将输出设备的源设置为输入设备的值,如上例所示。 一个更有趣的例子是控制LED亮度的电位器:url
from gpiozero import PWMLED, MCP3008 from signal import pause led = PWMLED(17) pot = MCP3008() led.source = pot.values pause()
也能够将输出设备的源设置为另外一个输出设备的值,以使它们匹配:spa
from gpiozero import LED, Button from signal import pause red = LED(14) green = LED(15) button = Button(17) red.source = button.values green.source = red.values pause()
设备的值也能够在传递到源以前进行处理: code
例如:
from gpiozero import Button, LED from signal import pause def opposite(values): for value in values: yield not value led = LED(4) btn = Button(17) led.source = opposite(btn.values) pause()
或者,能够使用自定义生成器来提供来自人工源的值:
例如:
from gpiozero import LED from random import randint from signal import pause def rand(): while True: yield randint(0, 1) led = LED(17) led.source = rand() pause()
若是迭代器一直迭代(即无限生成器),则元素将被处理,直到源被更改或设置为None。
若是迭代器是有限次的(例如列表),则一旦处理完全部元素(将设备的值保留在最终元素),就终止:
from gpiozero import LED from signal import pause led = LED(17) led.source = [1, 0, 1, 1, 1, 0, 0, 1, 0, 1] pause()
7.1. Composite devices(复合设备)
大多数设备的值范围介于0和1之间。某些设备的范围介于-1和1之间(例如Motor)。 复合设备的值是这些值的命名元组。 例如,Robot类:
>>> from gpiozero import Robot >>> robot = Robot(left=(14, 15), right=(17, 18)) >>> robot.value RobotValue(left_motor=0.0, right_motor=0.0) >>> tuple(robot.value) (0.0, 0.0) >>> robot.forward() >>> tuple(robot.value) (1.0, 1.0) >>> robot.backward() >>> tuple(robot.value) (-1.0, -1.0) >>> robot.value = (1, 1) # robot is now driven forwards
7.2. Source Tools(源工具)
GPIO Zero提供了一组用于处理源/值的现成函数,称为源工具。 这些是从gpiozero.tools导入的。
其中一些源工具是人工源,无需输入:
在此示例中,0到1之间的随机值传递给LED,使其产生闪烁的烛光效果:
from gpiozero import PWMLED from gpiozero.tools import random_values from signal import pause led = PWMLED(4) led.source = random_values() led.source_delay = 0.1 pause()
有些工具采用单一来源处理其值:
在此示例中,仅在未按下按钮时LED才会亮起:
from gpiozero import Button, LED from gpiozero.tools import negated from signal import pause led = LED(14) btn = Button(2) led.source = negated(btn.values) pause()
有些工具结合了多个来源的价值:
在此示例中,只有按下两个按钮(如AND门),LED才会亮起:
from gpiozero import Button, LED from gpiozero.tools import all_values from signal import pause button_a = Button(2) button_b = Button(3) led = LED(14) led.source = all_values(button_a.values, button_b.values) pause()