CO2-Sensor – ENS160 – ESP32 Tutorial
Einleitung
In diesem Tutorial erfährst du, wie du einen ENS160 CO2-Sensor mit einem ESP32 Mikrocontroller verbindest und ausliest. Wir führen dich Schritt für Schritt durch den gesamten Prozess, von den benötigten Komponenten bis zur fertigen Anwendung.
Du lernst, wie der ENS160 und der ESP32 miteinander verbunden werden, welche Software und Bibliotheken in der Arduino IDE erforderlich sind und wie der Beispielcode funktioniert. Der Artikel deckt die erforderlichen Komponenten ab, erklärt den Schaltungsaufbau detailliert, erläutert den Code und zeigt dir, wie du die Anwendung in Betrieb nimmst.
Verschaltung
Teile
1x ESP32
1x ENS160
4x Verbindungskabel
Bibliotheken
Wire.h
SparkFun_ENS160.h
Adafruit_AHTX0.h
Code
Übersicht – ENS160 + ESP32
Bevor wir mit dem eigentlichen Aufbau beginnen, lass uns einen Blick darauf werfen, was du für dieses Projekt alles benötigst. Die gute Nachricht ist, die Liste ist überschaubar, sodass du schnell loslegen kannst.
Hier ist eine Auflistung der benötigten Komponenten:
1x ESP32
1x ENS160
4x Verbindungskabel (Dupont-Kabel)

Pinout – ENS160
Der ENS160-Sensor verfügt über eine übersichtliche Pinbelegung, die den Anschluss an deinen ESP32 denkbar einfach macht. Es handelt sich um vier essenzielle Pins, die für die Stromversorgung und die Kommunikation über das I2C-Protokoll zuständig sind.
Hier siehst du die einzelnen Pins und ihre Funktionen:
VCC: Dies ist der Pin für die Spannungsversorgung des Sensors.
GND: Dies ist der Masse-Pin, der für eine stabile Stromversorgung unerlässlich ist.
SCL: Der Serial Clock Pin, über den die Taktsignale für die Datenübertragung gesendet werden.
SDA: Der Serial Data Pin, über den die eigentlichen Daten zwischen ENS160 und ESP32 ausgetauscht werden.

Neben dem ENS160-Sensor, findet sich auf dem Modul auch der AHT21-Sensor.
Der ENS160 ist ein digitaler Multi-Gas-Sensor, der die Luftqualität basierend auf flüchtigen organischen Verbindungen (VOCs) und äquivalentem CO2 (eCO2) bewertet.
Bei dem AHT21 handelt es sich um einen Temperatur- und Feuchtigkeitssensor, der dir wichtige Informationen über das Raumklima liefert.
Hardware Aufbau / Verkabelung / Schaltungsaufbau
Der Hardware-Aufbau des ENS160 mit dem ESP32 ist unkompliziert. Du musst lediglich vier Verbindungen herstellen, um die Kommunikation zwischen den beiden Komponenten zu gewährleisten. Verbinde den VIN-Pin deines ESP32 mit dem VCC-Pin des ENS160. Danach schließt du den GND-Pin des ESP32 an den GND-Pin des ENS160 an. Für die Datenübertragung über I2C verbindest du den SCL-Pin des ENS160 mit dem GPIO22-Pin des ESP32 und den SDA-Pin des ENS160 mit dem GPIO21-Pin des ESP32. Diese wenigen Schritte sind alles, was du für die grundlegende Funktionalität benötigst.
ESP32 VIN → ENS160 VIN-Pin
ESP32 GND → ENS160 GND
ESP32 D22 → ENS160 SCL-Pin
ESP32 D21 → ENS160 SDA-Pin

Eine sorgfältige und korrekte Verdrahtung ist entscheidend, damit dein ESP32 die Signale des ENS160 zuverlässig empfängt. Nachdem du diese Verbindungen hergestellt hast, bist du bereit, mit der Programmierung fortzufahren. Im nächsten Abschnitt gehen wir ausführlich darauf ein, wie du die nötige Bibliothek einbindest und den Code für deinen ENS160 programmierst.
Software Programmierung
Sobald der Hardware-Aufbau erfolgreich abgeschlossen ist, widmen wir uns der Arduino-Programmierung. In diesem Abschnitt behandeln wir die essenziellen Schritte zur Codeerstellung und erläutern die Schlüsselfunktionen, die du verwenden wirst.
Schritt 1: IDE Projekt
Zuerst öffnest du die Arduino-IDE und erstellst ein neues Projekt. Falls du die Arduino-IDE noch nicht installiert hast, findest du unter folgendem Link eine Anleitung dazu:
>
Nachdem du die Arduino-IDE geöffnet hast, legst du ein neues Projekt an, indem du auf „Datei“ und dann auf „Neu“ klickst. Dies öffnet ein neues Sketch-Fenster, in das du deinen Code eingeben kannst.
// Hier kommt dein Code
void setup()
{
// Initialisierung
}
void loop()
{
// Schleife
}
Schritt 2: Bibliotheken einbinden
Um die Daten des ENS160 auszulesen, ist es notwendig, die passende Bibliothek in deine Arduino-IDE einzubinden. Gehe dazu in der Menüleiste auf „Sketch“, wähle „Bibliothek einbinden“ und klicke dann auf „Bibliotheken verwalten…“. Suche in der Bibliotheksverwaltung nach den folgenden Bibliotheken: „Wire.h“, „SparkFun_ENS160.h“ und “Adafruit_AHTX0.h”. Installiere diese Bibliotheken, um die erforderlichen Funktionen zur Erfassung und Auslesung der Sensordaten zu erhalten.

