Luftqualitätssensor mittels ESP32 (CO2, Luftfeuchtigkeit, Temperatur)

In diesem Blogbeitrag zeige ich dir, wie du mit einem Arduino, dem Sensirion SCD30 CO2 Sensor und einem kleinen schicken OLED Display einen einfachen, aber effektiven CO2-Monitor erstellst.

Was Du Brauchst

  1. ESP32: Der Mikrocontroller welcher sich um alles kümmert.
  2. Sensirion SCD30 Luftsensor: Misst CO2, Temperatur und Luftfeuchtigkeit.
  3. OLED Display: Zeigt deine Messwerte an.
  4. Jumperkabel
  5. Mini-Breadboard oder Lysterklemme oder Wagoklemme. Wenn Du einen Lötkolben hast, kannst Du auch die Verdrahtung löten.

Verkabelung

Sowohl das Display als auch der Sensor unterstützen die I2C-Kommunikation und können beide mit einer Spannung zwischen 3 und 5 Volt betrieben werden. Wenn du einen ESP32 verwendest, werden normalerweise die Pins 21 für SDA und 22 für SCL für die I2C-Kommunikation verwendet. Die Pins auf dem Display und dem Sensor sind beschriftet, daher musst du sie einfach richtig miteinander verbinden. I2C ist ein Bussystem, was bedeutet, dass du die SDA- und SCL-Kabel beider I2C-Geräte an die Pins 21 und 22 anschließen kannst. Ich habe dafür eine Wagoklemme verwendet, aber du kannst sie natürlich auch durch Löten miteinander verbinden.

Code

Stelle sicher das du alle notwendigen Bibliotheken in deiner Arduino IDE installiert hast. Die benötigten Bibliotheken:
Wire.h für die Kommunikation
SparkFun_SCD30_Arduino_Library für den SCD30-Sensor
Adafruit_GFX, Adafruit_SH110X für das Display.

#include <Wire.h>
#include "SparkFun_SCD30_Arduino_Library.h"
#include <Adafruit_GFX.h>
#include <Adafruit_SH110X.h>

SCD30 airSensor;
Adafruit_SH1106G display(128, 64, &Wire, -1);

unsigned long previousMillis = 0;  // Zeitstempel für das letzte Update
const long interval = 180000;      // Intervall für die Verschiebung (3 Minuten)
int offsetX = 0;                   // Anfangswerte für die Verschiebung
int offsetY = 0;

void setup() {
  Wire.begin();
  Serial.begin(9600);
  airSensor.begin();

  display.begin(0x3C, true); 
  display.clearDisplay(); 
  display.setTextSize(2);
  display.setTextColor(SH110X_WHITE);
}

void loop() {
  unsigned long currentMillis = millis();

  // Überprüft, ob das Intervall abgelaufen ist
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;  // Speichert den aktuellen Zeitstempel

    // Verschiebt die Cursorposition leicht
    offsetX = (offsetX + 1) % 5;     // Verschiebt um 1 Pixel bis zu 5, dann zurück auf 0
    offsetY = (offsetY + 1) % 5;     
  }

  if (airSensor.dataAvailable()) {
    display.clearDisplay(); 

    // CO2-Wert in ppm
    display.setCursor(offsetX, offsetY);
    display.print(airSensor.getCO2());
    display.println(" ppm");

    // Temperatur in Grad Celsius
    display.setCursor(offsetX, 20 + offsetY);
    display.print(airSensor.getTemperature(), 1);
    display.println(" C");

    // Relative Luftfeuchtigkeit in Prozent
    display.setCursor(offsetX, 40 + offsetY);
    display.print(airSensor.getHumidity(), 1);
    display.println(" %");

    display.display(); 
  } else {
    // Optional: Nachricht, wenn keine Daten verfügbar sind
    // Serial.println("Warte auf Daten...");
  }

  delay(500);
}

Setup

Zuerst initialisierst du die Komponenten. Mit Wire.begin() und Serial.begin(9600) startest du die Kommunikation. Dann initialisierst du den SCD30-Sensor und das Display. Das Display wird für eine klare Anzeige vorbereitet – Größe, Farbe und Schrift.

Der Hauptteil

Im loop-Teil des Skripts geschieht die Magie:

  1. Zeitsteuerung: Durch das Speichern der letzten Zeit und den Vergleich mit dem aktuellen Zeitpunkt wird alle 3 Minuten (180000 Millisekunden) eine Aktion ausgeführt. Hierbei wird die Anzeigeposition des Textes leicht verschoben, um ein Einbrennen des Bildschirms zu verhindern.
  2. Datenabfrage: Der Code prüft, ob der SCD30-Sensor Daten zur Verfügung hat. Falls ja, werden diese auf dem Display angezeigt:
  • CO2-Konzentration: Angezeigt in ppm (Teile pro Million).
  • Temperatur: In Celsius.
  • Luftfeuchtigkeit: In Prozent.

Anzeige auf dem Display

Die Werte werden mit einer leichten Verschiebung angezeigt, um ein dynamisches Bild zu erzeugen. Das erhöht nicht nur die Ästhetik, sondern schützt auch dein Display vor Einbrennen.

3D Druck Gehäuse

Der Druck erfordert keine besonderen Einstellungen, ich empfehle jedoch Support vorne um die Struktur oberhalb des Displays zu stützen.
Der Deckel sollte mit Tree Support gedruckt werden.
3D Druck Dateien

Abschluss

Mit diesem Projekt hast du einen leistungsfähigen CO2-Monitor. Eine Homeassistant Integration wird in wenigen Tagen folgen.

🤞 1x pro Monat unsere News, Tipps und Tutorials gebündelt direkt in dein Postfach!

Wir senden keinen Spam! Erfahre mehr in unserer Datenschutzerklärung.


Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.