
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 emonpi
per connettersi all'hostemonpi
, che è il nome DNS di default che il sistema OpenEnergyMonitor si assegna-u emonpi
per il nome utente-P emonpimqtt2016
per la password-v
per 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