mirror of
				https://github.com/KevinMidboe/python-gpiozero.git
				synced 2025-10-29 17:50:37 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			392 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			392 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
================
 | 
						|
Recipes (Simple)
 | 
						|
================
 | 
						|
 | 
						|
.. currentmodule:: gpiozero
 | 
						|
 | 
						|
The following recipes demonstrate some of the capabilities of the GPIO Zero
 | 
						|
library. Please note that all recipes are written assuming Python 3. Recipes
 | 
						|
*may* work under Python 2, but no guarantees!
 | 
						|
 | 
						|
.. _pin-numbering:
 | 
						|
 | 
						|
Pin Numbering
 | 
						|
=============
 | 
						|
 | 
						|
This library uses Broadcom (BCM) pin numbering for the GPIO pins, as opposed
 | 
						|
to physical (BOARD) numbering. Unlike in the `RPi.GPIO`_ library, this is not
 | 
						|
configurable.
 | 
						|
 | 
						|
.. _RPi.GPIO: https://pypi.python.org/pypi/RPi.GPIO
 | 
						|
 | 
						|
Any pin marked "GPIO" in the diagram below can be used as a pin number.  For
 | 
						|
example, if an LED was attached to "GPIO17" you would specify the pin number as
 | 
						|
17 rather than 11:
 | 
						|
 | 
						|
.. image:: images/pin_layout.*
 | 
						|
 | 
						|
LED
 | 
						|
===
 | 
						|
 | 
						|
.. image:: images/led.*
 | 
						|
 | 
						|
Turn an :class:`LED` on and off repeatedly:
 | 
						|
 | 
						|
.. literalinclude:: examples/led_1.py
 | 
						|
 | 
						|
Alternatively:
 | 
						|
 | 
						|
.. literalinclude:: examples/led_2.py
 | 
						|
 | 
						|
.. note::
 | 
						|
 | 
						|
    Reaching the end of a Python script will terminate the process and GPIOs
 | 
						|
    may be reset. Keep your script alive with :func:`signal.pause`. See
 | 
						|
    :ref:`keep-your-script-running` for more information.
 | 
						|
 | 
						|
LED with variable brightness
 | 
						|
============================
 | 
						|
 | 
						|
Any regular LED can have its brightness value set using PWM
 | 
						|
(pulse-width-modulation). In GPIO Zero, this can be achieved using
 | 
						|
:class:`PWMLED` using values between 0 and 1:
 | 
						|
 | 
						|
.. literalinclude:: examples/led_variable_brightness.py
 | 
						|
 | 
						|
Similarly to blinking on and off continuously, a PWMLED can pulse (fade in and
 | 
						|
out continuously):
 | 
						|
 | 
						|
.. literalinclude:: examples/led_pulse.py
 | 
						|
 | 
						|
Button
 | 
						|
======
 | 
						|
 | 
						|
.. image:: images/button.*
 | 
						|
 | 
						|
Check if a :class:`Button` is pressed:
 | 
						|
 | 
						|
.. literalinclude:: examples/button_1.py
 | 
						|
 | 
						|
Wait for a button to be pressed before continuing:
 | 
						|
 | 
						|
.. literalinclude:: examples/button_2.py
 | 
						|
 | 
						|
Run a function every time the button is pressed:
 | 
						|
 | 
						|
.. literalinclude:: examples/button_3.py
 | 
						|
    :emphasize-lines: 9
 | 
						|
 | 
						|
.. note::
 | 
						|
 | 
						|
    Note that the line ``button.when_pressed = say_hello`` does not run the
 | 
						|
    function ``say_hello``, rather it creates a reference to the function to
 | 
						|
    be called when the button is pressed. Accidental use of
 | 
						|
    ``button.when_pressed = say_hello()`` would set the ``when_pressed`` action
 | 
						|
    to ``None`` (the return value of this function) which would mean nothing
 | 
						|
    happens when the button is pressed.
 | 
						|
 | 
						|
Similarly, functions can be attached to button releases:
 | 
						|
 | 
						|
.. literalinclude:: examples/button_4.py
 | 
						|
 | 
						|
Button controlled LED
 | 
						|
