七、源與值(Source/Values)

學習目錄:樹莓派學習之路-GPIO Zero

官網地址: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()
相關文章
相關標籤/搜索