CO₂-Wert messen und anzeigen
Überblick
Mit diesem Projekt wird die CO₂-Konzentration in der Luft gemessen und mit einer 7-Segment-Anzeige angezeigt. Zur Messung der CO₂-Konzentration wird der Sensor MH-Z19B eingesetzt. Die 7-Segment-Anzeige TM1637 zeigt den gemessenen Wert an.
In einem ersten Schritt wird die Funktion des CO₂-Sensors getestet, anschließend wird die 7-Segmentanzeige ebenfalls getestet.
Nachdem beide Tests erfolgreich durchgeführt wurden, wird der komplette Hardware-Aufbau mit einem Python-Programm angesteuert.
Die Hauptbestandteile der Luft sind Stickstoff (ca. 78 %), Sauerstoff (ca. 21 %) und Kohlenstoffdioxid (CO₂). Ein zu hoher Anteil an Kohlenstoffdioxid in der Atemluft hat Schadwirkungen auf Tier und Mensch.
Der Kohlenstoffdioxidgehalt der Luft wird in ppm (Parts per Million) angegeben. Anhand des gemessenen Wertes für Kohlenstoffdioxid kann die Luftqualität in Räumen eingeschätzt werden. Die Tabelle unten gibt eine Übersicht über den Zusammenhang von Luftqualität und CO₂-Konzentration.
Hardware
Bei diesem Projekt wird folgende Hardware verwendet:
- Raspberry Pi 3 Model B
- CO₂-Sensor MH-Z19B
- 7-Segmentanzeige 4-stellig TM1637
- diverse Leitungen
Funktionstest des CO₂-Sensors MH-Z19B
Zunächst führen wir einen einfachen Funktionstest des CO₂-Sensors MH-Z19B durch. Dazu wird ein kleines Python-Programm erstellt und auf dem Raspberry Pi ausgeführt. Das Programm gibt die gemessenen CO₂-Werte auf dem Bildschirm aus.
Stromlaufplan für den Test des CO₂-Sensors
Der Stromlaufplan zeigt den Raspberry Pi, den CO₂-Sensor MH-Z19B und die Verbindungen.
Verschaltung MH-Z19B — Raspberry Pi:
Vin — Pin 4
GND — Pin 6
TXD — Pin 8
RXD — Pin 10
Software für den Test des CO₂-Sensors
Voraussetzungen für den Programmablauf:
- Auf dem Raspberry Pi ist das Betriebssystem Raspberry OS Stand April 2026 installiert.
- Der Raspberry Pi ist mit dem Internet verbunden.
- Der Sensor MH-Z19B wird über die serielle Schnittstelle serial0 angesprochen.
Serial0: Pin 8 = TX, Pin 10 = RX
Damit die serielle Schnittstelle serial0 für den Sensor nutzbar ist, muss sie über Einstellungen → Control Centre → Interfaces → Serieller Anschluss aktiviert werden.
Achtung: Der Sensor MH-Z19 benötigt eine Aufwärmzeit von 15 min!
Testprogramm für den CO₂-Sensor erstellen und ausführen
Hinweis:
Die Bibliothek pyserial zur Ansteuerung der seriellen Schnittstelle ist mit dem Betriebssystem schon installiert.
Erstellen Sie ein Projektverzeichnis projekt_co2 und wechseln Sie anschließend in dieses Verzeichnis mit folgenden Befehlen:
- mkdir projekt_co2
- cd projekt_co2
Erstellen Sie in dem Verzeichnis projekt_co2 das Python-Testprogramm mh_z19_auslesen.py – z. B. mit dem Editor Geany.
Programmcode:
Die Datei mh_z19_auslesen.py enthält folgenden Programmcode:
import time
import serial
# Initialisierung UART (MH-Z19B)
# /dev/serial0 ist der Standard-Pfad für UART am Pi
ser = serial.Serial(‚/dev/serial0‘, baudrate=9600, timeout=1)
def get_co2_value():
„““Liest den CO2-Wert vom MH-Z19B über UART.“““
# Befehl zum Auslesen (Standard-Protokoll des MH-Z19B)
cmd = b“\xff\x01\x86\x00\x00\x00\x00\x00\x79″
ser.write(cmd)
res = ser.read(9)
if len(res) == 9 and res[0] == 0xff and res[1] == 0x86:
# CO2-Wert berechnet sich aus Byte 2 und 3
high_byte = res[2]
low_byte = res[3]
co2 = (high_byte * 256) + low_byte
return co2
return None
# — Hauptschleife —
print(„Starte Messung… (Abbruch mit Strg+C)“)
try:
while True:
co2_ppm = get_co2_value()
if co2_ppm is not None:
print(f“CO2-Gehalt: {co2_ppm} ppm“)
else:
print(„Fehler beim Lesen des Sensors“)
display.show(„err „)
time.sleep(5) # Messintervall (der Sensor braucht etwas Zeit)
except KeyboardInterrupt:
print(„\nProgramm beendet.“)
finally:
ser.close()
Mit folgendem Befehl rufen Sie das Testprogramm auf – achten Sie dabei auf die richtige Schreibweise von mh_z19_auslesen:
- sudo python mh_z19_auslesen.py
Das Messergebnis wird ausgegeben, die Ausgabe sieht dann z. B. wie folgt aus:
CO2-Gehalt: 619 ppm
Der gemessene Wert 619 zeigt eine hohe Qualität der Raumluft – geringe CO₂-Konzentration – an.
Funktionstest der 7-Segment-Anzeige TM1637
Jetzt führen wir einen einfachen Funktionstest der 7-Segment-Anzeige TM1637 durch. Dazu wird ein kleines Python-Programm erstellt und auf dem Raspberry Pi ausgeführt. Das Programm gibt diverse Ziffern- und Zeichenfolgen mittels der 7-Segment-Anzeige aus.
Stromlaufplan für den Test der 7-Segment-Anzeige
Der Stromlaufplan zeigt den Raspberry Pi, die 7-Segmentanzeige TM1637 und die Verbindungen.
Verschaltung TM1637 — Raspberry Pi:
+5 V — Pin 2
GND — Pin 6 oder Pin 14
CLK — Pin 38 (GPIO20)
DIO — Pin 40 (GPIO21)
Software für den Test der 7-Segment-Anzeige
Voraussetzungen für den Programmablauf:
- Auf dem Raspberry Pi ist das Betriebssystem Raspberry OS Stand April 2026 installiert.
- Der Raspberry Pi ist mit dem Internet verbunden.
- Die 7-Segment-Anzeige TM1637 wird in diesem Projekt über die Ausgänge GPIO20 und GPIO21 angesteuert.
Testprogramm für die 7-Segment-Anzeige erstellen und ausführen
Erstellen Sie ein Projektverzeichnis projekt_co2 und wechseln Sie anschließend in dieses Verzeichnis mit folgenden Befehlen:
- mkdir projekt_co2
- cd projekt_co2
Erstellen Sie in dem Verzeichnis projekt_co2 das Python-Testprogramm TM1637_test.py – z. B. mit dem Editor Geany.
Programmcode:
Die Datei TM1637_test.py enthält folgenden Programmcode:
import tm1637
import time
from datetime import datetime
# Initialisierung der Anzeige an GPIO 20 (CLK) und GPIO 21 (DIO)
display = tm1637.TM1637(clk=20, dio=21)
# Helligkeit einstellen (0 bis 7)
display.brightness(3)
def test_display():
try:
print(„Starte Test…“)
# 1. Zahlen anzeigen
print(„Zeige Zahl 1234“)
display.number(1234)
time.sleep(2)
# 2. Einzelsegmente (Wort ‚Cool‘)
# Man kann auch eigene Muster definieren
print(„Zeige Text-ähnliche Zeichen“)
display.show(„Cool“)
time.sleep(2)
# 3. Endlosschleife: Aktuelle Uhrzeit (HH:MM)
print(„Zeige aktuelle Uhrzeit (Strg+C zum Beenden)“)
while True:
now = datetime.now()
# Doppelpunkt blinken lassen
display.numbers(now.hour, now.minute, colon=True)
time.sleep(1)
display.numbers(now.hour, now.minute, colon=False)
time.sleep(1)
except KeyboardInterrupt:
# Anzeige beim Beenden löschen
display.write([0, 0, 0, 0])
print(„\nTest beendet.“)
if __name__ == „__main__“:
test_display()
Damit das Ansteuern der 7-Segment-Anzeige ohne Probleme funktioniert muss eine virtuelle Umgebung eingerichtet und aktiviert werden.
Erstellen Sie die virtuelle Umgebung mit folgendem Befehl:
- python -m venv env
Nun müssen Sie die virtuelle Umgebung noch aktivieren. Die Aktivierung der virtuellen Umgebung muss bei jedem Start des Terminals erneut gemacht werden.
- source env/bin/activate
Die benötigte Bibliothek tm1637.py zum Ansteuern der 7-Segment-Anzeige installieren Sie mit folgendem Befehl:
- pip install raspberrypi-tm1637
Die Bibliothek tm1637.py wird installiert nach: ../projekt_co2/env/lib/python3.11/site-packages
Kopieren Sie die Bibliothek tm1637.py nach: ../projekt_co2
Starten Sie das Testprogramm mit folgendem Befehl:
- sudo python TM1637_test.py
Programmablauf beenden:
Den Programmablauf beenden Sie mit:
- Strg+c
Programm zur Anzeige der CO₂-Konzentration erstellen und starten
Hinweis:
Um das folgende Programm erfolgreich ausführen zu können, müssen die Vorbereitungen für die vorhergehenden Testprogramme (z. B. serielle Schnittstelle aktivieren, Bibliothek installieren …) ebenfalls durchgeführt werden.
Erstellen Sie in dem Verzeichnis projekt_co2 das Python-Programm co2_wert_messen.py – z. B. mit dem Editor Geany.
Programmcode:
Die Datei co2_wert_messen.py enthält folgenden Programmcode:
import time
import serial
from tm1637 import TM1637
# — Konfiguration —
# Pins für TM1637 (BCM Nummerierung!)
# Pin 38 ist GPIO 20, Pin 40 ist GPIO 21
CLK = 20
DIO = 21
# Initialisierung Display
display = TM1637(clk=CLK, dio=DIO)
display.brightness(2) # Helligkeit (0 bis 7)
# Initialisierung UART (MH-Z19B)
# /dev/serial0 ist der Standard-Pfad für UART am Pi
ser = serial.Serial(‚/dev/serial0‘, baudrate=9600, timeout=1)
def get_co2_value():
„““Liest den CO2-Wert vom MH-Z19B über UART.“““
# Befehl zum Auslesen (Standard-Protokoll des MH-Z19B)
cmd = b“\xff\x01\x86\x00\x00\x00\x00\x00\x79″
ser.write(cmd)
res = ser.read(9)
if len(res) == 9 and res[0] == 0xff and res[1] == 0x86:
# CO2-Wert berechnet sich aus Byte 2 und 3
high_byte = res[2]
low_byte = res[3]
co2 = (high_byte * 256) + low_byte
return co2
return None
# — Hauptschleife —
print(„Starte Messung… (Abbruch mit Strg+C)“)
try:
while True:
co2_ppm = get_co2_value()
if co2_ppm is not None:
print(f“CO2-Gehalt: {co2_ppm} ppm“)
# Wert auf dem Display anzeigen
display.number(co2_ppm)
else:
print(„Fehler beim Lesen des Sensors“)
display.show(„err „)
time.sleep(5) # Messintervall (der Sensor braucht etwas Zeit)
except KeyboardInterrupt:
print(„\nProgramm beendet.“)
display.write([0, 0, 0, 0]) # Display leeren
finally:
ser.close()
Starten Sie das Programm mit folgendem Befehl:
- sudo python co2_wert_messen.py
Der vom CO₂-Sensor gemessenen Wert wird im Terminal ausgegeben und mit der 7-Segment-Anzeige angezeigt.