Add source/values docs page, close #448

This commit is contained in:
Ben Nuttall
2016-10-09 21:19:27 +01:00
parent eaa6016ded
commit b0b0e379a6
17 changed files with 217 additions and 0 deletions

View File

@@ -0,0 +1,11 @@
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(17)
led.source = all_values(button_a.values, button_b.values)
pause()

View File

@@ -0,0 +1,12 @@
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()

View File

@@ -0,0 +1,7 @@
from gpiozero import LED
from signal import pause
led = LED(17)
led.source = [1, 0, 1, 1, 1, 0, 0, 1, 0, 1]
pause()

View File

@@ -0,0 +1,9 @@
from gpiozero import LED, Button
from signal import pause
led = LED(17)
button = Button(2)
led.source = button.values
pause()

View File

@@ -0,0 +1,7 @@
from gpiozero import LED, Button
led = LED(17)
button = Button(2)
while True:
led.value = button.value

View File

@@ -0,0 +1,11 @@
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()

9
docs/examples/negated.py Normal file
View File

@@ -0,0 +1,9 @@
from gpiozero import Button, LED
from gpiozero.tools import negated
from signal import pause
led = LED(4)
btn = Button(17)
led.source = negated(btn.values)
pause()

View File

@@ -0,0 +1,9 @@
from gpiozero import PWMLED, MCP3008
from signal import pause
led = PWMLED(17)
pot = MCP3008()
led.source = pot.values
pause()

View File

@@ -0,0 +1,8 @@
from gpiozero import PWMLED
from gpiozero.tools import random_values
from signal import pause
led = PWMLED(4)
led.source = random_values()
pause()

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
docs/images/source_tool.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -18,6 +18,7 @@ Table of Contents
api_tools
api_pins
api_exc
source_values
changelog
license

133
docs/source_values.rst Normal file
View File

@@ -0,0 +1,133 @@
=============
Source/Values
=============
.. currentmodule:: gpiozero
GPIO Zero provides a method of using the declarative programming paradigm to
connect devices together: feeding the values of one device into another, for
example the values of a button into an LED:
.. literalinclude:: examples/led_button.py
which is equivalent to:
.. literalinclude:: examples/led_button_loop.py
Every device has a ``.value`` property (the device's current value). Input
devices can only have their values read, but output devices can also have their
value set to alter the state of the device::
>>> 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
Every device also has a ``.values`` property (a generator continuously yielding
the device's current value). All output devices have a ``.source`` property
which can be set to any iterator. The device will iterate over the values
provided, setting the device's value to each element at a rate specified in the
``source_delay`` property.
.. image:: images/source_values.*
The most common use case for this is to set the source of an output device to
the values of an input device, like the example above. It is also possible to
set the source of an output device to the values of another output device (so
they match):
.. literalinclude:: examples/led_button.py
A more interesting example would be a potentiometer controlling the brightness
of an LED:
.. literalinclude:: examples/pwmled_pot.py
It is also possible to set an output device's ``source`` to the ``values`` of
another output device, to keep them matching:
.. literalinclude:: examples/matching_leds.py
The device's values can also be processed before they are passed to the
``source``:
.. image:: images/source_value_processing.*
For example:
.. literalinclude:: examples/custom_generator.py
Alternatively, a custom generator can be used to provide values from an
artificial source:
.. image:: images/custom_generator.*
For example:
.. literalinclude:: examples/custom_generator.py
If the iterator is infinite (i.e. an infinite generator), the elements will be
processed until the ``source`` is changed or set to ``None``.
If the iterator is finite (e.g. a list), this will terminate once all elements
are processed (leaving the device's value at the final element):
.. literalinclude:: examples/custom_generator_finite.py
Composite devices
-----------------
Most devices have a ``value`` range between 0 and 1. Some have a range between
-1 and 1 (e.g. ``Robot``). The ``value`` of a composite device is a namedtuple
of such values. For example::
>>> 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
Source Tools
------------
GPIO Zero provides a set of ready-made functions for dealing with source/values,
called source tools. These are available by importing from ``gpiozero.tools``.
Some of these source tools are artificial sources which require no input:
.. image:: images/source_tool.*
In this example, random values between 0 and 1 are passed to the LED, giving it
a flickering candle effect:
.. literalinclude:: examples/random_values.py
Some tools take a single source and process its values:
.. image:: images/source_tool_value_processor.*
In this example, the LED is lit only when the button is not pressed:
.. literalinclude:: examples/negated.py
Some tools combine the values of multiple sources:
.. image:: images/combining_sources.*
In this example, the LED is lit only if both buttons are pressed (like an `AND`_
gate):
.. _AND: https://en.wikipedia.org/wiki/AND_gate
.. literalinclude:: examples/combining_sources.py