
L’architettura Sentinel risolve alla radice le criticità del monitoraggio IoT industriale: la corruzione dei filesystem su schede SD, il degrado da scrittura della EEPROM e i blocchi del firmware per failover di rete non gestiti.
Specifiche del nodo operativo
ESP32-WROVER-E
FRAM (ZERO_SD)
PASS (14.89V)
La centralina Sentinel Node è l’hardware edge progettato per operare in ambienti industriali severi (cantine, celle frigorifere, linee di processo). L’architettura è rigorosamente Local-First: processa, valida e notarizza i dati direttamente sul campo in totale autonomia, garantendo la continuità operativa anche in caso di blackout prolungati dell’infrastruttura di rete.

La scheda inferiore con ESP32 e Mini 560 per ricavare i 5V e 3.3V per la Sentinel.

La scheda superiore con MB85RC256V, RTC DS3231 e modulo ADS1115.
Architettura del buffer e persistenza dati
1. Ring buffer persistente su memoria FRAM
L’unità integra una memoria FRAM MB85RC256V (32 KB) su bus I2C (0x50). A differenza della memoria Flash o SD-Card:
- Scrittura byte-per-byte a latenza zero: Nessun tempo di attesa o ciclo di cancellazione pagina.
- Resistenza meccanica ed elettrica: Fino a 10¹² cicli di scrittura/lettura, eliminando il problema dell’usura fisica (wear-out).
- Struttura record validata: Ogni misurazione archiviata nel buffer circolare è preceduta da una signature di integrità (
0xDEADBEEF) e protetta da un algoritmo di checksum custom a 16-bit per prevenire la lettura di dati parziali dovuti a interruzioni di alimentazione.
2. Supervisor FreeRTOS e Watchdog multilivello
Il firmware esegue un task dedicato (vSupervisorTask) pinnato sul Core 0 con monitoraggio attivo su tre vettori di blocco indipendenti:
| Checkpoint | Timeout critico | Vettore monitorato |
|---|---|---|
last_loop_tick | 10 secondi | Starvation del ciclo principale loop() |
last_i2c_read | 45 secondi | Blocco del bus I2C o stallo dei sensori |
last_net_sync | 180 secondi | Freeze dello stack di rete TCP/IP o del client HTTP |
In caso di mancato aggiornamento di uno qualsiasi dei checkpoint, il Supervisor inibisce il reset del Watchdog hardware (WDT_TIMEOUT = 30s), forzando un reset pulito dell’ESP32. Durante le operazioni OTA, il supervisor entra in stato passivo per prevenire reboot indesiderati.
3. Autenticazione temporale deterministica
- RTC DS3231 su bus I2C (
0x68): Garantisce la marcatura oraria precisa anche senza connessione internet. - Controllo flag OSF (Oscillator Stop Flag): Se l’oscillatore viene azzerato (es. batteria tampone scarica), il nodo segnala la perdita di sincronia (
0x08) e forza la riconnessione alla rete. - Gestione fuso orario POSIX: Sincronizzazione automatica dell’ora solare e legale tramite regola POSIX (
CET-1CEST,M3.5.0,M10.5.0/3).
Sequenza diagnostica all’avvio (POST)
All’accensione, la centralina esegue un collaudo hardware automatico a 6 fasi con output diagnostico su display LCD 1602 (0x27):
- KERNEL CORE: Verifica della causa del reset e disponibilità heap RAM (>100 KB).
- I2C RECOVERY: Iniezione di impulsi di clock su SCL per lo sblocco di eventuali slave rimasti appesi.
- DS3231 RTC: Validazione registro di stato e carica della batteria di backup.
- FRAM SECTOR: Scrittura e rilettura di un test pattern (
0xAA) sulla memoria fisica. - MAX31865 PT1000: Verifica dei registri di fault e coerenza del range termico.
- 1-WIRE BUS: Scansione dell’integrità del bus e rilevamento corto-circuiti verso GND su GPIO 33.
Sincronizzazione asincrona e protocollo SaaS
In condizioni operative standard o al ripristino della connettività, il nodo comunica con il backend Kaspian Engine tramite protocollo Store-and-Forward:
- Svuotamento buffer sequenziale: Il nodo invia primariamente i record registrati in FRAM durante il periodo di offline.
- Handshake ACK: Il puntatore di lettura della FRAM (
FRAM_READ_PTR_LOC) viene avanzato solo quando il server remoto risponde con codice di stato HTTP201 Created. - Notarizzazione real-time: Esauriti i dati pendenti, il nodo riprende l’invio diretto delle telemetrie aggiornate ogni 15 secondi.
{
"version": 924,
"status": 0,
"drift": 0,
"timestamp": "2026-08-15T09:55:59+02:00",
"timestamp_utc": 1786780559,
"voltage_0": 18.46,
"voltage_1": 13.74,
"ads_ch0": 1.245,
"ads_ch1": 0.002
}
Mappatura dei bus di campo
Dispositivi mappati su bus I2C (GPIO 21 SDA / GPIO 22 SCL)
| Indirizzo | Dispositivo | Funzione operativa | Tensione |
|---|---|---|---|
0x27 | LCD 1602 | HMI locale / diagnostica POST | 3.3 V |
0x48 | ADS1115 | Bus analogico 4 canali 16-bit | 3.3 V |
0x50 | MB85RC256V | FRAM ring buffer (32 KB) | 3.3 V |
0x68 | DS3231 | Real-time clock hardware | 3.3 V |
Bus SPI dedicato per acquisizione PT1000 (MAX31865)
| Pin ESP32 | Segnale SPI | Configurazione hardware |
|---|---|---|
| GPIO 25 | MISO | Interfaccia dati MAX31865 |
| GPIO 26 | MOSI | Interfaccia dati MAX31865 |
| GPIO 27 | SCK | Clock di sistema SPI |
| GPIO 32 | CS | Chip Select dedicato |
| Rref | - | 4300 Ω (0.1%) per sonde PT1000 |
Bus 1-Wire (GPIO 33)
- Sensore ambientale: DS18B20 con resistenza di pull-up da 4.7 kΩ integrata.
- Diagnostica fault: Gestione valori sentinella (
-99.0) per cavo scollegato, disconnessione della sonda o guasto elettrico.