In questo tutorial useremo Edge AI per rilevare il numero di persone in una stanza (occupazione) con un XIAO ESP32-S3-Sense e un ESP32 lite. Se non hai mai usato il XIAO-ESP32-S3 Sense prima, dai un’occhiata al Getting started with XIAO-ESP32-S3-Sense tutorial prima.
Distribuiremo un modello di rilevamento persone sul XIAO ESP32-S3-Sense usando la piattaforma SenseCraft AI. Il modello girerà sull’ESP32 senza bisogno di interagire con un server per eseguire il rilevamento o il conteggio delle persone.
Un sensore di occupazione di una stanza ha molte applicazioni pratiche sia in ambito fai-da-te che professionale. Nelle case smart può regolare luci, riscaldamento e sistemi di sicurezza in base alla presenza. In uffici, scuole e spazi commerciali aiuta a monitorare l’uso delle stanze, gestire l’efficienza energetica e migliorare l’utilizzo degli spazi. Negozi e aree pubbliche possono usarlo per il conteggio delle persone, la gestione delle code e la conformità alle norme di sicurezza.
Iniziamo!
Componenti necessari
Ti serviranno una scheda XIAO ESP32-S3-Sense e un secondo ESP32. Nota che il XIAO ESP32-S3-Sense può scaldarsi molto sotto carico computazionale elevato. Ti consiglio di applicare un piccolo Heatsink sul retro della scheda (vedi il componente elencato sotto).
Per il secondo ESP32 ho scelto un ESP32 lite più vecchio, ma qualsiasi altro ESP32 o Arduino andrà bene.

Seeed Studio XIAO ESP32-S3-Sense

ESP32-lite

Display OLED

Cavo USB C

Piccolo dissipatore 9×9 mm

Set di fili Dupont

Breadboard
Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.
Architettura del sensore di occupazione
Il nostro sistema sensore di occupazione sarà composto da: un XIAO ESP32S3 Sense con una camera che esegue un modello di rilevamento persone, un ESP32-lite che analizza le rilevazioni per contare le persone e un OLED per mostrare il contatore.

I due ESP32 e l’OLED comunicano via I2C. Programmeremo l’ESP32 con Arduino IDE e il modello di rilevamento persone sarà distribuito sul XIAO ESP32S3 Sense tramite SenseCraft AI platform. Se vuoi saperne di più sul XIAO ESP32-S3-Sense, guarda il Getting started with XIAO-ESP32-S3-Sense tutorial.
Il motivo per cui serve un secondo ESP32-lite è che non possiamo (facilmente) eseguire altro codice sul XIAO ESP32S3 Sense oltre al modello di rilevamento persone. Questo ha il vantaggio che non devi scrivere codice per il rilevamento e non devi preoccuparti del carico computazionale aggiuntivo sul XIAO ESP32S3 Sense. Lo svantaggio è che non hai pieno controllo sul modello di rilevamento (e serve il secondo ESP32).
La foto seguente mostra il sistema montato su breadboard con una powerbank come alimentazione:

Come vedi, ho fissato la breadboard a un piccolo supporto in modo che la camera sia rivolta in avanti. Nella sezione successiva distribuiamo il modello di rilevamento persone sul XIAO ESP32S3 Sense.
Distribuire il modello di rilevamento persone
Vai alla pagina di selezione modelli SenseCraft su https://sensecraft.seeed.cc/ai/model. Nella scheda “Pretrained Models” nella barra laterale seleziona sotto Task: “Detection” e sotto Supported Devices: “XIAO ESP32S3 Sense”. Poi digita “Person” nella barra di ricerca per filtrare i modelli di rilevamento persone:

A luglio 2025 c’è solo un risultato. Clicca sul modello Person Detection–Swift YOLO (evidenziato in giallo) a destra.
Si aprirà una nuova pagina con la descrizione del modello di rilevamento e un pulsante verde “Deploy Model” a destra:

Collega la tua scheda XIAO ESP32-S3-Sense via USB al computer e clicca su “Deploy Model”. Segui i passaggi. Se ti serve aiuto, vedi il Face Detection with XIAO ESP32-S3-Sense and SenseCraft AI tutorial, che descrive il processo di distribuzione in dettaglio.
Prova il modello di rilevamento persone
Una volta distribuito, il modello parte automaticamente e invia immagini con riquadri attorno alle persone rilevate al browser, dove puoi monitorare lo streaming live nella sezione Preview. In alto a destra della Preview c’è un pulsante “Stop” per fermare il modello in esecuzione. L’immagine sotto mostra la finestra Preview con le persone rilevate:

