Un display OLED WiFi con ESP32

IoT

Un display OLED WiFi con ESP32

Come utilizzare un modulo ESP32 + display OLED per visualizzare dati via WiFi

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'host emonpi, 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:

  1. Per prima cosa, cerca la connessione alla rete
  2. Quando la connessione è stabilita, recupera l'orario corretto via NTP
  3. Si connette al server MQTT, chiedendo di iscriversi ad alcuni dei valori pubblicati (temperature, pressione, potenza istantanea)
  4. 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
  5. I valori visualizzati sul display vengono aggiornati
  6. 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.

HACKING
hacking electronics ESP32 MQTT IoT MicroPython