In diesem Tutorial verwenden wir Edge AI, um die Anzahl der Personen in einem Raum (Belegung) mit einem XIAO ESP32-S3-Sense und einem ESP32 lite zu erkennen. Wenn du den XIAO-ESP32-S3 Sense noch nicht benutzt hast, schau dir zuerst das Getting started with XIAO-ESP32-S3-Sense Tutorial an.
Wir werden ein Personenerkennungsmodell auf dem XIAO ESP32-S3-Sense mit der SenseCraft AI Plattform bereitstellen. Das Modell läuft auf dem ESP32, ohne dass eine Verbindung zu einem Server für die Personenerkennung oder -zählung nötig ist.
Ein Raumbelegungssensor hat viele praktische Anwendungen sowohl im DIY- als auch im professionellen Bereich. In Smart Homes kann er Beleuchtung, Heizung und Sicherheitssysteme je nach Anwesenheit anpassen. In Büros, Schulen und Geschäftsräumen hilft er, die Raumnutzung zu überwachen, Energieeffizienz zu managen und die Flächennutzung zu verbessern. Einzelhandelsgeschäfte und öffentliche Bereiche können ihn für Personenzählung, Warteschlangenmanagement und Sicherheitsvorschriften nutzen.
Lass uns loslegen!
Benötigte Teile
Du benötigst ein XIAO ESP32-S3-Sense Board und einen zweiten ESP32. Beachte, dass der XIAO ESP32-S3-Sense bei hoher Rechenlast sehr heiß werden kann. Ich empfehle, einen kleinen Heatsink auf der Rückseite des Boards anzubringen (siehe unten aufgeführtes Teil).
Für den zweiten ESP32 habe ich einen älteren ESP32 lite gewählt, aber jeder andere ESP32 oder ein Arduino funktioniert ebenfalls gut.

Seeed Studio XIAO ESP32-S3-Sense

ESP32-lite

OLED Display

USB C Kabel

Kleiner Kühlkörper 9×9 mm

Dupont Kabelsatz

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.
Architektur des Belegungssensors
Unser Belegungssensor-System besteht aus folgenden Teilen: einem XIAO ESP32S3 Sense mit Kamera, das ein Personenerkennungsmodell ausführt, einem ESP32-lite, der die Erkennungen analysiert, um Personen zu zählen, und einem OLED zur Anzeige des Personen-Zählers.

Die beiden ESP32s und das OLED kommunizieren über I2C. Den ESP32 programmieren wir mit der Arduino IDE, und das Personenerkennungsmodell wird vom SenseCraft AI platform auf den XIAO ESP32S3 Sense geladen. Wenn du mehr über den XIAO ESP32-S3-Sense erfahren möchtest, siehe Getting started with XIAO-ESP32-S3-SenseTutorial.
Der Grund, warum wir den zweiten ESP32-lite brauchen, ist, dass wir auf dem XIAO ESP32S3 Sense im Grunde keine andere Software (einfach) ausführen können außer dem Personenerkennungsmodell. Das hat den Vorteil, dass du keinen Code für die Gesichtserkennung schreiben musst und dir keine Sorgen um zusätzliche Rechenlast auf dem XIAO ESP32S3 Sense machen musst. Der Nachteil ist, dass du keine volle Kontrolle über das Erkennungsmodell hast (und den zweiten ESP32 brauchst).
Das folgende Foto zeigt das System auf einem Breadboard aufgebaut mit einer Powerbank als Stromversorgung:

Wie du siehst, habe ich das Breadboard an einem kleinen Halter befestigt, sodass die Kamera nach vorne zeigt. Im nächsten Abschnitt laden wir das Personenerkennungsmodell auf den XIAO ESP32S3 Sense.
Personenerkennungsmodell bereitstellen
Gehe zur SenseCraft Modell-Auswahlseite unter https://sensecraft.seeed.cc/ai/model. Im Tab „Pretrained Models“ in der Seitenleiste wähle unter Task: „Detection“ und unter Supported Devices: „XIAO ESP32S3 Sense“. Gib dann „Person“ in die Suchleiste ein, um nach Personenerkennungsmodellen zu filtern:

Stand Juli 2025 gibt es nur einen Treffer. Klicke auf das Person Detection–Swift YOLO Modell (gelb markiert) rechts.
Es öffnet sich eine neue Seite mit einer Beschreibung des Erkennungsmodells und einem grünen Button „Deploy Model“ rechts:

Verbinde dein XIAO ESP32-S3-Sense Board per USB mit deinem Computer und klicke dann auf „Deploy Model“. Folge den Schritten. Wenn du mehr Hilfe brauchst, siehe das Face Detection with XIAO ESP32-S3-Sense and SenseCraft AITutorial, das den Bereitstellungsprozess ausführlicher beschreibt.
Personenerkennungsmodell testen
Sobald das Modell bereitgestellt ist, startet es automatisch und sendet Bilder mit Begrenzungsrahmen um erkannte Personen an deinen Webbrowser, wo du im Vorschau-Bereich einen Live-Stream überwachen kannst. Oben rechts im Vorschau-Bereich gibt es einen „Stop“-Button, um das laufende Modell zu stoppen. Das Bild unten zeigt das Vorschaufenster mit Personenerkennungen:

Um das Modell zu testen, habe ich einfach das folgende Bild mit Personen vor die Kamera gehalten.

Du kannst sehen, dass das Modell die meisten Personen im Bild erkennt, aber es ist nicht perfekt. Unter dem Vorschaufenster gibt es zwei Einstellungen (Confidence und IoU threshold), die du anpassen kannst, um die Erkennungsgenauigkeit zu verbessern.
Wenn das System zu wenige Personen erkennt, senke den Confidence-Threshold, wenn es Dinge fälschlich als Personen erkennt, erhöhe den Threshold.
Wenn dieselbe Person von mehreren Erkennungsrahmen abgedeckt wird, senke den IoU-Threshold. Sind die Erkennungsrahmen zu groß, erhöhe den IoU-Threshold. Für mehr Details siehe das Face Detection with XIAO ESP32-S3-Sense and SenseCraft AI Tutorial.
Im nächsten Abschnitt schreiben wir den Code, um die Personen im Raum zu zählen. Dieser Code läuft auf dem ESP32-lite.
ESP32-S3-Sense mit ESP32-lite verbinden
Wie erwähnt, läuft das Personenerkennungsmodell auf dem XIAO ESP32-S3-Sense Board. Wir können über I2C mit dem XIAO ESP32-S3-Sense kommunizieren. Das folgende Schaltbild zeigt, wie du den XIAO ESP32-S3-Sense mit dem ESP32-lite verbindest:

Die I2C-Pins am ESP32-lite sind SDA=GPIO19 und SCL=GPIO23. Die entsprechenden Pins am ESP32-S3-Sense sind SDA=D4/GPIO5 und SCL=D5/GPIO4. Beachte, dass das obige Schaltbild die Rückseite der Boards zeigt, wo die digitalen Ausgänge beschriftet sind (D0…D10).
| ESP32-lite | XIAO | |
|---|---|---|
| SDA | GPIO19 | D4 / GPIO5 |
| SCL | GPIO23 | D5 / GPIO4 |
Wenn du einen anderen ESP32 oder Arduino verwendest, unterscheiden sich die Hardware-I2C-Pins. Achte darauf, die richtigen Pins zu verbinden, sonst funktioniert die Kommunikation nicht.
Im nächsten Abschnitt testen wir diese Verbindung, indem wir Erkennungen vom XIAO ESP32-S3-Sense abrufen und auf dem ESP32-lite ausgeben.
Code für serielle Kommunikation
Damit der folgende Code funktioniert, musst du zuerst die Seeed_Arduino_SSCMA Bibliothek installieren. Öffne den LIBRARY MANAGER, suche nach „Seeed_Arduino_SSCMA“ und klicke auf INSTALL:

Verbinde als Nächstes den ESP32-lite per USB mit deinem Computer und spiele den folgenden Code auf ihn auf:
#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);
}
}
}
Dieser Code ruft den Personendetektor auf dem ESP32-S3-Sense auf und gibt die Confidence-Werte sowie die Erkennungsrahmen für erkannte Personen im Serial Monitor aus. Siehe das Face Detection with XIAO ESP32-S3-Sense and SenseCraft AI, falls du Fragen zu diesem Code hast.
Wenn alles richtig verkabelt und funktionsfähig ist, solltest du die Erkennungsergebnisse wie folgt im Serial Monitor sehen:

Im nächsten Abschnitt schreiben wir den Code, um die Anzahl der Personen zu zählen.
Code für Raumbelegung
Sobald wir Begrenzungsrahmen für erkannte Personen haben, ist die Berechnung der Raumbelegung einfach. Wir müssen nur die Anzahl der Erkennungsrahmen zählen.
Es wäre aber schön, diese Zahl auf einem Display zu sehen, um das System unabhängig von einer USB-Verbindung zum PC zu machen. Deshalb fügen wir dem Schaltkreis ein kleines OLED hinzu, um die Anzahl der Personen im Raum anzuzeigen. Das Bild unten zeigt das Schaltbild:

