Wie schon im Tutorial Kohlendioxid Warngerät hatte ich gezeigt, wie ein CO2 Messgerät mit einem SCD30 Sensor zur Überprüfung der Umgebungsluftqualität erstellt wurde.
Da inzwischen weitere und günstigere Sensoren am Markt erhältlich sind, möchte ich hier einmal zeigen, wie mit dem Arduino R4, Umgebungsdaten wie Luftqualität (eCO₂, VOC) und Temperatur/Luftfeuchtigkeit mit den Sensoren ENS160 + AHT21, das hier auf einem Modul angeboten wird, messen kannst.

Das Modul wird über I²C angeschlossen, und zeige die passenden Bibliotheken, um die Daten auszulesen und im Seriellen Monitor anzuzeigen.
Da CO₂ und VOC in ppm (parts per million) ausgegeben wird, ist die zusätzliche Ausgabe in AQI (Air Quality Index) eine gute Ergänzung die gemessenen Werte besser zu bewerten.
Der Air Quality Index (AQI) ist eine Skala, die verwendet wird, um die Qualität der Luft anzuzeigen. Der AQI gibt einen einfachen und verständlichen Wert an, der die Luftqualität von „gut“ bis „gefährlich“ klassifiziert. Hier ist eine Übersicht der typischen AQI-Kategorien und deren Bedeutung:
AQI-Wert | Luftqualität | Beschreibung |
---|---|---|
0-50 | Gut | Die Luftqualität ist zufriedenstellend, und es besteht kein Risiko für die Gesundheit. |
51-100 | Mäßig | Die Luftqualität ist akzeptabel; für empfindliche Personen können jedoch leichte gesundheitliche Auswirkungen auftreten. |
101-150 | Ungesund für empfindliche Gruppen | Mitglieder empfindlicher Gruppen können gesundheitliche Auswirkungen spüren. Die allgemeine Bevölkerung ist wahrscheinlich nicht betroffen. |
151-200 | Ungesund | Jeder kann gesundheitliche Auswirkungen spüren; Mitglieder empfindlicher Gruppen können ernstere Gesundheitsprobleme haben. |
201-300 | Sehr ungesund | Gesundheitswarnung: Jeder kann ernstere Gesundheitsprobleme haben. |
301-500 | Gefährlich | Gesundheitsalarm: Jeder kann schwerwiegende Gesundheitsprobleme haben. |
Der AQI wird typischerweise für die folgenden Schadstoffe berechnet:
- Feinstaub (PM2.5 und PM10)
- Ozon (O3)
- Stickstoffdioxid (NO2)
- Schwefeldioxid (SO2)
- Kohlenmonoxid (CO)
Er basiert auf den Konzentrationen dieser Schadstoffe in der Luft und den damit verbundenen gesundheitlichen Risiken.
Die Skala ist darauf ausgelegt, Menschen schnell und einfach über die Luftqualität in ihrer Umgebung zu informieren und sie über mögliche Gesundheitsrisiken zu warnen. Beispielsweise können empfindliche Personen, wie Menschen mit Atemwegserkrankungen, bei einem hohen AQI entsprechende Vorsichtsmaßnahmen treffen.
Quelle: Luftqualität – Wikipedia
Aktuelle Luftqualität Karte von Europa
Hardware:
Arduino Uno R4 Wifi
ENS160-AHT21 Sensor (Luftqualitätssensor für CO₂ und VOC plus Temperatur- und Luftfeuchtigkeitssensor)
Breadboard und Jumper-Kabel
USB-Kabel für die Stromversorgung und Programmierung
Verdrahtung:
Beide Sensoren kommunizieren über das I²C-Protokoll. Der Arduino R4 hat dafür die Pins SDA (A4) und SCL (A5). Verbinde die Sensoren wie folgt:
ENS160+AHT21 Modul | Arduino R4 Pin |
---|---|
VCC | 3.3V |
GND | GND |
SDA | SDA (A4) |
SCL | SCL (A5) |
Hinweis: Achte darauf, dass das Modul mit 3,3V betrieben werden, da der Arduino R4 und die Sensoren empfindlich auf höhere Spannungen reagieren können.
Belegungsplan findet ihr hier
Bibliotheken installieren:
Um die Sensoren auszulesen, benötigst du passende Bibliotheken. Diese kannst du über den Arduino Library Manager installieren:
- Öffne die Arduino IDE.
- Gehe zu Sketch > Include Library > Manage Libraries.
- Suche nach folgenden benötigten Bibliotheken und installiere diese:
- ENS160 (z. B. „SparkFun Indoor… ENS160 Arduino Library“)
- AHT21 (z. B. „Adafruit AHTx0 Library“)
- Wire (für I²C-Kommunikation, sollte bereits installiert sein).

