CO2-Ampel im Eigenbau

Jan. 11, 2021

Hauptübertragungsweg von SARS-CoV-2 scheinen Tröpfchen und Aerosole zu sein. Gegen Tröpfchen hält man Abstand, gegen Aerosole lüftet man an. Nur wann und wie lange?

CO2-Ampel

Wir Menschen atmen etwa 4% CO2 aus, der CO2-Pegel steigt ohne Luftaustausch also kontinuierlich an und ist damit ein guter Luftqualitätsindikator. Die CO2-Konzentration wird in Teilen pro Million (ppm) gemessen und beträgt ca 400 ppm in der Frischluft. Das ist also die untere Grenze und bei den Sensoren der Nullwert. Das Robert-Koch-Institut bewertete 2017 eine Innenraumkonzentration bis 1000 ppm als unbedenklich, 1000-2000 ppm als auffällig und über 2000 ppm als inakzeptabel. Denkt man sich ein Messgerät als Ampel, erscheinen mir das gute Werte für den Status grün, orange und rot zu sein.

Um den Status-Quo zu messen, nutze ich den nichtdispertiven Infrarotsensor MH-Z19B und einen ESP8266-Mikrocomputer. Eine RGB-Leuchtdiode warnt optisch und ist auch in der Helligkeit variierbar. Den Diffusor spendete ein Bewegungsmelder. Ein Piezobuzzer kann monophone Melodien piepsen und beispielsweise mit dem Titanic-Theme für Untergangsstimmung sorgen. Oder einfach schweigen wie aktuell. Ein kleines Display zeigt den aktuellen Messwert an. Das Gehäusedesign habe ich von Thingiverse heruntergeladen und mit dem 3D-gedruckt, es ist aber für einen kleineren Mikrocomputer gemacht und damit etwas eng.

Die Firmware habe ich mit ESPHome geschrieben, damit kann man wunderbare IoT-Dinge bauen und in Homeassistant integrieren. Oder auch einfach nur Things - ohne Internet - wie eben diese Ampel. Übrigens ein Wiener Projekt! Der (offene) Code folgt unten.

Die Kinder haben in der Neubauschule eine kontrollierte Raumlüftung. Ich habe gerade für beide Klassen eine Ampel gebaut, vielleicht ist aber auch schon ein Steuergerät mit Anzeige vorhanden. Man ist so selten in der Schule gerade. Für uns im Passivhaus ist es interessant mit echten Werten den Luftaustausch der drei Lüftungsstufen zu verstehen.

Bauteile:

Anschlüsse:


Bauteil Bauteil-Pin ESP8266-Pin
OLED SCL D1
OLED SDA D2
Buzzer VCC D5
RGB-LED Din D6
CO2 RX TX
CO2 TX RX

Software (für ESPHome)

# Copyright 2021 Fabian Topfstedt
# Published under MIT license (https://opensource.org/licenses/MIT)

substitutions:
  node_name: co2koala
  verbose_name: KOALA-CO2-AMPEL
  log_level: INFO
  api_password: top-secret-api-password
  ota_password: top-secret-ota-password
  wifi_ssid: school-wifi
  wifi_password: top-secret-school-wifi-password

esphome:
  name: ${node_name}
  platform: ESP8266
  board: nodemcuv2
  on_boot:
    then:
      - display.page.show: page_init
      - delay: 180s  # wait for the MH-Z19 sensor to warm up
      - display.page.show: page_co2_sense

wifi:
  ssid: ${wifi_ssid}
  password: ${wifi_password}

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "${node_name}-ap"
    password: ""

captive_portal:

logger:
  # Disable logging to serial
  baud_rate: 0

# Enable Home Assistant API
api:
  password: ${api_password}
  services:
    - service: mhz19_sensor_calibrate_zero
      then:
        - mhz19.calibrate_zero: mhz19_sensor

ota:
  password: ${ota_password}

i2c:
  scl: D1
  sda: D2

light:
  - platform: fastled_clockless
    chipset: WS2812
    pin: D6
    num_leds: 1
    rgb_order: GRB
    name: "RGB LED"
    id: led

font:
  # Gidole, Open Source Modern DIN, https://gidole.github.io/
  - file: "gidole.ttf"
    id: font_16
    size: 16
  - file: "gidole.ttf"
    id: font_48
    size: 48

display:
  - platform: ssd1306_i2c
    model: "SSD1306 128x64"
    pages:
      - id: page_init
        lambda: |-
          it.print(0, 0, id(font_16), "${verbose_name}");
          it.print(0, 28, id(font_16), "Der Sensor waermt");
          it.print(0, 48, id(font_16), "drei Minuten auf...");          
      - id: page_co2_sense
        lambda: |-
          it.print(0, 0, id(font_16), "CO2-WERT (PPM)");
          if (id(mhz19_co2).has_state()) {
            it.printf(0, 42, id(font_48), "%d", int(id(mhz19_co2).state));
          }          

output:
  - platform: esp8266_pwm
    pin: D5
    id: rtttl_out

rtttl:
  output: rtttl_out

uart:
  id: uart_for_mhz19
  rx_pin: RX
  tx_pin: TX
  baud_rate: 9600

sensor:
  - platform: mhz19
    id: mhz19_sensor
    uart_id: uart_for_mhz19
    update_interval: 15s
    automatic_baseline_calibration: false
    co2:
      name: "MH-Z19 CO2 Value"
      id: mhz19_co2
      on_value_range:
        - below: 1000
          then:
            - light.turn_on:
                id: led
                brightness: 33%
                red: 0.0
                green: 1.0
                blue: 0.0
        - below: 2000 
          above: 1000
          then:
            - light.turn_on:
                id: led
                brightness: 66%
                red: 1.0
                green: 0.8
                blue: 0.0
        - above: 2000 
          then:
            - light.turn_on:
                id: led
                brightness: 100%
                red: 1.0
                green: 0.0
                blue: 0.0
    temperature:
      name: "MH-Z19 Temperature"
      id: mhz19_temperature