Per testare il modello, ho semplicemente messo davanti alla camera la seguente immagine con persone.

Si vede che il modello rileva la maggior parte delle persone nell’immagine, ma non è perfetto. Sotto la finestra Preview ci sono due impostazioni (Confidence e IoU threshold) che puoi regolare per migliorare la precisione.
Se il sistema rileva poche persone, abbassa la soglia di confidenza; se rileva oggetti come persone, alza la soglia.
Se noti che la stessa persona è coperta da più riquadri, abbassa la soglia IoU. Se invece i riquadri sono troppo grandi, alza la soglia IoU. Per maggiori dettagli vedi il Face Detection with XIAO ESP32-S3-Sense and SenseCraft AI tutorial.
Nella prossima sezione scriveremo il codice per contare le persone nella stanza. Questo codice girerà sull’ESP32-lite.
Collegare ESP32-S3-Sense a ESP32-lite
Come detto, il modello di rilevamento gira sul XIAO ESP32-S3-Sense. Possiamo comunicare con il XIAO ESP32-S3-Sense via I2C. Lo schema di collegamento seguente mostra come connettere il XIAO ESP32-S3-Sense all’ESP32-lite:

I pin I2C sull’ESP32-lite sono SDA=GPIO19 e SCL=GPIO23. I pin corrispondenti sul ESP32-S3-Sense sono SDA=D4/GPIO5 e SCL=D5/GPIO4. Nota che lo schema mostra il retro delle schede, dove sono etichettate le uscite digitali (D0…D10).
| ESP32-lite | XIAO | |
|---|---|---|
| SDA | GPIO19 | D4 / GPIO5 |
| SCL | GPIO23 | D5 / GPIO4 |
Se usi un ESP32 o Arduino diverso, i pin hardware I2C saranno differenti. Assicurati di collegarti ai pin corretti, altrimenti la comunicazione fallirà.
Nella prossima sezione testeremo questa connessione recuperando le rilevazioni dal XIAO ESP32-S3-Sense e stampandole sull’ESP32-lite.
Codice per comunicazione seriale
Per far funzionare il codice seguente devi prima installare la Seeed_Arduino_SSCMA library. Apri il LIBRARY MANAGER, cerca “Seeed_Arduino_SSCMA” e clicca su INSTALL:

Poi collega l’ESP32-lite al computer via USB e carica il codice seguente:
#include <Wire.h>
#include <Seeed_Arduino_SSCMA.h>
SSCMA detector;
void setup() {
Serial.begin(115200);
Wire.begin();
detector.begin(&Wire);
Serial.println("running...");
}
void loop() {
if (!detector.invoke(1, false, false)) {
for (int i = 0; i < detector.boxes().size(); i++) {
boxes_t &b = detector.boxes()[i];
Serial.printf("Box[%d] conf=%d [%3d %3d %3d %3d]\n",
i, b.score, b.x, b.y, b.w, b.h);
}
}
}
Questo codice invoca il rilevatore persone sul ESP32-S3-Sense e stampa i punteggi di confidenza e i riquadri di rilevamento per ogni persona rilevata sul Monitor Seriale. Vedi il Face Detection with XIAO ESP32-S3-Sense and SenseCraft AI, se hai domande su questo codice.
Se tutto è collegato e funziona correttamente, vedrai i risultati di rilevamento stampati sul Monitor Seriale così:

Nella prossima sezione scriveremo il codice per contare il numero di persone.
Codice per occupazione stanza
Una volta ottenuti i riquadri per le persone rilevate, calcolare l’occupazione della stanza è semplice. Basta contare il numero di riquadri.
Sarebbe però utile vedere questo numero su un display per rendere il sistema indipendente dal collegamento USB a un PC. Aggiungiamo quindi un piccolo OLED al circuito per mostrare il numero di persone nella stanza. L’immagine sotto mostra lo schema di collegamento:

