Far girare un sito Web pubblico su un microcontroller ESP32 da pochi euro sembra più un esperimento da laboratorio che qualcosa di realmente funzionante. Eppure il progetto HelloESP dimostra il contrario, e lo fa in modo piuttosto convincente. Con appena 520 KB di RAM, una CPU embedded e qualche servizio cloud a supporto, è possibile servire pagine HTML, gestire richieste HTTP e persino raccogliere dati ambientali in tempo reale. Il tutto senza un server tradizionale, senza rack, senza costi ricorrenti importanti.
Già nei primi anni 2010 gli ESP8266 venivano usati come server Web minimali, ma da allora le librerie asincrone e le architetture edge hanno cambiato parecchio le carte in tavola. Oggi, con un chip ESP32 e servizi come Cloudflare Workers per la gestione serverless, si riesce a mettere in piedi un’infrastruttura ibrida sorprendentemente capace di sostenere traffico reale con risorse ridottissime.
La piattaforma hardware è una DOIT ESP32 DevKit V1, che monta un modulo ESP32 WROOM 32 con SoC Xtensa LX6 dual core, frequenza fino a 240 MHz, connettività WiFi e Bluetooth, flash integrata e gestione completa delle periferiche I/O. File HTML, script JavaScript, immagini e log vengono letti da una microSD formattata in FAT32 e serviti direttamente dal dispositivo.
Il firmware, sviluppato con framework Arduino tramite PlatformIO, implementa un server HTTP asincrono che funziona in modo non convenzionale. Non esiste un listener pubblico su Internet. Il dispositivo mantiene una connessione persistente verso l’esterno, evitando completamente l’esposizione diretta sulla rete globale. Questo riduce la superficie d’attacco e bypassa i problemi di NAT domestico, che di solito rappresentano un ostacolo per chi vuole esporre servizi dalla propria rete casalinga.
Come funziona il relay via Cloudflare e l’aggiornamento in tempo reale
Il traffico pubblico non raggiunge mai direttamente il microcontroller ESP32. La catena parte dal browser, passa per una richiesta HTTPS, attraversa un Cloudflare Worker e arriva al dispositivo tramite una connessione WebSocket già aperta. Il Worker agisce come intermediario, inoltrando ogni richiesta senza che il microcontroller debba esporre porte TCP pubbliche. Le risposte più grandi vengono automaticamente frammentate e codificate in base64 per adattarsi ai frame WebSocket, scelta obbligata vista la limitazione di buffer e memoria.
Una delle parti più interessanti riguarda l’aggiornamento in tempo reale della pagina. Il dispositivo invia eventi ogni 5 secondi trasmettendo dati dai sensori, log di accesso e stato del sistema. Il Worker li recapita ai browser tramite Server Sent Events (SSE), evitando così il classico polling continuo. Se la connessione SSE cade, il sistema passa automaticamente a un polling ogni 30 secondi. Soluzione semplice, ma robusta, che alleggerisce il carico sul microcontroller.
Il progetto HelloESP integra anche sensori ambientali: un BME280 per temperatura, umidità e pressione, e un CCS811 per misurare i composti organici volatili (VOC) e stimare la concentrazione di CO₂ equivalente. I dati vengono registrati su file CSV ogni 5 minuti e aggregati su base settimanale e mensile.
Gestione della memoria, resilienza e limiti concreti del sistema
Con circa 180 KB liberi a regime, ogni singola allocazione di memoria conta. Il firmware integra diversi sistemi di protezione: riavvio automatico quando la memoria scende sotto una soglia critica, watchdog WiFi per verificare lo stato della connessione, riconnessione con retry esponenziale (il tempo tra un tentativo e l’altro aumenta progressivamente per evitare sovraccarichi) e scritture atomiche sul file system, così da salvare i dati in modo completo anche in caso di interruzioni improvvise.
La scrittura su scheda microSD segue una sequenza precisa (file temporaneo, backup e rename) per prevenire corruzioni in caso di crash. È un approccio tipico dei sistemi embedded affidabili, ma raramente lo si trova nei progetti amatoriali.
Il sito completo pesa meno di una singola immagine ad alta risoluzione che si trova nelle pagine Web moderne, il che la dice lunga su quanto overhead introducano framework, tracking e asset superflui nel Web di oggi. Va detto però che il sistema HelloESP, nella sua forma attuale, sostiene poche richieste simultanee prima che la latenza diventi evidente. La terminazione HTTPS avviene sul Worker, mentre in LAN il traffico resta in HTTP. E la microSD rappresenta un punto debole fisico: migliaia di scritture giornaliere portano inevitabilmente a usura. Nel repository GitHub ufficiale del progetto è disponibile tutto il necessario per replicare l’idea ed eventualmente migliorarla.