CO2-Ampel mit dem Raspberry Pico und CircuitPython

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.

 

4 Gedanken zu „CO2-Ampel mit dem Raspberry Pico und CircuitPython“

  1. 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

  2. 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

  3. Hallo Joachim,

    vielen Dank für den Tipp!
    Mit diesen libs ging es auf Anhieb!

    Grüße
    Martin

Kommentare sind geschlossen.