• 7、源与值(Source/Values)


    学习目录:树莓派学习之路-GPIO Zero

    官网地址:https://gpiozero.readthedocs.io/en/stable/source_values.html

    环境:UbuntuMeta-16.04

    树莓派:3代B型

    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)设备也可以设置其值以更改设备的状态:

    >>> 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亮度的电位器:

    from gpiozero import PWMLED, MCP3008
    from signal import pause
    
    led = PWMLED(17)
    pot = MCP3008()
    
    led.source = pot.values
    
    pause()

     也可以将输出设备的源设置为另一个输出设备的值,以使它们匹配:

    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()

     设备的值也可以在传递到源之前进行处理: 

    例如:

    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()
  • 相关阅读:
    接口测试1: 常见接口协议介绍
    ERC223 GAS费窃取问题
    HTTP相关知识体系架构
    TCP/IP四层架构对应OSI七层架构图
    老项目移植ILRuntime经验总结
    奇怪的 C 风格继承写法
    P4207 [NOI2005] 月下柠檬树
    P3822 [NOI2017] 整数
    P4604 [WC2017]挑战
    三维凸包
  • 原文地址:https://www.cnblogs.com/little-kwy/p/9493075.html
Copyright © 2020-2023  润新知