Collega l’alimentazione dell’ESP32 (3.3V e G) all’OLED e poi collega SCL e SDA in parallelo alla connessione I2C esistente.
Il codice seguente gira sull’ESP32-lite. Comunica con il rilevatore persone sul ESP32-S3-Sense via I2C. Invoca il rilevatore, recupera il numero n dei riquadri di rilevamento e mostra quel numero sull’OLED:
#include <Wire.h>
#include <Seeed_Arduino_SSCMA.h>
#include <Adafruit_SSD1306.h>
SSCMA detector;
Adafruit_SSD1306 oled(128, 64, &Wire, -1);
void setup() {
Wire.begin();
detector.begin(&Wire);
oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
oled.setRotation(3);
oled.setTextSize(6);
oled.setTextColor(WHITE);
}
void loop() {
if (!detector.invoke(1, false, false)) {
int n = detector.boxes().size();
oled.clearDisplay();
oled.setCursor(10, 20);
oled.printf("%d", n);
oled.display();
}
}
Nota che il codice usa la Adafruit_SSD1306 library, che puoi installare tramite il Library Manager come al solito. Vediamo il codice più da vicino.
Librerie
Per prima cosa includiamo la libreria Wire per la comunicazione I2C, Seeed_Arduino_SSCMA per comunicare con il modello di rilevamento persone e Adafruit_SSD1306 per controllare l’OLED.
#include <Wire.h> #include <Seeed_Arduino_SSCMA.h> #include <Adafruit_SSD1306.h>
Oggetti
Poi creiamo l’oggetto detector e l’oggetto oled:
SSCMA detector; Adafruit_SSD1306 oled(128, 64, &Wire, -1);
Setup
Nella funzione setup inizializziamo il rilevatore e l’OLED:
void setup() {
Wire.begin();
detector.begin(&Wire);
oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
oled.setRotation(3);
oled.setTextSize(6);
oled.setTextColor(WHITE);
}
Nota che l’indirizzo I2C dell’OLED che uso è 0x3C. Se hai un OLED con un indirizzo diverso dovrai modificare il codice qui.
Loop
Infine, abbiamo la funzione loop, dove invochiamo il modello di rilevamento, recuperiamo il numero di riquadri e mostriamo quel numero come conteggio persone sull’OLED:
void loop() {
if (!detector.invoke(1, false, false)) {
int n = detector.boxes().size();
oled.clearDisplay();
oled.setCursor(10, 20);
oled.printf("%d", n);
oled.display();
}
}
Se osservi il rilevatore persone, noterai che le rilevazioni non sono stabili. I riquadri appaiono e scompaiono, anche per un’immagine statica. In uno scenario reale, con persone che si muovono nella stanza, occlusioni e variazioni di luce aggiungono ulteriore variabilità. I tre esempi seguenti mostrano questa variabilità anche per un’immagine fissa:

Stabilizzare il conteggio persone
Per rendere il conteggio persone più stabile puoi calcolare una media mobile. Le funzioni seguenti fanno la media di tre conteggi consecutivi n, stabilizzandolo un po’:
int average3(int n) {
static int prev1 = 0, prev2 = 0;
int avg = (n + prev1 + prev2 + 1) / 3;
prev2 = prev1;
prev1 = n;
return avg;
}
Nella funzione loop la chiami così:
void loop() {
if (!detector.invoke(1, false, false)) {
int n = detector.boxes().size();
n = average3(n);
...
oled.printf("%d", n);
oled.display();
}
}
Il compromesso è che il contatore persone reagisce più lentamente ai cambiamenti nel numero di persone nella stanza. Ma va bene se vuoi regolare riscaldamento, ventilazione, luci o volume della musica in base al numero di persone. Cambiamenti troppo rapidi di queste condizioni di solito non servono.
E questo è tutto!
Conclusioni e commenti
In questo tutorial abbiamo costruito un sensore di occupazione stanza. Il nostro sensore funziona come dispositivo Edge AI e non ha bisogno di essere connesso a un server. Il rilevamento persone e il calcolo del conteggio avvengono direttamente sul dispositivo.
La piattaforma SenseCraft AI rende molto semplice distribuire un modello sul XIAO ESP32-S3-Sense, ma lo svantaggio è che serve un secondo microcontrollore per ulteriori elaborazioni. Inoltre il controllo sul modello è limitato e non ho visto un metodo per recuperare le rilevazioni persone e lo streaming video.
Tuttavia, se trasmetti il video a un server, potresti eseguire il rilevatore persone anche lì. Dai un’occhiata ai nostri Object Detection with ESP32-CAM and YOLO e ai Stream Video with with XIAO-ESP32-S3-Sense tutorial.
A causa della potenza computazionale limitata, puoi eseguire solo modelli AI relativamente piccoli su un microcontrollore. La precisione del rilevamento persone e quindi delle misurazioni di occupazione non è pari a quella di un modello più grande che gira su server con GPU, per esempio.
D’altra parte, se la privacy è importante, la comunicazione Wi-Fi è instabile o vuoi funzionare a batteria, una soluzione Edge AI è migliore. E anche se la precisione del modello non è elevata, è sufficiente per regolare riscaldamento o ventilazione di una stanza.
Se hai domande, sentiti libero di lasciarle nei commenti.
Buon divertimento con il tinkering 😉

