Monitor ambientale multi-pagina per M5Stack StickC Plus2 con sensore ENVPROUnit (BME688).
Mostra temperatura, umidità, pressione, punto di rugiada, temperatura percepita e qualità dell'aria.
| Componente | Dettaglio |
|---|---|
| M5Stack StickC Plus2 | MCU ESP32, display 135×240 px |
| ENVPROUnit | Sensore BME688 (temp, umidità, pressione, gas) |
| Connessione | Port A (Grove): SDA=GPIO32, SCL=GPIO33 |
- UIFlow2 v2.4.6
- MicroPython v1.27.0-dirty (build 2026-06-10)
m5stack-envpro/
├── main.py # Applicazione principale
├── secrets.py # Credenziali WiFi/ThingSpeak — locale, NON committato
├── secrets.example.py # Template di secrets.py
├── README.md
├── CHANGELOG.md
├── LICENSE
└── .gitignore
Naviga con Pulsante A (click ciclico):
- Temperatura (°C) con simbolo grado
- Dew point / punto di rugiada
- Feels like / temperatura percepita (heat index)
- Umidità relativa (%)
- Pressione atmosferica (hPa) con trend ↑↓=
- Massimo storico di temperatura, umidità e pressione
- Reset con Pulsante B (hold)
- Livello batteria (%)
- Uptime (hh:mm:ss)
- Intervallo di campionamento
- Stato WiFi (OFFLINE / CONNESSIONE... / CONNESSO / NON RIUSCITA) e SSID selezionato
- Gas resistance BME688 in KOhm
- Qualità aria con colore dinamico:
| Soglia | Qualità | Colore |
|---|---|---|
| > 100 KOhm | BUONA | 🟢 Verde |
| 50–100 KOhm | DISCRETA | 🟡 Giallo |
| < 50 KOhm | SCARSA | 🔴 Rosso |
Nota: la gas resistance è un valore relativo, non un indice IAQ calibrato.
Valori più alti indicano aria più pulita. Per un indice IAQ preciso è necessario
l'algoritmo BSEC di Bosch (non incluso).
- Stato connessione (grande, colorato)
- Rete selezionata tra quelle configurate
- Indirizzo IP (se connesso)
- Esito ultimo upload ThingSpeak (
---mai tentato,OK,ERR)
Credenziali WiFi e API key ThingSpeak non stanno in main.py (finirebbero
su GitHub in chiaro), ma in secrets.py, locale e gitignorato:
cp secrets.example.py secrets.py
# poi modifica secrets.py con le tue reti/API key reali# secrets.py
WIFI_NETWORKS = [
{"ssid": "NOME_RETE_1", "password": "PASSWORD_1"},
{"ssid": "NOME_RETE_2", "password": "PASSWORD_2"},
]
THINGSPEAK_API_KEY = "TUA_WRITE_API_KEY"Non essendoci una tastiera a bordo per digitare SSID/password a runtime,
WIFI_NETWORKS è una lista di reti note, in ordine di preferenza.
secrets.py va caricato sul device separatamente da main.py (non è nel
repo, quindi MicroPico non lo carica in automatico):
mpremote connect <porta> cp secrets.py :secrets.pySe manca sul device, WiFi e upload ThingSpeak restano disabilitati senza bloccare il resto dell'app (temperatura/umidità/pressione/gas continuano a funzionare offline).
Al boot (e ad ogni retry, ogni 30s se offline) il device scansiona le reti visibili e si collega automaticamente a quella nota con segnale migliore. In pagina WIFI puoi anche:
- B — click: cambia manualmente la rete selezionata tra quelle configurate
- B — hold: forza subito il tentativo di connessione alla rete selezionata
Ad ogni lettura, se il WiFi è connesso, i dati vengono inviati in upload al
canale ThingSpeak ogni THINGSPEAK_INTERVAL:
| Campo | Valore |
|---|---|
| field1 | Temperatura |
| field2 | Umidità |
| field3 | Pressione |
| field4 | Dew point |
| field5 | Feels like |
| field6 | Gas resistance |
La Write API Key si imposta in:
THINGSPEAK_API_KEY = "..."| Limite | Valore |
|---|---|
| Intervallo minimo tra update dello stesso canale | 15s |
| Messaggi/anno | 3.000.000 |
| Canali | 4 |
THINGSPEAK_INTERVAL è impostato a 10 minuti di default: ben sopra il
minimo di 15s e produce ~144 upload/giorno (~52.000/anno), ampiamente sotto
la soglia annua. L'esito di ogni upload viene verificato leggendo la risposta di
ThingSpeak (l'entry id: 0 = rifiutato, es. rate limit o API key errata) e
mostrato in pagina WIFI (ts_status: OK / ERR) invece di fallire in
silenzio.
Tutte le operazioni WiFi (scan, connessione, upload) sono non bloccanti o a timeout limitato, per evitare di bloccare la lettura sensore e la UI.
| Pulsante | Azione |
|---|---|
| A — click | Pagina successiva (0→1→2→3→4→0) |
| A — hold | Schermo on/off (risparmio batteria) |
| B — hold | Reset record massimi + beep (in pagina WIFI: forza connessione) |
| B — click | (solo in pagina WIFI) cambia rete selezionata |
- Installa l'estensione MicroPico (Paulober)
- Collega il device via USB
- Seleziona la porta seriale corretta in basso a destra
- Carica
main.pycon "Upload file to Pico" o drag & drop tramite explorer MicroPico
Il file deve trovarsi nella root del device come
/flash/main.py
oppure/main.pya seconda del firmware.
{
"recommendations": [
"paulober.pico-w-go",
"ms-python.python",
"ms-python.vscode-pylance"
]
}Su UIFlow2 il bus I2C 0 è riservato internamente dal firmware.
Usare sempre bus 1 con pin espliciti:
i2c0 = I2C(1, scl=Pin(33), sda=Pin(32), freq=100000)- Upload dati su ThingSpeak via WiFi
- Calibrazione baseline gas resistance per IAQ relativo
- Grafico storico temperatura su display
- Modalità deep sleep tra le letture
MIT — vedi LICENSE