Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Programming paradigms for physical computing an...
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Ben Nuttall
April 24, 2018
Programming
200
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Programming paradigms for physical computing and IoT
Talk given at London Raspberry Pint April 2018 meetup
Ben Nuttall
April 24, 2018
More Decks by Ben Nuttall
See All by Ben Nuttall
Numeronyms are obnoxious
bennuttall
0
500
Live Highlights in BBC iPlayer
bennuttall
0
160
Rapid prototyping in BBC News with Python and AWS
bennuttall
0
230
Rapid prototyping in BBC News with Python and AWS
bennuttall
0
160
Running a Python Package Index for Raspberry Pi
bennuttall
0
190
From Acorns to Raspberries
bennuttall
0
170
Innovation in the newsroom
bennuttall
0
220
Innovation in the newsroom - MOS Running Order Manager
bennuttall
0
240
How to market your open source project
bennuttall
0
280
Other Decks in Programming
See All in Programming
軽量Java基盤の設計 DIコンテナに頼らない、長期保守と1秒起動の実現 JJUG CCC 2026 Spring
macha64
0
550
依存関係から依存物へ―Dependencyという言葉の歴史をひも解く
j_lee
0
130
Lemonade + Foundry Toolkit でお手軽アプリ開発
seosoft
1
360
ADKを使って簡単にAIエージェントを作ってみよう
k1mu21
0
270
Performance Engineering for Everyone
elenatanasoiu
0
200
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
260
The NotImplementedError Problem in Ruby
koic
1
880
キャリア迷子上等 ─ "ない道"は自分で作ればいい
16bitidol
3
2.2k
作って学ぶ、 JSX (TSX) ランタイムの基本
syumai
7
1.7k
Oxcを導入して開発体験が向上した話
yug1224
4
320
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
290
TypeScript+Orvalで実現する型安全かつ堅牢でスケーラブルなマルチチャネル通知基盤 / TSKaigi Night talks ~after conference~
d0riven
0
350
Featured
See All Featured
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.3k
Docker and Python
trallard
47
3.9k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
360
Accessibility Awareness
sabderemane
1
140
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
870
エンジニアに許された特別な時間の終わり
watany
107
250k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
740
How GitHub (no longer) Works
holman
316
150k
Everyday Curiosity
cassininazir
0
230
The browser strikes back
jonoalderson
0
1.3k
Transcript
Programming paradigms for physical computing and IoT Ben Nuttall Raspberry
Pi Foundation UK Charity 1129409
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]
GPIO Pins – General Purpose Input/Output
GPIO Zero: a friendly API for GPIO devices from gpiozero
import LED led = LED(17) led.on()
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()
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()
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
Multi-paradigm: declarative from gpiozero import LED, Button led = LED(17)
button = Button(4) led.source = button.values
GPIO Zero supports...
GPIO Zero Device Hierarchy!
.value >>> led = PWMLED(17) >>> led.value 0.0 >>> led.on()
>>> led.value 1.0 >>> led.value = 0
.value >>> led = PWMLED(17) >>> pot = MCP3008() >>>
led.value 0.0 >>> pot.value 0.510145879738202 >>> led.value = pot.value
.value >>> while True: ... led.value = pot.value
Source / Values Output Device .value .values .source Input Device
.value .values
Source / Values Output Device .value .values .source Input Device
.value .values
Source / Values from gpiozero import LED, Button led =
LED(17) button = Button(2) led.source = button.values
Processing values Output Device .value .values .source Input Device .value
.values function
Source tools from gpiozero import Button, LED from gpiozero.tools import
negated led = LED(4) btn = Button(17) led.source = negated(btn.values)
Combining values Output Device .value .values .source Input Device .value
.values Source tool Input Device .value .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)
Cross-platform • Raspbian (Raspberry Pi) • Raspberry Pi Desktop x86
(PC) • Linux (PC) • Windows (PC) • Mac OS (Mac)
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
MockPin $ GPIOZERO_PIN_FACTORY=mock python3 >>> from gpiozero import LED >>>
led = LED(22) >>> led.blink() >>> led.value True >>> led.value False
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
pigpio - remote GPIO from Pi or PC
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()
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()
Raspberry Pi Desktop x86
Raspberry Pi Desktop x86 – Remote GPIO
Raspberry Pi Desktop x86 – GPIO expander
Internal devices • TimeOfDay • PingServer • CPUTemperature • More
coming soon • Make your own!
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
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)
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
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())
Blue Dot
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()
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()
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
Multi-paradigm: declarative from gpiozero import LED from bluedot import BlueDot
led = LED(17) bd = BlueDot() led.source = bd.values
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)
guizero
GitHub
pinout command line tool
Read the docs!
The MagPi
Programming paradigms for physical computing and IoT Ben Nuttall Raspberry
Pi Foundation UK Charity 1129409