Arduino-Projekt: Werte der Luftqualität mit ENS160 und AHT21 messen und auswerten

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-WertLuftqualitätBeschreibung
0-50GutDie Luftqualität ist zufriedenstellend, und es besteht kein Risiko für die Gesundheit.
51-100MäßigDie Luftqualität ist akzeptabel; für empfindliche Personen können jedoch leichte gesundheitliche Auswirkungen auftreten.
101-150Ungesund für empfindliche GruppenMitglieder empfindlicher Gruppen können gesundheitliche Auswirkungen spüren. Die allgemeine Bevölkerung ist wahrscheinlich nicht betroffen.
151-200UngesundJeder kann gesundheitliche Auswirkungen spüren; Mitglieder empfindlicher Gruppen können ernstere Gesundheitsprobleme haben.
201-300Sehr ungesundGesundheitswarnung: Jeder kann ernstere Gesundheitsprobleme haben.
301-500GefährlichGesundheitsalarm: 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 ModulArduino R4 Pin
VCC3.3V
GNDGND
SDASDA (A4)
SCLSCL (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:

  1. Öffne die Arduino IDE.
  2. Gehe zu Sketch > Include Library > Manage Libraries.
  3. 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:


,
Datenschutz-Übersicht

Diese Website verwendet Cookies, damit wir dir die bestmögliche Benutzerkomfort bieten können. Cookie-Informationen werden in deinem Browser gespeichert und führen Funktionen aus, wie das Wiedererkennen von dir, wenn du auf unsere Website zurückkehrst und hilft uns zu verstehen, welche Abschnitte der Website für dich am interessantesten und nützlichsten sind.