====== Luftqualitätsmonitor ====== Projektziel: * Messung von Feinstaub, Kohlendioxid, flüchtigen organischen Verbindungen, Temperatur, Luftfeuchtigkeit und Luftdruck * Anzeige der Messdaten auf einem e-Paper-Display * Konfiguration über ein Webinterface * Perspektivisch soll ein Außentemperaturfühler eingebunden werden ===== Elektrischer Aufbau ===== ==== Mikrocontroller ==== {{iot:luftqualitaetsmonitor:img_0471.jpg?100 |}} Das elektronische Herz des Luftqualitätsmonitors ist ein [[iot:eps32|Lolin D32]] mit einem EPS32 Mikrocontroller. Der EPS32 hat den Vorzug, ein WLAN-Modul integriert zu haben, so dass der Luftqualitätsmonitor sich beispielsweise die aktuelle Zeit von einem entsprechenden Dienst besorgen und über ein Webinterface konfiguriert werden kann. Außerdem - und das ist die interessanteste Möglichkeit - können weitere Sensoren ihre Daten an die Basisstation übermitteln. Interessant dürfte vor allem ein Außensensor sein. ==== e-Paper-Display ==== Die Messergebnisse sollen sollen alle paar Minuten auf einem e-Paper dargestellt werden. Eingesetzt wird das [[iot:waveshare_e-paper_display_7_5_zoll|Waveshare e-Paper Display mit 7,5 Zoll]] Bildschirmdiagonale. Um das Display mit einem Arduino kompatiblen [[arduino:mikrocontroller]] ansteuern zu können, wird die [[https://github.com/ZinggJM/GxEPD|GxEPD-Bibliothek]] benötigt.((Es gibt auch andere Bibliotheken. Nur ein Beispiel findet sich [[http://benkrasnow.blogspot.com/2017/10/fast-partial-refresh-on-42-e-paper.html|hier]].)) Anschluss des Displays an den **Lolin D32** bei Verwendung der Bibliothek **GxEPD**: * "3,3V" (rot): 3V * "GND" (schwarz): GND * "DIN" (blau): Pin 23 * "CLK" (gelb): Pin 18 * "CS" (orange): Pin 5 * "DC" (grün): Pin 17 * "RST" (weiß): Pin 16 * "BUSY" (violett): Pin 4 Im Sketch müssen nur die folgenden Pins definiert werden: #include #include // 7.5" b/w #include #include GxIO_Class io(SPI, SS, 17, 16); GxEPD_Class display(io, 16, 4); Um nicht auf die Fonts beschränkt zu sein, die mit der Adafruit-GFX-Bibliothek eingebunden werden, wird die Bibliothek U8g2_for_Adafruit_GFX verwendet. #include U8G2_FOR_ADAFRUIT_GFX u8g2_for_adafruit_gfx; void setup () { u8g2_for_adafruit_gfx.begin(display); } ==== Sensoren ==== === Feinstaubsensor: SDS011 === [Ist noch nicht eingetroffen.] Bibliothek: https://github.com/lewapek/sds-dust-sensors-arduino-library === Luftqualitätssensor: Adafruit SGP30 TVOC/eCO2 Gas Sensor === Der CO2-Anteil und der Anteil flüchtiger organischer Verbindungen wird mit dem [[https://learn.adafruit.com/adafruit-sgp30-gas-tvoc-eco2-mox-sensor/arduino-code|Adafruit SGP30 TVOC/eCO2 Gas Sensor]] gemessen ([[https://cdn-learn.adafruit.com/assets/assets/000/050/058/original/Sensirion_Gas_Sensors_SGP30_Datasheet_EN.pdf|Datenblat]]). SCL: Pin 19 SCK: Pin 18 Ebenfalls ausprobiert habe ich den [[https://learn.adafruit.com/adafruit-ccs811-air-quality-sensor?view=all|Adafruit CCS811 Air Quality Sensor]], der jedoch im Vergleich zu dem SGP30 einige Nachteile hat. Abgesehen davon, dass er sowohl für eCO2 (400 to 8192 parts per million) als auch für TVOC (0 to 1187 parts per billion) deutlich kleinere Messbereiche hat, korrelieren die Werte für eCO2 und TVOC mit einem Koeffizient von annähernd 1. Der Wert für eCO2 scheint also lediglich das Produkt einer Multiplikation des TVOC-Werts mit einer Konstanten zu sein. Zweitens stehen die Messwerte in keinem nachvollziehbaren Zusammenhang mit Ereignissen wie beispielsweise dem Durchlüften der Wohnung. Mit anderen Worten: Der Sensor misst Mist. === Temperatur-, Luftfeuchtigkeitssensor und Barometer: Adafruit BME280 === https://learn.adafruit.com/adafruit-bme280-humidity-barometric-pressure-temperature-sensor-breakout?view=all#overview Schon bei meinem Feinstaubsensor ist mir aufgefallen, dass der BME280 zu hohe Temperaturwerte anzeigt. Er liegt immer 1 bis 2 Grad über den Temeperaturwerten für meinen Wohnort. * https://github.com/opendata-stuttgart/sensors-software/issues/147 Um korrekte Temperaturdaten zu erhalten, muss der Sensor im "forces mode" betrieben werden. bme.setSampling(Adafruit_BME280::MODE_FORCED, Adafruit_BME280::SAMPLING_X1, // temperature Adafruit_BME280::SAMPLING_X1, // pressure Adafruit_BME280::SAMPLING_X1, // humidity Adafruit_BME280::FILTER_OFF ); === Helligkeitssensor: Adafruit TSL2591 High Dynamic Range Digital Light Sensor === Um den Verschleiß des Displays zu minimieren, wird das Display nur aktualisiert, wenn es so hell ist, dass man das Display auch ablesen kann. Zum Einsatz kommt der [[https://learn.adafruit.com/adafruit-tsl2591?view=all|Adafruit TSL2591 High Dynamic Range Digital Light Sensor]], da ich diesen bereits aus meinem [[arduino:schlafphasenwecker|Schlafphasenwecker-Projekt]] kenne und sehr gute Erfahrungen damit gemacht habe. ==== Kontrolle über Taster ==== Um verschiedene Funktionen aufzurufen, werden auf der Oberseite des Gehäuses zwei Taster verbaut. Funktionen (vorläufig): * beide Taster gleichzeitig lange gedrückt halten: Einstellen von Datum und Uhrzeit * einen Taster kurz drücken: verschiedene Anzeigemodi * einen Taster doppelt drücken: Blättern zu älteren Sensorlogs ==== Stromversorgung ==== Da der Teensy recht viel Strom verbraucht hat es keinen Sinn, den Innenraumluftqualitätsmonitor mit einer Batterie zu betreiben. Stattdessen wird der Monitor mit einem externen Steckernetzteil betrieben. Um die Elektronik gegen Überspannung und Verpolung zu schützen kommt der Step-Down Voltage Regulator D24V25F5 von Pololu zum Einsatz. Der ist zwar völlig überdimensioniert, bietet aber neben einem weiten Eingangsspannungsbereich (6 bis 38 Volt) auch einen Verpolungsschutz. Er liefert eine Ausgangsspannung von 5 Volt, mit der der Teensy und der Feinstaubsensor versorgt werden. Das Display und die Sensoren werden mit 3,3 Volt vom Teensy betrieben. Um die Daten auf ein Datum und eine Uhrzeit beziehen zu können, wird die Echtzeituhr des Teensy mit einer Stützbatterie gestützt. ===== Mechanischer Aufbau ===== Der mechanische Aufbau soll so einfach und kompakt wie möglich sein. Das Gehäuse wird gedruckt. ===== Programmierung ===== Wie bei allen meinen jüngeren Elektronikbastelprojekten werden wichtige Entwicklungsstufen der Programmierung dokumentiert werden. * [[iot:luftqualitaetsmonitor:programmversion_0.1|Programmversion 0.1]]: Die grundlegendsten Funktionen wurden integriert * [[iot:luftqualitaetsmonitor:programmversion_0.2|Programmversion 0.2]]: Integriert verschiedene WiFi-Funktionen {{tag>Arduino ESP32 Lolin_32D Luftqualität Teensy}}