官網地址: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()