#include <Wire.h>
#include <SparkFun_ENS160.h> // ENS160 Bibliothek
#include <Adafruit_AHTX0.h> // AHT21 Bibliothek
Schritt 3: Initialisierung
Vor dem void setup()-Block werden die benötigten Bibliotheken eingebunden und die Sensoren initialisiert. #include
// Sensoren initialisieren
SparkFun_ENS160 ens160;
Adafruit_AHTX0 aht;
Schritt 4: Void Setup
Im void setup()-Block wird die serielle Kommunikation gestartet, damit du die Sensordaten auf deinem Computer verfolgen kannst. Es wird eine Wartefunktion implementiert, die sicherstellt, dass der serielle Monitor bereit ist, bevor der Code fortfährt. Danach wird die I2C-Kommunikation initialisiert, die für die Verbindung zwischen deinem ESP32 und dem ENS160 sowie dem AHT21 unerlässlich ist. Anschließend werden beide Sensoren initialisiert. Sollte die Initialisierung fehlschlagen, gibt der Code eine Fehlermeldung aus und stoppt, um dir bei der Fehlersuche zu helfen.
void setup() {
Serial.begin(9600); // Serielle Kommunikation initialisieren - 9600 bits pro Sekunde
while (!Serial); // Warte auf Seriellen Monitor
Wire.begin(); // I²C starten
// ENS160 initialisieren
if (ens160.begin() == false) {
Serial.println("ENS160 nicht gefunden. Bitte Verkabelung prüfen!");
while (1);
}
ens160.setOperatingMode(SFE_ENS160_RESET);
delay(100);
ens160.setOperatingMode(SFE_ENS160_STANDARD);
// AHT21 initialisieren
if (!aht.begin()) {
Serial.println("AHT21 nicht gefunden. Bitte Verkabelung prüfen!");
while (1);
}
Serial.println("Sensoren bereit!");
}
Schritt 5: Loop Setup
Der void loop()-Block ist das Herzstück deines Programms und wird kontinuierlich ausgeführt. Hier werden die Daten des ENS160 und des AHT21 ausgelesen. Zuerst prüft der Code, ob neue Daten vom ENS160 verfügbar sind. Ist dies der Fall, werden der Luftqualitätsindex (AQI), der äquivalente CO2-Wert (eCO2) und die flüchtigen organischen Verbindungen (VOC) ausgelesen und auf dem seriellen Monitor ausgegeben. Direkt danach werden die Temperatur- und Luftfeuchtigkeitsdaten vom AHT21 abgefragt und ebenfalls ausgegeben. Eine kurze Verzögerung von 2 Sekunden sorgt dafür, dass die Messwerte nicht zu schnell nacheinander eintreffen und der serielle Monitor übersichtlich bleibt.
void loop() {
// ENS160-Daten auslesen
if (ens160.checkDataStatus()) {
int aqi = ens160.getAQI();
int co2 = ens160.getECO2();
int voc = ens160.getTVOC();
Serial.print("AQI: "); Serial.println(aqi);
Serial.print("CO₂: "); Serial.print(co2); Serial.println(" ppm");
Serial.print("VOC: "); Serial.print(voc); Serial.println(" ppb");
}
// AHT21-Daten auslesen
sensors_event_t humidity, temp;
aht.getEvent(&humidity, &temp);
Serial.print("Temperatur: "); Serial.print(temp.temperature); Serial.println(" °C");
Serial.print("Luftfeuchtigkeit: "); Serial.print(humidity.relative_humidity); Serial.println(" %");
Serial.println("");
delay(2000); // 2 Sekunden warten
}
Gesamter Code
Hier findest du noch einmal den vollständigen Programmier-Code zur Übersicht.
#include <Wire.h>
#include <SparkFun_ENS160.h> // ENS160 Bibliothek
#include <Adafruit_AHTX0.h> // AHT21 Bibliothek
// Sensoren initialisieren
SparkFun_ENS160 ens160;
Adafruit_AHTX0 aht;
void setup() {
Serial.begin(9600); // Serielle Kommunikation initialisieren - 9600 bits pro Sekunde
while (!Serial); // Warte auf Seriellen Monitor
Wire.begin(); // I²C starten
// ENS160 initialisieren
if (ens160.begin() == false) {
Serial.println("ENS160 nicht gefunden. Bitte Verkabelung prüfen!");
while (1);
}
ens160.setOperatingMode(SFE_ENS160_RESET);
delay(100);
ens160.setOperatingMode(SFE_ENS160_STANDARD);
// AHT21 initialisieren
if (!aht.begin()) {
Serial.println("AHT21 nicht gefunden. Bitte Verkabelung prüfen!");
while (1);
}
Serial.println("Sensoren bereit!");
}
void loop() {
// ENS160-Daten auslesen
if (ens160.checkDataStatus()) {
int aqi = ens160.getAQI();
int co2 = ens160.getECO2();
int voc = ens160.getTVOC();
Serial.print("AQI: "); Serial.println(aqi);
Serial.print("CO₂: "); Serial.print(co2); Serial.println(" ppm");
Serial.print("VOC: "); Serial.print(voc); Serial.println(" ppb");
}
// AHT21-Daten auslesen
sensors_event_t humidity, temp;
aht.getEvent(&humidity, &temp);
Serial.print("Temperatur: "); Serial.print(temp.temperature); Serial.println(" °C");
Serial.print("Luftfeuchtigkeit: "); Serial.print(humidity.relative_humidity); Serial.println(" %");
Serial.println("");
delay(2000); // 2 Sekunden warten
}
Ausführung / Anwendung
Nachdem du den Code in die IDE eingegeben hast, muss dieser noch ausgeführt und auf deinen ESP32 übertragen werden. Gehe dazu wie folgt vor:
Schritt 1: Kompilieren (Haken-Symbol)
Klicke auf das Häkchen-Symbol in der oberen linken Ecke der Arduino-IDE. Dies kompiliert deinen Code und prüft ihn auf Fehler. Eventuelle Fehler werden im unteren Bereich der IDE angezeigt.
Schritt 2: Hochladen (Pfeil-Symbol)
Nachdem der Code fehlerfrei kompiliert wurde, klicke auf das Pfeil-Symbol (rechts neben dem Häkchen). Dadurch wird der Code auf deinen ESP32 hochgeladen. Achte darauf, dass der richtige Board-Typ und der korrekte Port in den Tools der IDE ausgewählt sind.
Schritt 3: Serieller Monitor öffnen
Sobald der Code erfolgreich hochgeladen wurde, öffne den seriellen Monitor. Diesen findest du in der oberen rechten Ecke der IDE als Lupe-Symbol. Hier werden die vom ENS160 und AHT21 ausgelesenen Messwerte angezeigt.
Schritt 4: Messwerte auf dem Display ausgeben
Wenn du ein Display angeschlossen hast, werden die CO2-Werte des ENS160 sowie die Temperatur- und Luftfeuchtigkeitswerte des AHT21 darauf ausgegeben. So hast du die Messwerte jederzeit im Blick, ohne den seriellen Monitor nutzen zu müssen.
Erklärung – Messwerte – ENS160
Dein ENS160 und AHT21 liefern dir verschiedene Messwerte, die auf den ersten Blick vielleicht etwas kryptisch wirken können. Im Folgenden wird genau erklärt, was die einzelnen Werte bedeuten und welche Rückschlüsse du daraus ziehen kannst.
AQI (Air Quality Index):
Dieser Wert gibt dir einen schnellen Überblick über die allgemeine Luftqualität. Je höher der AQI, desto schlechter ist die Luft. Der Sensor verwendet einen internen Algorithmus, um diesen Index basierend auf den erkannten Gasen zu berechnen. Ein niedriger AQI deutet auf gute Luftqualität hin, während ein hoher Wert auf potenzielle Probleme mit der Raumluft hinweisen kann.
Level | Beschreibung | Vorschlag |
---|---|---|
1 | Exzellent | Keine besonderen Maßnahmen erforderlich. |
2 | Gut | Sorge für eine kontinuierliche und ausreichende Belüftung. |
3 | Mäßig | Belüftung verbessern und auf mögliche Feuchtigkeitsquellen achten. |
4 | Schlecht | Belüftung dringend verstärken und mögliche Ursachen der Verschmutzung identifizieren. |
5 | Extrem schlecht | Verstärkte Belüftung ist in unvermeidbaren Situationen unerlässlich. |
CO₂ (eCO2 – äquivalenter Kohlendioxid-Wert):
Der ENS160 misst nicht direkt den CO2-Gehalt in der Luft, sondern berechnet einen „äquivalenten“ CO2-Wert basierend auf den vorhandenen VOCs. Dieser Wert ist ein guter Indikator für die allgemeine Belüftung. Hohe eCO2-Werte können auf eine schlechte Belüftung hindeuten, was zu Müdigkeit, Konzentrationsschwäche und Kopfschmerzen führen kann. Lüften ist hier die beste Lösung!
eCO2-Wert (ppm) | Luftqualitätsbewertung | Potenzielle Auswirkungen | Empfohlene Maßnahmen |
< 400 | Optimal | Entspricht dem Außenluftniveau, sehr gute Luftqualität. | Regelmäßiges Lüften zur Beibehaltung dieses Niveaus. |
400 – 800 | Gering | Gute bis akzeptable Luftqualität. | Ausreichende Belüftung, um dieses Niveau zu halten. |
801 – 1000 | Akzeptabel / Erhöht | Der Pettenkofer-Wert (1000 ppm) war lange Zeit eine gängige Obergrenze. Erste Anzeichen von „verbrauchter Luft“ möglich. | Lüften ist notwendig, um die Konzentration zu senken und die Luftqualität zu verbessern. |
1001 – 1500 | Mäßig erhöht | Müdigkeit und Konzentrationsschwäche können auftreten. Gefühl von stickiger Luft. | Regelmäßiges und intensives Lüften ist dringend empfohlen. |
1501 – 2000 | Stark erhöht | Deutliche Müdigkeit, Kopfschmerzen und verminderte Leistungsfähigkeit. Erhöhtes Risiko der Übertragung von Atemwegsinfektionen. | Unverzüglich intensiv lüften. Ursachen für unzureichende Belüftung prüfen. |
Über 2000 | Sehr hoch / Kritisch | Erhebliche Einschränkungen des Wohlbefindens, starke Müdigkeit, Kopfschmerzen, Schwindel, potenziell stärkere gesundheitliche Auswirkungen. | Bereich sofort gut belüften oder verlassen. Langfristige Maßnahmen zur Belüftungsverbesserung sind unerlässlich. |
VOC (TVOC – Total Volatile Organic Compounds):
VOCs sind eine Vielzahl von gasförmigen Substanzen, die aus verschiedenen Quellen stammen können, wie z.B. Farben, Reinigungsmitteln, Möbeln oder auch dem Menschen selbst. Hohe VOC-Werte können Reizungen der Atemwege und andere gesundheitliche Probleme verursachen. Der TVOC-Wert ist ein guter Indikator für die chemische Belastung der Raumluft.
TVOC-Wert (ppb) | Luftqualitätsbewertung | Potenzielle Auswirkungen | Empfohlene Maßnahmen |
0 – 400 | Sehr gut | Unbedenklich; keine bekannten gesundheitlichen Auswirkungen. | Regelmäßiges Lüften zur Aufrechterhaltung der Frischluft. |
401 – 1000 | Gut | Akzeptable Luftqualität; bei empfindlichen Personen sind leichte Reizungen möglich. | Lüften empfohlen, besonders bei längerer Anwesenheit. |
1001 – 2500 | Mäßig | Leichte bis mäßige Reizungen der Augen, Nase oder Rachen sind möglich. | Verstärktes Lüften, Ursachen für hohe VOC-Werte identifizieren (z.B. neue Möbel, Reinigungsmittel). |
2501 – 5000 | Erhöht | Möglichkeit von Kopfschmerzen, Schwindel, Müdigkeit; Reizungen der Atemwege. | Unverzüglich intensiv lüften. Quellen der VOCs beseitigen oder minimieren. |
5001 – 10000 | Ungesund | Deutliche gesundheitliche Beschwerden, wie starke Kopfschmerzen, Übelkeit und Konzentrationsschwierigkeiten. | Sofortiges und gründliches Lüften. Aufenthalt in dem Bereich nach Möglichkeit reduzieren. |
Über 10000 | Gefährlich | Schwerwiegende gesundheitliche Auswirkungen, auch bei kurzer Exposition. | Bereich meiden. Professionelle Untersuchung der Ursache und Belüftungsmaßnahmen erforderlich. |
Temperatur (°C):
Dieser Wert gibt die aktuelle Raumtemperatur in Grad Celsius an. Eine angenehme Raumtemperatur ist entscheidend für das Wohlbefinden und die Konzentration.
Luftfeuchtigkeit (%):
Dieser Wert gibt die relative Luftfeuchtigkeit in Prozent an. Eine optimale Luftfeuchtigkeit liegt in der Regel zwischen 40 % und 60 %. Ist die Luft zu trocken, können Schleimhäute austrocknen und zu Reizungen führen. Ist sie zu feucht, besteht Schimmelgefahr.
Wichtiger Hinweis und Haftungsausschluss
Bitte beachte, dass die in diesem Tutorial und den dazugehörigen Tabellen bereitgestellten Informationen sowie die Messwerte deines ENS160 und AHT21 Sensors ausschließlich zu Informations- und Bildungszwecken dienen. Die dargestellten Grenzwerte und Empfehlungen basieren auf gängigen Standards und allgemeinen Erkenntnissen zur Luftqualität.
Diese Informationen und die vom Sensor gelieferten Daten sind nicht dazu bestimmt, medizinische Ratschläge zu ersetzen, professionelle Messungen zu validieren oder als Grundlage für sicherheitsrelevante Entscheidungen zu dienen. Abweichungen in den Messungen können durch verschiedene Faktoren wie die Kalibrierung des Sensors, Umgebungsbedingungen, technische Grenzen des Sensors und andere Einflüsse entstehen.
Bei gesundheitlichen Bedenken, anhaltenden Symptomen oder wenn du eine professionelle Beurteilung der Luftqualität benötigst, konsultiere bitte immer qualifiziertes Fachpersonal (z.B. Ärzte, Umweltanalytiker oder Gebäudetechniker). Eine Haftung für direkte oder indirekte Schäden, die aus der Nutzung oder Interpretation der hier bereitgestellten Informationen entstehen, ist ausgeschlossen.
Test des Sensors – ENS160
Im Folgenden testen wir den Sensor indem wir diesen kurz anpusten. Wie zu sehen, verändert sich hierdurch die Messwerte
