Programming paradigms for
physical computing and IoT
Ben Nuttall
Raspberry Pi Foundation
UK Charity 1129409
Slide 2
Slide 2 text
Ben Nuttall
●
Raspberry Pi Community Manager
●
Based in Cambridge
●
Creator of gpiozero python library and
piwheels project
●
Columnist on opensource.com
●
github.com/bennuttall
●
twitter.com/ben_nuttall
●
[email protected]
Slide 3
Slide 3 text
GPIO Pins – General Purpose
Input/Output
Slide 4
Slide 4 text
GPIO Zero: a friendly API for GPIO devices
from gpiozero import LED
led = LED(17)
led.on()
Slide 5
Slide 5 text
Multi-paradigm: procedural (polling)
from gpiozero import LED, Button
led = LED(17)
button = Button(4)
while True:
if button.is_pressed:
led.on()
else:
led.off()
Slide 6
Slide 6 text
Multi-paradigm: procedural (blocking)
from gpiozero import LED, Button
led = LED(17)
button = Button(4)
while True:
button.wait_for_press()
led.on()
button.wait_for_release()
led.off()
Slide 7
Slide 7 text
Multi-paradigm: event-driven
from gpiozero import LED, Button
led = LED(17)
button = Button(4)
button.when_pressed = led.on
button.when_released = led.off
Slide 8
Slide 8 text
Multi-paradigm: declarative
from gpiozero import LED, Button
led = LED(17)
button = Button(4)
led.source = button.values
Source tools
from gpiozero import Button, LED
from gpiozero.tools import all_values
button_a = Button(2)
button_b = Button(3)
led = LED(17)
led.source = all_values(button_a.values, button_b.values)
Slide 21
Slide 21 text
Cross-platform
●
Raspbian (Raspberry Pi)
●
Raspberry Pi Desktop x86 (PC)
●
Linux (PC)
●
Windows (PC)
●
Mac OS (Mac)
Slide 22
Slide 22 text
Supporting multiple back-ends
●
RPi.GPIO
●
Implemented in C, current default
●
RPIO
●
Implemented in C
●
pigpio
●
Python wrapper for C library, runs as daemon, remote pins
●
Native
●
Pure Python, limited functionality, experimental
●
MockPin & MockPWMPin
●
Pure Python, used in test suite
Slide 23
Slide 23 text
MockPin
$ GPIOZERO_PIN_FACTORY=mock python3
>>> from gpiozero import LED
>>> led = LED(22)
>>> led.blink()
>>> led.value
True
>>> led.value
False
pigpio - remote GPIO from Pi or PC
from gpiozero import LED
from gpiozero.pins.pigpio import PiGPIOFactory
factory = PiGPIOFactory('192.168.0.2')
led = LED(22, pin_factory=factory)
led.blink()
Slide 27
Slide 27 text
pigpio - remote GPIO from Pi or PC
$ PIGPIO_ADDR=192.168.0.2 python3 led.py
from gpiozero import LED
led = LED(22)
led.blink()
Slide 28
Slide 28 text
Raspberry Pi Desktop x86
Slide 29
Slide 29 text
Raspberry Pi Desktop x86 – Remote GPIO
Slide 30
Slide 30 text
Raspberry Pi Desktop x86 – GPIO
expander
Slide 31
Slide 31 text
Internal devices
●
TimeOfDay
●
PingServer
●
CPUTemperature
●
More coming soon
●
Make your own!
Slide 32
Slide 32 text
Energenie tortoise lamp
from gpiozero import Energenie, TimeOfDay
from datetime import time
lamp = Energenie(1)
daytime = TimeOfDay(time(9), time(18))
lamp.source = daytime.values
Slide 33
Slide 33 text
Is the internet working?
from gpiozero import LED, PingServer
from gpiozero.tools import negated
green = LED(17)
red = LED(18)
google = PingServer('google.com')
green.source = google.values
green.source_delay = 60
red.source = negated(green.values)
Slide 34
Slide 34 text
CPU Temperature
from gpiozero import LEDBarGraph, CPUTemperature
cpu = CPUTemperature(min_temp=50, max_temp=90)
leds = LEDBarGraph(2, 3, 4, 5, 6, 7, 8, pwm=True)
leds.source = cpu.values
Slide 35
Slide 35 text
Custom internal devices
from gpiozero import InternalDevice
class FileReader(InternalDevice):
@property
def value(self):
with open('value.txt') as f:
return int(f.read().strip())
Slide 36
Slide 36 text
Blue Dot
Slide 37
Slide 37 text
Multi-paradigm: procedural (polling)
from gpiozero import LED
from bluedot import BlueDot
led = LED(17)
bd = BlueDot()
while True:
if bd.is_pressed:
led.on()
else:
led.off()
Slide 38
Slide 38 text
Multi-paradigm: procedural (blocking)
from gpiozero import LED
from bluedot import BlueDot
led = LED(17)
bd = BlueDot()
while True:
bd.wait_for_press()
led.on()
bd.wait_for_release()
led.off()
Slide 39
Slide 39 text
Multi-paradigm: event-driven
from gpiozero import LED
from bluedot import BlueDot
led = LED(17)
bd = BlueDot()
bd.when_pressed = led.on
bd.when_released = led.off
Slide 40
Slide 40 text
Multi-paradigm: declarative
from gpiozero import LED
from bluedot import BlueDot
led = LED(17)
bd = BlueDot()
led.source = bd.values