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?
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.
Bauteil | Bauteil-Pin | ESP8266-Pin |
---|---|---|
OLED | SCL | D1 |
OLED | SDA | D2 |
Buzzer | VCC | D5 |
RGB-LED | Din | D6 |
CO2 | RX | TX |
CO2 | TX | RX |
# 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