=====================
 | 
						|
 | 
						|
.. image:: images/led_button_bb.*
 | 
						|
 | 
						|
Turn on an :class:`LED` when a :class:`Button` is pressed:
 | 
						|
 | 
						|
.. literalinclude:: examples/button_led_1.py
 | 
						|
 | 
						|
Alternatively:
 | 
						|
 | 
						|
.. literalinclude:: examples/button_led_2.py
 | 
						|
 | 
						|
Button controlled camera
 | 
						|
========================
 | 
						|
 | 
						|
Using the button press to trigger :class:`~picamera.PiCamera` to take a picture
 | 
						|
using ``button.when_pressed = camera.capture`` would not work because the
 | 
						|
:meth:`~picamera.PiCamera.capture` method requires an ``output`` parameter.
 | 
						|
However, this can be achieved using a custom function which requires no
 | 
						|
parameters:
 | 
						|
 | 
						|
.. literalinclude:: examples/button_camera_1.py
 | 
						|
    :emphasize-lines: 9-11
 | 
						|
 | 
						|
Another example could use one button to start and stop the camera preview, and
 | 
						|
another to capture:
 | 
						|
 | 
						|
.. literalinclude:: examples/button_camera_2.py
 | 
						|
 | 
						|
Shutdown button
 | 
						|
===============
 | 
						|
 | 
						|
The :class:`Button` class also provides the ability to run a function when the
 | 
						|
button has been held for a given length of time. This example will shut down
 | 
						|
the Raspberry Pi when the button is held for 2 seconds:
 | 
						|
 | 
						|
.. literalinclude:: examples/button_shutdown.py
 | 
						|
 | 
						|
LEDBoard
 | 
						|
========
 | 
						|
 | 
						|
A collection of LEDs can be accessed using :class:`LEDBoard`:
 | 
						|
 | 
						|
.. literalinclude:: examples/led_board_1.py
 | 
						|
 | 
						|
Using :class:`LEDBoard` with ``pwm=True`` allows each LED's brightness to be
 | 
						|
controlled:
 | 
						|
 | 
						|
.. literalinclude:: examples/led_board_2.py
 | 
						|
 | 
						|
LEDBarGraph
 | 
						|
===========
 | 
						|
 | 
						|
A collection of LEDs can be treated like a bar graph using
 | 
						|
:class:`LEDBarGraph`:
 | 
						|
 | 
						|
.. literalinclude:: examples/led_bargraph_2.py
 | 
						|
 | 
						|
Note values are essentially rounded to account for the fact LEDs can only be on
 | 
						|
or off when ``pwm=False`` (the default).
 | 
						|
 | 
						|
However, using :class:`LEDBarGraph` with ``pwm=True`` allows more precise
 | 
						|
values using LED brightness:
 | 
						|
 | 
						|
.. literalinclude:: examples/led_bargraph_2.py
 | 
						|
 | 
						|
Traffic Lights
 | 
						|
==============
 | 
						|
 | 
						|
.. image:: images/traffic_lights_bb.*
 | 
						|
 | 
						|
A full traffic lights system.
 | 
						|
 | 
						|
Using a :class:`TrafficLights` kit like Pi-Stop:
 | 
						|
 | 
						|
.. literalinclude:: examples/traffic_lights_1.py
 | 
						|
 | 
						|
Alternatively:
 | 
						|
 | 
						|
.. literalinclude:: examples/traffic_lights_2.py
 | 
						|
 | 
						|
Using :class:`LED` components:
 | 
						|
 | 
						|
.. literalinclude:: examples/traffic_lights_3.py
 | 
						|
 | 
						|
Push button stop motion
 | 
						|
=======================
 | 
						|
 | 
						|
Capture a picture with the camera module every time a button is pressed:
 | 
						|
 | 
						|
.. literalinclude:: examples/button_stop_motion.py
 | 
						|
 | 
						|
See `Push Button Stop Motion`_ for a full resource.
 | 
						|
 | 
						|
Reaction Game
 | 
						|
=============
 | 
						|
 | 
						|
.. image:: images/reaction_game_bb.*
 | 
						|
 | 
						|
