Auf meine Raspberry Picos habe ich geraume Zeit warten müssen, denn ich habe sie in England bestellt. Angesichts der Brexit-Turbulenzen im Frachtwesen war das nicht besonders schlau. Aber jetzt sind sie da, und gestern habe ich damit eine kleine CO2-Ampel gebaut.
Hardware
Schauen wir uns die Hardware an, die dafür benötigt wird. Als Anzeige dient eine LED-Ampel. Sie zeigt normale, erhöhte und hohe CO2-Konzentration in grün, gelb und rot an.
Die Messwerte liefert ein CCS811-Chip, der mit einem Metalloxid-Sensor arbeitet und je einen Wert für VOC (volatile organic compounds, flüchtige organische Stoffe) und Kohlendioxid, CO2, ausgibt. Mein Sensor ist von Keyestuido, es gibt mehrere weitere, etwa von Adafruit oder Sparkfun. Sie alle werden über die I2C-Schnittstelle ausgelesen, denn diese ist schon im CCS811-Chip integriert.
Der Raspberry Pico wurde hier im Blog bereits ausführlich vorgestellt.
Kosten
14 € für den Sensor
4 € für den Raspberry Pico
1,20 € für die LED-Ampel
Dazu kommen wenige Cent für die Verdrahtung, damit liegt das kleine Projekt bei unter 20 Euro.
Verkabelung
Der VCC-Pin des Sensors wird mit 3V3(OUT) des Pico verbunden (physisch Pin 36). Die I2C-Pins des Sensors, also SCL und SDA, werden mit GP0 (SDA) und GP1 (SCL) des Pico verbunden. GND und(!) WAKE des Sensors verbinden wir mit einem beliebigen GND-Pin des Pico. Das gleiche gilt für den GND-Pin der LED-Ampel.
Die Pins an der LED-Ampel, die die einzelnen LEDs zum Leuchten bringen, habe ich am Pico auf GP2 (grün), GP3 (gelb) und GP4 (rot) gelegt. Vorwiderstände habe ich nicht benutzt. Die Gefahr ist mein Leben.
Messwerte
Bei der Frage, welche CO2-Konzentration als bedenklich gelten soll, orientiere ich mich an einer Publikation des Bundesumweltamtes:
Der Hersteller des Sensors empfiehlt, den neuen CCS811 bei der ersten Inbetriebnahme 48 Stunden lang ununterbrochen messen zu lassen. Danach kann man bei jeder erneuten Inbetriebnahme nach 20 Minuten stabile Messwerte erwarten (Datenblatt).
Software
Die Software läuft bei mir unter CircuitPython (dieser Link führt zur aktuellen Version, die Installation funktioniert analog zu MicroPython). MicroPython wäre mir lieber gewesen, weil es für den Pico optimiert ist. Leider ist die nötige Bibliothek für die Kommunikation mit dem CCS811 noch nicht für MicroPython verfügbar.
Ein großes Problem ist das aber nicht. CircuitPython und MicroPython sind Geschwister und entsprechend ähnlich. Die CCS811-Bibliothek findet sich hier, sie heißt »adafruit_ccs811.py«. Im Stammverzeichnis des Pico lege ich das Verzeichnis /lib an und lege die Bibliothek hinein.
Dieses kleine Programm liest beide Werte (CO2 und VOC) aus und schreibt die Messwerte auf die Konsole. Zur Steuerung der Ampel-LEDs wird nur der CO2-Wert herangezogen:
import time import board import busio import adafruit_ccs811 from digitalio import DigitalInOut, Direction # LED setup. ledgreen = DigitalInOut(board.GP2) ledyellow = DigitalInOut(board.GP3) ledred = DigitalInOut(board.GP4) ledgreen.direction = Direction.OUTPUT ledyellow.direction = Direction.OUTPUT ledred.direction = Direction.OUTPUT #I2C setup i2c = busio.I2C(scl=board.GP1, sda=board.GP0) ccs811 = adafruit_ccs811.CCS811(i2c) # Wait for the sensor to be ready while not ccs811.data_ready: pass while True: print("CO2: {} PPM, TVOC: {} PPM".format(ccs811.eco2, ccs811.tvoc)) if ccs811.eco2 < 1000: ledgreen.value = True ledyellow.value = False ledred.value = False elif ccs811.eco2 > 999 and ccs811.eco2 < 1999: ledgreen.value = False ledyellow.value = True ledred.value = False else: ledgreen.value = False ledyellow.value = False ledred.value = True time.sleep(1)
So sieht die Konsolen-Ausgabe aus. Man kann den Sensor zur Kontrolle etwas provozieren, indem man ihn anpustet – unsere verbrauchte Atemluft enthält viel CO2:
Das Programm lege ich unter dem Namen code.py
im Stammverzeichnis des Pico ab, denn Programme mit diesem Namen werden automatisch ausgeführt, sobald CircuitPython auf dem Pico gestartet wird.
Hallo,
danke für die schöne Anleitung – leider kann man die Grafik nicht so gut lesen.
Kannst Du die Grafik vielleicht etwas größer machen?
Dankeschön!
Mike
Hallo Charly,
ich habe das mit den gleichen Komponenten nachgebaut. Wenn ich das Script starte kommt die Meldung:
Datei „“, Zeile 26, in
Datei „/lib/Adafruit_CCS811.py“, Zeile 60, in init
NameError: Name ‚logging‘ ist nirgends definiert worden (Schreibweise kontrollieren)
Ich bin mir aber auch nicht sicher, ob Du mit CCS811-Bibliothek in ein Verzeichnis lib im pico-Stammverzeichnis meins, dass lediglich das unter dem Link https://github.com/adafruit/Adafruit_CircuitPython_CCS811/blob/master/adafruit_ccs811.py Script als adafruit_css811.py in das lib-Verzeichnis abgelegt werden muss, oder ob noch mehr dazugehört?
Ich hatte den CCS811-Sensor zunächst (mit einem anderen Tutorial) an einem Raspberry Pi 3b probiert, da funktionierte der sehr gut. Nun würde ich das kostengünstiger mit einem Pico aufbauen wollen…
Über einen Tipp würde ich mich sehr freuen.
Viele Grüße
Martin
Hallo,
bei mir hat es mit folgenden libs (https://circuitpython.org/libraries) funktioniert.
libs\adafruit_bus_device..
lib\E:\lib\adafruit_register..
lib\adafruit_ccs811.mpy
lib\adafruit_ccs811.py
Grüße
Hallo Joachim,
vielen Dank für den Tipp!
Mit diesen libs ging es auf Anhieb!
Grüße
Martin