Verbinde einfach die Stromversorgung des ESP32 (3,3 V und GND) mit dem OLED und dann SCL und SDA parallel zur bestehenden I2C-Verbindung.
Der folgende Code läuft auf dem ESP32-lite. Er kommuniziert über I2C mit dem Personendetektor auf dem ESP32-S3-Sense. Er ruft den Detektor auf, liest die Anzahl der nErkennungsrahmen aus und zeigt diese Zahl auf dem OLED an:
#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();
}
}
Beachte, dass der Code die Adafruit_SSD1306 Bibliothek verwendet, die du wie gewohnt über den Library Manager installieren kannst. Schauen wir uns den Code genauer an.
Bibliotheken
Zuerst binden wir die Wire-Bibliothek für die I2C-Kommunikation ein, die Seeed_Arduino_SSCMA für die Kommunikation mit dem Personenerkennungsmodell und die Adafruit_SSD1306 Bibliothek zur Steuerung des OLED.
#include <Wire.h> #include <Seeed_Arduino_SSCMA.h> #include <Adafruit_SSD1306.h>
Objekte
Als Nächstes erstellen wir das detectorObjekt und das oledObjekt:
SSCMA detector; Adafruit_SSD1306 oled(128, 64, &Wire, -1);
Setup
In der Setup-Funktion initialisieren wir den Detektor und das OLED:
void setup() {
Wire.begin();
detector.begin(&Wire);
oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
oled.setRotation(3);
oled.setTextSize(6);
oled.setTextColor(WHITE);
}
Beachte, dass die I2C-Adresse des von mir verwendeten OLED 0x3Cist. Wenn du ein OLED mit anderer Adresse hast, musst du den Code hier anpassen.
Loop
Schließlich haben wir die loopFunktion, in der wir das Erkennungsmodell aufrufen, die Anzahl der Begrenzungsrahmen abrufen und diese Zahl als Personenzähler auf dem OLED anzeigen:
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();
}
}
Wenn du den Personendetektor beobachtest, wirst du feststellen, dass die Erkennungen nicht stabil sind. Begrenzungsrahmen erscheinen und verschwinden, selbst bei einem statischen Bild. In einem echten Live-Szenario, in dem sich Personen im Raum bewegen, sorgen Verdeckungen und Lichtveränderungen für noch mehr Variabilität. Die folgenden drei Beispiele zeigen die Variabilität der Erkennung selbst bei einem festen Bild:

Personenzählung stabilisieren
Um die Personenzählung etwas stabiler zu machen, kannst du einen gleitenden Durchschnitt berechnen. Die folgenden Funktionen mitteln drei aufeinanderfolgende Personenzahlen n und stabilisieren sie dadurch etwas:
int average3(int n) {
static int prev1 = 0, prev2 = 0;
int avg = (n + prev1 + prev2 + 1) / 3;
prev2 = prev1;
prev1 = n;
return avg;
}
In der loop Funktion rufst du sie wie folgt auf:
void loop() {
if (!detector.invoke(1, false, false)) {
int n = detector.boxes().size();
n = average3(n);
...
oled.printf("%d", n);
oled.display();
}
}
Der Nachteil ist natürlich, dass der Personenzähler länger braucht, um auf Änderungen der Personenzahl im Raum zu reagieren. Aber das ist in Ordnung, wenn du Heizung, Lüftung, Beleuchtung oder Musiklautstärke je nach Personenzahl anpassen möchtest. Zu schnelle Änderungen dieser Bedingungen sind meist nicht nötig.
Und das war’s!
Fazit und Kommentare
In diesem Tutorial haben wir einen Raumbelegungssensor gebaut. Unser Sensor arbeitet als Edge AI Gerät und muss nicht mit einem Server verbunden sein. Die Personenerkennung und Berechnung der Personenzahl erfolgt direkt auf dem Gerät.
Die SenseCraft AI Plattform macht es sehr einfach, ein Modell auf dem XIAO ESP32-S3-Sense bereitzustellen, aber der Nachteil ist, dass du für weitere Verarbeitung einen zweiten Mikrocontroller brauchst. Außerdem hast du nur begrenzte Kontrolle über das Modell und ich habe keine Methode gesehen, um die Personenerkennungen und den Videostream abzurufen.
Wenn du das Video sowieso an einen Server streamst, könntest du den Personendetektor auch dort laufen lassen. Schau dir unsere Object Detection with ESP32-CAM and YOLO und die Stream Video with with XIAO-ESP32-S3-Sense Tutorials an.
Aufgrund der begrenzten Rechenleistung kannst du auf einem Mikrocontroller nur vergleichsweise kleine KI-Modelle ausführen. Die Genauigkeit der Personenerkennung und damit der Raumbelegungsmessungen ist nicht so gut wie bei einem größeren Modell, das z. B. auf einem Server mit GPU läuft.
Andererseits, wenn Datenschutz wichtig ist, die Wi-Fi-Verbindung instabil ist oder du mit Batteriebetrieb arbeiten möchtest, ist eine Edge AI Lösung besser. Und obwohl die Genauigkeit des Modells nicht perfekt ist, reicht sie aus, um Heizung oder Lüftung eines Raums zu regeln.
Wenn du Fragen hast, hinterlasse sie gerne im Kommentarbereich.
Viel Spaß beim Tüfteln 😉