When you see the light come on, the first person to press their button wins!
 | 
						|
 | 
						|
.. literalinclude:: examples/reaction_game.py
 | 
						|
 | 
						|
See `Quick Reaction Game`_ for a full resource.
 | 
						|
 | 
						|
GPIO Music Box
 | 
						|
==============
 | 
						|
 | 
						|
Each button plays a different sound!
 | 
						|
 | 
						|
.. literalinclude:: examples/music_box.py
 | 
						|
 | 
						|
See `GPIO Music Box`_ for a full resource.
 | 
						|
 | 
						|
All on when pressed
 | 
						|
===================
 | 
						|
 | 
						|
While the button is pressed down, the buzzer and all the lights come on.
 | 
						|
 | 
						|
:class:`FishDish`:
 | 
						|
 | 
						|
.. literalinclude:: examples/all_on_1.py
 | 
						|
 | 
						|
Ryanteck :class:`TrafficHat`:
 | 
						|
 | 
						|
.. literalinclude:: examples/all_on_2.py
 | 
						|
 | 
						|
Using :class:`LED`, :class:`Buzzer`, and :class:`Button` components:
 | 
						|
 | 
						|
.. literalinclude:: examples/all_on_3.py
 | 
						|
 | 
						|
Full color LED
 | 
						|
==============
 | 
						|
 | 
						|
.. image:: images/rgb_led_bb.*
 | 
						|
 | 
						|
Making colours with an :class:`RGBLED`:
 | 
						|
 | 
						|
.. literalinclude:: examples/rgbled.py
 | 
						|
 | 
						|
Motion sensor
 | 
						|
=============
 | 
						|
 | 
						|
.. image:: images/motion_sensor_bb.*
 | 
						|
 | 
						|
Light an :class:`LED` when a :class:`MotionSensor` detects motion:
 | 
						|
 | 
						|
.. literalinclude:: examples/motion_sensor.py
 | 
						|
 | 
						|
Light sensor
 | 
						|
============
 | 
						|
 | 
						|
.. image:: images/light_sensor_bb.*
 | 
						|
 | 
						|
Have a :class:`LightSensor` detect light and dark:
 | 
						|
 | 
						|
.. literalinclude:: examples/light_sensor_1.py
 | 
						|
 | 
						|
Run a function when the light changes:
 | 
						|
 | 
						|
.. literalinclude:: examples/light_sensor_2.py
 | 
						|
 | 
						|
Or make a :class:`PWMLED` change brightness according to the detected light
 | 
						|
level:
 | 
						|
 | 
						|
.. literalinclude:: examples/light_sensor_3.py
 | 
						|
 | 
						|
Distance sensor
 | 
						|
===============
 | 
						|
 | 
						|
.. IMAGE TBD
 | 
						|
 | 
						|
Have a :class:`DistanceSensor` detect the distance to the nearest object:
 | 
						|
 | 
						|
.. literalinclude:: examples/distance_sensor_1.py
 | 
						|
 | 
						|
Run a function when something gets near the sensor:
 | 
						|
 | 
						|
.. literalinclude:: examples/distance_sensor_2.py
 | 
						|
 | 
						|
Motors
 | 
						|
======
 | 
						|
 | 
						|
.. image:: images/motor_bb.*
 | 
						|
 | 
						|
Spin a :class:`Motor` around forwards and backwards:
 | 
						|
 | 
						|
.. literalinclude:: examples/motor.py
 | 
						|
 | 
						|
Robot
 | 
						|
=====
 | 
						|
 | 
						|
.. IMAGE TBD
 | 
						|
 | 
						|
Make a :class:`Robot` drive around in (roughly) a square:
 | 
						|
 | 
						|
.. literalinclude:: examples/robot_1.py
 | 
						|
 | 
						|
Make a robot with a distance sensor that runs away when things get within
 | 
						|
20cm of it:
 | 
						|
 | 
						|
.. literalinclude:: examples/robot_2.py
 | 
						|
 | 
						|
Button controlled robot
 | 
						|
=======================
 | 
						|
 | 
						|
Use four GPIO buttons as forward/back/left/right controls for a robot:
 | 
						|
 | 
						|
