Mit dem Raspberry Pi einen eigenen CO₂-Sensor und Luftqualitätsmesser selbst bauen – mit dem richtigen Sensor, einem Python-Script und Bauteilen klappt es.

Schlechte Luft macht müde. Das klingt banal, ist aber messbar. Wer regelmäßig in geschlossenen Räumen arbeitet – Homeoffice, Büro, Kinderzimmer – kennt das Gefühl: Irgendwann wird man träge, die Konzentration lässt nach, und man weiß nicht warum. Oft ist die CO₂-Konzentration der Grund. Und nein, das merkt man nicht immer. Der Körper signalisiert es, aber man ordnet es selten richtig zu.
Ein Raspberry Pi mit CO₂-Sensor löst das Problem – und das für unter 40 Euro.
Welchen Sensor nehmen?
Hier scheiden sich die Lager. Ich habe mit mehreren Optionen experimentiert, und das Ergebnis ist eindeutig: Es hängt davon ab, was Ihnen wichtiger ist – Preis oder Genauigkeit.
| Sensor | Messprinzip | Messbereich | Genauigkeit | Preis ca. |
|---|---|---|---|---|
| Winsen MH-Z19C | NDIR-Infrarot | 0–5.000 ppm | ±(50 ppm + 5%) | ~22 € |
| Sensirion SCD40 | Photoakustisch NDIR | 400–2.000 ppm | ±(50 ppm + 5%) | ~55 € |
| Sensirion SCD41 | Photoakustisch NDIR | 400–5.000 ppm | ±(40 ppm + 5%) | ~65 € |
| ScioSense ENS160 | MOX-Gassensor | VOC/eCO₂ | Schätzwert | ~18 € |
Empfehlung: Der MH-Z19C ist die günstige, solide Wahl für Einsteiger. Der SCD40 oder SCD41 von Sensirion aus der Schweiz liefert präzisere Werte und misst zusätzlich Temperatur und Luftfeuchte auf demselben Chip. Für ein ernsthaftes Monitoring-Projekt würde ich immer zum SCD41 greifen.
Wichtig beim Kauf: Beim MH-Z19C unbedingt die Variante mit Pins (Headers) bestellen – sonst müssen Sie löten. Der SCD40/41 wird per I²C (einem seriellen Zweidraht-Bus) angebunden, was die Verkabelung einfacher macht.
Was Sie noch brauchen
Ehrlich gesagt ist die Liste kurz:
- Raspberry Pi (Zero 2 W, 3B+, 4B oder 5 – alles funktioniert)
- CO₂-Sensor Ihrer Wahl
- Jumper Wires Female-to-Female (4 Stück reichen)
- Raspberry Pi OS Lite oder mit Desktop – beides geht
Optional, aber praktisch: ein kleines OLED-Display (z. B. das 0,96″-Modell mit SSD1306-Chip, unter 5 Euro bei Berrybase oder AZ-Delivery). Damit zeigen Sie die Werte direkt am Gerät an, ohne immer auf den PC schauen zu müssen.
Sensor anschließen – so funktioniert die Verkabelung
MH-Z19C über UART
Der MH-Z19C kommuniziert über die serielle Schnittstelle des Pi (UART). Die Pins schauen Sie sich von unten an:
- Vin → Pin 2 oder 4 des Pi (5V)
- GND → Pin 6 (Masse)
- TXD → Pin 10 (RXD des Pi, GPIO 15)
- RXD → Pin 8 (TXD des Pi, GPIO 14)
SCD40/41 über I²C
Der Sensirion-Sensor läuft über I²C – vier Kabel, fertig:
- VDD → Pin 1 (3,3V)
- GND → Pin 6 (Masse)
- SDA → Pin 3 (GPIO 2)
- SCL → Pin 5 (GPIO 3)
Das passiert öfter, als man denkt: falsches Kabel an falschen Pin, und der Sensor antwortet nicht. Kurz mit i2cdetect -y 1 prüfen – bei korrekter Verbindung erscheint die Adresse 0x62 für den SCD40/41.
Raspberry Pi vorbereiten
Das Betriebssystem läuft? Dann geht es jetzt ans Eingemachte. Raspberry Pi OS aktualisieren:
sudo apt update && sudo apt upgrade -y
Für den MH-Z19C: Serielle Schnittstelle aktivieren
Die UART-Schnittstelle ist standardmäßig deaktiviert. So ändern Sie das:
sudo raspi-configaufrufen- Interface Options → Serial Port
- „Would you like a login shell to be accessible over the serial port?“ → Nein
- „Would you like the serial port hardware to be enabled?“ → Ja
- Neu starten
Für den SCD40/41: I²C aktivieren
sudo raspi-configaufrufen- Interface Options → I2C
- Ja → Neu starten
- Danach:
sudo apt install -y i2c-tools python3-smbus
Python-Skript: Werte auslesen
MH-Z19C auslesen
Bibliothek installieren:
pip3 install mh-z19
Erster Test direkt im Terminal:
sudo python3 -m mh_z19
Ausgabe sollte ungefähr so aussehen: {'co2': 512}. Wenn nicht, UART-Verbindung prüfen.
Einfaches Skript zum dauerhaften Loggen:
import mh_z19
import time
while True:
wert = mh_z19.read_all()
print(f"CO₂: {wert.get('co2')} ppm | Temp: {wert.get('temperature')} °C")
time.sleep(10)
SCD40/41 auslesen
Hier empfiehlt sich die Adafruit-Bibliothek – sie funktioniert tadellos unter Raspberry Pi OS:
pip3 install adafruit-circuitpython-scd4x adafruit-blinka
Skript:
import time
import board
import adafruit_scd4x
i2c = board.I2C()
sensor = adafruit_scd4x.SCD4X(i2c)
sensor.start_periodic_measurement()
print("Warte auf erste Messung...")
time.sleep(5)
while True:
if sensor.data_ready:
print(f"CO₂: {sensor.CO2} ppm")
print(f"Temperatur: {sensor.temperature:.1f} °C")
print(f"Luftfeuchte: {sensor.relative_humidity:.1f} %")
time.sleep(10)
Kurz gesagt: Der SCD40/41 liefert neben CO₂ auch Temperatur und Luftfeuchte – ohne zusätzliche Sensoren. Das ist ein echter Vorteil gegenüber dem MH-Z19C.
Sensor kalibrieren – ein Schritt, den viele überspringen
Und der dann für falsche Werte sorgt. Freiluft hat in 2026 eine CO₂-Konzentration von rund 420–425 ppm. Das ist die Basis.
MH-Z19C kalibrieren:
Den Sensor 30 Minuten lang draußen oder neben einem offenen Fenster betreiben, dann:
sudo python3 -m mh_z19 --detection_range_5000
sudo python3 -m mh_z19 --zero_point_calibration
SCD40/41: Der Sensor unterstützt eine automatische Selbstkalibrierung (ASC – Automatic Self-Calibration). Voraussetzung ist, dass er regelmäßig Frischluft mit ~400 ppm CO₂ „sieht“ – also gelegentlich lüften und den Sensor dabei laufen lassen. Das reicht oft schon.
Grenzwerte verstehen – was sagen die Zahlen?
Ab wann wird’s problematisch? Dazu gibt es klare Orientierungswerte:
| CO₂-Konzentration | Bewertung |
|---|---|
| unter 800 ppm | Gute Luftqualität |
| 800–1.000 ppm | Akzeptabel |
| 1.000–1.400 ppm | Spürbar schlechter, Lüften empfehlenswert |
| über 1.400 ppm | Deutliche Beeinträchtigung, sofort lüften |
| über 2.000 ppm | Kopfschmerzen, Konzentrationsprobleme wahrscheinlich |
Ich sehe das regelmäßig bei Leuten, die im Homeoffice mit geschlossenen Fenstern arbeiten: Nach zwei Stunden sind sie über 1.200 ppm. Fünf Minuten Lüften reichen, um das zu halbieren.
Was kommt nach dem ersten Messwert?
Werte ausgeben ist der Anfang. Interessanter wird es mit einer kleinen Verlaufskurve oder einem Dashboard. Zwei Optionen, die sich in der Praxis bewährt haben:
Option 1: InfluxDB + Grafana – die Kombination für alle, die ihre Daten langfristig speichern und grafisch darstellen wollen. Auf dem Raspberry Pi 4B oder 5 läuft das flüssig. InfluxDB nimmt die Messwerte per Python-Skript entgegen, Grafana zeigt sie im Browser als Diagramm an. Aufwand: ein Nachmittag.
Option 2: Eine CSV-Datei – simpel, aber unterschätzt. Werte mit Zeitstempel in eine Textdatei schreiben, später in LibreOffice Calc öffnen und als Diagramm ausgeben. Für gelegentliche Analysen vollkommen ausreichend.
import csv, time
with open("co2_log.csv", "a", newline="") as f:
writer = csv.writer(f)
writer.writerow([time.strftime("%Y-%m-%d %H:%M:%S"), sensor.CO2,
sensor.temperature, sensor.relative_humidity])
Dieses Skript als Cronjob alle fünf Minuten ausführen lassen – fertig ist das schlichteste Monitoring-System der Welt. Und ja, es funktioniert zuverlässig.
Wer das Skript beim Systemstart automatisch laden will: systemd-Service anlegen oder einfach einen Eintrag in /etc/rc.local setzen. Das spart Zeit und verhindert, dass man nach jedem Neustart wieder manuell eingreifen muss.
Fazit
Ein selbst gebauter CO₂-Sensor und Luftqualitätsmesser auf Basis eines Raspberry Pi ist eine kostengünstige, flexible und lehrreiche Lösung, um die Luftqualität in Innenräumen zu überwachen. Mit den richtigen Sensoren, einer sorgfältigen Kalibrierung und der passenden Software lassen sich CO₂, Feinstaub und Luftfeuchtigkeit präzise messen.
Durch Visualisierung und Benachrichtigungen können Sie rechtzeitig Maßnahmen ergreifen, die Gesundheit schützen und das Raumklima verbessern.
Ein solches Projekt bietet nicht nur praktische Vorteile, sondern vermittelt auch tiefere Einblicke in Sensorik, Datenverarbeitung und Automatisierung – ideal für Technikinteressierte und alle, die ihre Umgebung aktiv überwachen möchten.
