Slide 1

Slide 1 text

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

Slide 9

Slide 9 text

GPIO Zero supports...

Slide 10

Slide 10 text

GPIO Zero Device Hierarchy!

Slide 11

Slide 11 text

.value >>> led = PWMLED(17) >>> led.value 0.0 >>> led.on() >>> led.value 1.0 >>> led.value = 0

Slide 12

Slide 12 text

.value >>> led = PWMLED(17) >>> pot = MCP3008() >>> led.value 0.0 >>> pot.value 0.510145879738202 >>> led.value = pot.value

Slide 13

Slide 13 text

.value >>> while True: ... led.value = pot.value

Slide 14

Slide 14 text

Source / Values Output Device .value .values .source Input Device .value .values

Slide 15

Slide 15 text

Source / Values Output Device .value .values .source Input Device .value .values

Slide 16

Slide 16 text

Source / Values from gpiozero import LED, Button led = LED(17) button = Button(2) led.source = button.values

Slide 17

Slide 17 text

Processing values Output Device .value .values .source Input Device .value .values function

Slide 18

Slide 18 text

Source tools from gpiozero import Button, LED from gpiozero.tools import negated led = LED(4) btn = Button(17) led.source = negated(btn.values)

Slide 19

Slide 19 text

Combining values Output Device .value .values .source Input Device .value .values Source tool Input Device .value .values

Slide 20

Slide 20 text

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

Slide 24

Slide 24 text

MockPin >>> from gpiozero import LED, Button >>> led = LED(22) >>> button = Button(23) >>> led.source = button.values >>> led.value False >>> button.pin.drive_low() >>> led.value True

Slide 25

Slide 25 text

pigpio - remote GPIO from Pi or PC

Slide 26

Slide 26 text

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

Slide 41

Slide 41 text

IoT devices? from somelib import GardenLight, LightSensor, MotionSensor from gpiozero.tools import all_values, negated garden = GardenLight() light = LightSensor() motion = MotionSensor() garden.source = all_values(negated(light.values), motion.values)

Slide 42

Slide 42 text

guizero

Slide 43

Slide 43 text

GitHub

Slide 44

Slide 44 text

pinout command line tool

Slide 45

Slide 45 text

Read the docs!

Slide 46

Slide 46 text

The MagPi

Slide 47

Slide 47 text

Programming paradigms for physical computing and IoT Ben Nuttall Raspberry Pi Foundation UK Charity 1129409