.. literalinclude:: examples/robot_buttons_1.py
 | 
						|
 | 
						|
Keyboard controlled robot
 | 
						|
=========================
 | 
						|
 | 
						|
Use up/down/left/right keys to control a robot:
 | 
						|
 | 
						|
.. literalinclude:: examples/robot_keyboard_1.py
 | 
						|
 | 
						|
.. note::
 | 
						|
 | 
						|
    This recipe uses the standard :mod:`curses` module. This module requires
 | 
						|
    that Python is running in a terminal in order to work correctly, hence this
 | 
						|
    recipe will *not* work in environments like IDLE.
 | 
						|
 | 
						|
If you prefer a version that works under IDLE, the following recipe should
 | 
						|
suffice:
 | 
						|
 | 
						|
.. literalinclude:: examples/robot_keyboard_2.py
 | 
						|
 | 
						|
.. note::
 | 
						|
 | 
						|
    This recipe uses the third-party ``evdev`` module. Install this library
 | 
						|
    with ``sudo pip3 install evdev`` first. Be aware that ``evdev`` will only
 | 
						|
    work with local input devices; this recipe will *not* work over SSH.
 | 
						|
 | 
						|
Motion sensor robot
 | 
						|
===================
 | 
						|
 | 
						|
Make a robot drive forward when it detects motion:
 | 
						|
 | 
						|
.. literalinclude:: examples/robot_motion_1.py
 | 
						|
 | 
						|
Alternatively:
 | 
						|
 | 
						|
.. literalinclude:: examples/robot_motion_2.py
 | 
						|
 | 
						|
Potentiometer
 | 
						|
=============
 | 
						|
 | 
						|
.. image:: images/potentiometer_bb.*
 | 
						|
 | 
						|
Continually print the value of a potentiometer (values between 0 and 1)
 | 
						|
connected to a :class:`MCP3008` analog to digital converter:
 | 
						|
 | 
						|
.. literalinclude:: examples/pot_1.py
 | 
						|
 | 
						|
Present the value of a potentiometer on an LED bar graph using PWM to represent
 | 
						|
states that won't "fill" an LED:
 | 
						|
 | 
						|
.. literalinclude:: examples/pot_2.py
 | 
						|
 | 
						|
Measure temperature with an ADC
 | 
						|
===============================
 | 
						|
 | 
						|
.. IMAGE TBD
 | 
						|
 | 
						|
Wire a TMP36 temperature sensor to the first channel of an :class:`MCP3008`
 | 
						|
analog to digital converter:
 | 
						|
 | 
						|
.. literalinclude:: examples/thermometer.py
 | 
						|
 | 
						|
Full color LED controlled by 3 potentiometers
 | 
						|
=============================================
 | 
						|
 | 
						|
Wire up three potentiometers (for red, green and blue) and use each of their
 | 
						|
values to make up the colour of the LED:
 | 
						|
 | 
						|
.. literalinclude:: examples/rgbled_pot_1.py
 | 
						|
 | 
						|
Alternatively, the following example is identical, but uses the
 | 
						|
:attr:`~SourceMixin.source` property rather than a :keyword:`while` loop:
 | 
						|
 | 
						|
.. literalinclude:: examples/rgbled_pot_2.py
 | 
						|
    :emphasize-lines: 8
 | 
						|
 | 
						|
Please note the example above requires Python 3. In Python 2, :func:`zip`
 | 
						|
doesn't support lazy evaluation so the script will simply hang.
 | 
						|
 | 
						|
More recipes
 | 
						|
============
 | 
						|
 | 
						|
Continue to:
 | 
						|
 | 
						|
* :doc:`recipes_advanced`
 | 
						|
* :doc:`recipes_remote_gpio`
 | 
						|
 | 
						|
 | 
						|
.. _Push Button Stop Motion: https://www.raspberrypi.org/learning/quick-reaction-game/
 | 
						|
.. _Quick Reaction Game: https://www.raspberrypi.org/learning/quick-reaction-game/
 | 
						|
.. _GPIO Music Box: https://www.raspberrypi.org/learning/gpio-music-box/
 |