IoT
Un display OLED WiFi con ESP32
Per monitorare il funzionamento del mio impianto fotovoltaico, ho installato da qualche anno un sistema chiamato OpenEnergyMonitor, basato su Raspberry Pi e Arduino.
Il software di gestione di OpenEnergyMonitor utilizza un broker MQTT, chiamato Mosquitto, che permette ad altri software di connettersi e ricevere e trasmettere messaggi in modalità publish/subscribe in modo efficiente e con ridotto consumo di banda e di energia.
I valori letti vengono pubblicati periodicamente, e possono essere visualizzati per esempio utilizzando l’utility mosquitto_sub
(le credenziali di default sono username emonpi e password emonpimqtt2016), registrandosi come subscriber per
il topic generico, indicato in MQTT con #:
$ mosquitto_sub -h emonpi -u emonpi -P emonpimqtt2016 -v -t '#' /caldaia/barometer/t 19.14 /caldaia/barometer/p 1005.46 emon/emonpi/power1 260 emon/emonpi/power2 17 emon/emonpi/power1pluspower2 277 emon/emonpi/vrms 247.25 emon/emonpi/t1 19 emon/emonpi/t2 0 emon/emonpi/t3 0 emon/emonpi/t4 0 emon/emonpi/t5 0 emon/emonpi/t6 0 emon/emonpi/pulsecount 0
In questo caso le opzioni sono:
-h emonpiper connettersi all'hostemonpi, che è il nome DNS di default che il sistema OpenEnergyMonitor si assegna-u emonpiper il nome utente-P emonpimqtt2016per la password-vper far stampare accanto ad ogni dato il topic MQTT-t '#'per iscriversi a tutti i topic pubblicati dal broker
e l’output consiste in due colonne:
- nella prima colonna, il topic MQTT
- nella seconda colonna, il valore ricevuto
in questo caso, si può vedere come vengano ricevuti valori pubblicati direttamente da emonpi (es. la potenza istantanea prodotta e consumata), sia quelli che vengono inviati da un’altro dispositivo che ho installato presso la caldaia per misurare la temperatura esterna e la pressione atmosferica.
Per visualizzare in tempo reale i valori del sistema, è possibile utilizzare una scheda con ESP32, un SOM che supporta WiFi e Bluetooth Low-Energy, alla quale è collegato un display OLED. Una di queste schede è la D-duino-32, che ha installato sulla stessa basetta un display OLED SSD1306 da 128x64 pixel, può essere alimentato con un qualsiasi alimentatore a 5V con connessione micro-USB (es. quelli dei telefoni) e ha dimensioni ridottissime: circa 6x3cm.
Per programmare la scheda, ho utilizzato MicroPython, nella sua versione per ESP32, che allo stato attuale è disponibile solo come nightly build.
Il firmware può essere installato utilizzando il software esptool.py (che si può ottenere con pip: pip install esptool), con il comando
$ esptool.py --port /dev/ttyUSB0 erase_flash $ esptool.py --port /dev/ttyUSB0 write_flash -z 0x1000 firmware.bin
A questo punto, è possibile utilizzare l’interprete Python installato sulla scheda direttamente con un emulatore di terminale seriale, come Putty o minicom. Per conoscere le librerie specifiche per ESP32 si può consultare la documentazione di Micropython
MicroPython all’avvio esegue, se presenti, prima il file boot.py, quindi il file main.py.
Il file possono essere caricati sulla scheda utilizzando l’utility di Adafruit ampy, che può anch’esso essere installata utilizzando pip con il comando
pip install adafruit-ampy:
$ ampy --port /dev/ttyUSB0 put main.py
Occorrono inoltre la libreria Adafruit per il display SSD1306, che può essere installata utilizzando ampy, e le
librerie per MQTT che si possono installare direttamente da terminale sulla scheda utilizzando upip:
import upip
upip.install('micropython-umqtt.simple')
upip.install('micropython-umqtt.robust')
upip.install('micropython-umqtt.simple') # Seconda chiamata identica per un bug di upip
I codici sorgenti utilizzati per visualizzare i dati si possono recuperare nel progetto GitHub.
Quando il sistema viene alimentato:
- Per prima cosa, cerca la connessione alla rete
- Quando la connessione è stabilita, recupera l'orario corretto via NTP
- Si connette al server MQTT, chiedendo di iscriversi ad alcuni dei valori pubblicati (temperature, pressione, potenza istantanea)
- Entra in un loop nel quale controlla ogni 0.5 secondi se ci sono messaggi MQTT, nel qual caso aggiorna i valori da visualizzare sul display
- I valori visualizzati sul display vengono aggiornati
- Se la connessione wifi cade, il sistema ritenta la connessione
Purtroppo micropython utilizza un font per il display che non è particolarmente leggibile.
Abbiamo quindi ottenuto un display che, ovunque alimentato in copertura della rete wifi, può visualizzare i valori istantanei del nostro sistema. Il risultato è quello che si può vedere in figura.
mfortini
HACKING
hacking electronics ESP32 MQTT IoT MicroPython