Quellcode für den Arduino Uno:
Hier ist ein einfacher Sketch, um die Daten beider Sensoren auszulesen und im Seriellen Monitor anzuzeigen:
#include <Wire.h>
#include <SparkFun_ENS160.h>
#include <Adafruit_AHTX0.h>
// Sensoren initialisieren
SparkFun_ENS160 ens160;
Adafruit_AHTX0 aht;
void setup() {
// Serielle Kommunikation starten
Serial.begin(9600);
while (!Serial); // Warte auf Seriellen Monitor
// I²C starten
Wire.begin();
// 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.print(aqi);
Serial.print(", CO₂: "); Serial.print(co2);
Serial.print(" ppm, 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(" %");
// Warte 2 Sekunden
delay(2000);
}
Quellcode für den Arduino Uno R4 Wifi:
Mit diesem Sketch nutze ich die LED Matrix auf dem Board zur Anzeige. Die Library ArduinoGraphics muss sofern nicht schon vorhanden, installiert werden.
#include <Wire.h>
#include <SparkFun_ENS160.h>
#include <Adafruit_AHTX0.h>
#include "ArduinoGraphics.h"
#include "Arduino_LED_Matrix.h"
// Sensoren initialisieren
SparkFun_ENS160 ens160;
Adafruit_AHTX0 aht;
ArduinoLEDMatrix matrix;
void setup() {
// Serielle Kommunikation starten
Serial.begin(9600);
while (!Serial); // Warte auf Seriellen Monitor
// I²C starten
Wire.begin();
// 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);
}
// LED-Matrix initialisieren
matrix.begin();
Serial.println("Sensoren und LED-Matrix bereit!");
// Initialisiere die LED-Matrix
matrix.beginDraw();
matrix.stroke(0xFFFFFFFF);
matrix.textScrollSpeed(25); // Scrollgeschwindigkeit, je kleiner je schneller
matrix.endDraw();
}
void loop() {
// ENS160-Daten auslesen
int aqi = 0, co2 = 0, voc = 0;
if (ens160.checkDataStatus()) {
aqi = ens160.getAQI();
co2 = ens160.getECO2();
voc = ens160.getTVOC();
}
// AHT21-Daten auslesen
sensors_event_t humidity, temp;
aht.getEvent(&humidity, &temp);
// Texte erstellen
String aqiText = " AQI: " + String(aqi);
String co2Text = " CO2: " + String(co2) + " ppm";
String vocText = " VOC: " + String(voc) + " ppb";
String tempText = " Temp: " + String(temp.temperature) + " C";
String humidityText = " Feuchte: " + String(humidity.relative_humidity) + " %";
// Texte auf der LED-Matrix anzeigen
displayScrollingText(aqiText);
displayScrollingText(co2Text);
displayScrollingText(vocText);
displayScrollingText(tempText);
displayScrollingText(humidityText);
// Warte 2 Sekunden
delay(2000);
}
void displayScrollingText(String text) {
matrix.beginDraw();
matrix.stroke(0xFFFFFFFF);
matrix.textScrollSpeed(99); // Scrollgeschwindigkeit
matrix.textFont(Font_5x7);
matrix.beginText(0, 1, 0xFFFFFF);
matrix.println(text);
matrix.endText(SCROLL_LEFT);
matrix.endDraw();
// Wartezeit für das Laufband
delay(1000); // Anpassbar je nach Textlänge und Scrollgeschwindigkeit
}
ENS160-Sensor:
- Der ENS160 misst die Luftqualität und gibt Werte für den Air Quality Index (AQI), CO₂ (in ppm) und flüchtige organische Verbindungen (VOC in ppb) aus.
- Mit ens160.setOperatingMode() wird der Sensor in den Standardmodus versetzt.
AHT21-Sensor:
- Der AHT21 misst Temperatur und Luftfeuchtigkeit.
- Die Daten werden über aht.getEvent() ausgelesen.
Ergebnis und Abgleich mit SCD30 CO2-Sensor
Nachdem du den Sketch hochgeladen hast, öffne den Seriellen Monitor. Der ENS160 benötigt etwas Vorlaufzeit. Du solltest nach spätestens 60 Sek. nun die gemessenen Werte für Luftqualität, Temperatur und Luftfeuchtigkeit sehen.

Wie in meinem Auszug des Seriellen Monitor zu sehen ist, verändert sich dieser sofort, wenn ich diesen anpuste.
Der ENS160 und der SCD30 sind beide Sensoren zur Messung der Luftqualität, aber sie unterscheiden sich in ihrer Funktionsweise und den gemessenen Parametern:
ENS160
- Messgrößen: Der ENS160 misst den Air Quality Index (AQI), CO₂-Äquivalente (eCO₂) und flüchtige organische Verbindungen (TVOC).
- Technologie: Er basiert auf der Metalloxid-Technologie (MOX), die für die Erkennung verschiedener flüchtiger organischer Verbindungen und oxidierender Gase verwendet wird.
- Kommunikation: Der Sensor kommuniziert über I²C oder SPI.
SCD30 (aus vorherigen Projekt)
- Messgrößen: Der SCD30 misst speziell die CO₂-Konzentration in der Luft.
- Technologie: Er verwendet die Infrarot-Absoption (NDIR)-Technologie, die sehr genau und selektiv ist.
- Kommunikation: Der Sensor kommuniziert ebenfalls über I²C.
Fazit:
Der ENS160 ist vielseitiger und misst mehr Parameter, während der SCD30 spezialisiert auf die Messung von CO₂ ist und eine höhere Genauigkeit bietet.
Somit kann man den SCD30 sehr gut zur Kalibrierung der CO₂-Werte heran ziehen.
Video: