CO2-Ampel mit MH-Z19 / CO2 Sensor für Wohnzimmer
|
Arduino CO2 -Ampel zeigt mit der Farbe der RGB-LED den Sauerstoff Mangel im Raum, genauer gesagt zeigt er den CO2 wert. Folgende Farbkodierungen habe ich mir ausgedacht und realisiert.
- Türkis – Sehr gute Luft, erscheint direkt nach dem lüften des Raums
- Grün (1008ppM) – Grüngelb -Luft ist Ok man kann konzentriert arbeiten.
- Gelb(1296 ppM)- Das lüften wäre ratsam.
- Rot(1800 ppM)- unbedingt lüften Konzentration lässt nach, konzentriertes Arbeiten klappt nicht.
- Violett- so eine CO2 Konzentration habe ich noch nicht gesehen.
Damit lässt sich CO2 – Lüftungsampel auch im Schlafzimmer anbringen, ohne dass in der Nacht halbes Zimmer farbig ausgeleuchtet ist. Am hellen Tag regelt der Lichtsensor die CO2-Anzeige auf volle Helligkeit.
Bitte verwechselt nicht CO (Kohlenstoffmonooxid, gebräuchlich Kohlenmonoxid) mit CO2 (Kohlenstoffdioxid, Kohlendioxid).
CO- Kohlenmonoxid ist giftig und entsteht bei Verbrennung mit Mangel des O2 (Sauerstoffes). Diesem Stoff gibt es normale weise nicht in den Wohnräumen.
CO2- Kohlendioxid ist nicht giftig, das ist das Gas was wir ausatmen.
Wenn in einem Raum mehrere Personen längere Zeit verbringen, ohne dass der Luftwechsel stattfindet, dann steigt die Kohlendioxid Konzentration. Entsprechend ist es unserer Lunge schwieriger daraus den Sauerstoff O2 zu gewinnen.
Die Konzentration lässt nach, wir fangen an zu gähnen, werden schläfrig. Und dann zeigt das CO2 –Ampel rotes Licht - „Zeit zum Lüften“ und es wird wieder alles gut.
Eigentlich braucht man für dieses Bastelprojekt gar kein WLAN Modul. Ein Arduino Nano kann genau das Gleiche tun.
Diese Schaltung ist aus dem Projekt "MQTT WLAN CO2 Sensor mit MH-Z19" entstanden. Ich hatte einfach eine RGB LED dran angeschlossen. Weil ich war zu faul jedes Mal auf Handy zu gucken um die CO2 Werte in meiner Wohnzimmer zu sehen. Dann merkte ich dass die Anzeige mit der Farbe für mich völlig ausreicht. Ich wollte nur wissen, wann ich das Zimmer lüften soll. Ich plane in der Zukunft das Programm für Arduino nano umzuschreiben.
CO2 (Kohlendioxid) Ampel Schaltplan
So ein WS2812B RGB LED Modul habe ich verwendet
LDR Typ 5528: 8K-20K bei 10 Lux, 1M im Dunkelheit.
Das teuerste Bauteil dieser Schaltung war MH-Z19 CO2-Sensor und kostete 21€ (bei Aliexpress)
Download Firmware und Quellcode Arduino Sketch
In der ZIP-Datei befindet sich komplettes Arduino Projekt und Kompiliertes Programm als fertige Firmware.Download Projekt CO2–Ampel -Sketch für Arduino, es wirden Bibliotheken Core for ESP8266 WiFi chip,SoftwareSerial, Adafruit_NeoPixel benötigt
Sketch
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
#include <SoftwareSerial.h> #include <Adafruit_NeoPixel.h> extern "C" { #include "user_interface.h" } #define PIXEL_PIN D5 // Digital IO pin connected to the NeoPixels. #define PIXEL_COUNT 1 EspClass esp; int CO2Wert; // CO2 Messwert in ppm uint32_t farbe = 0; int Messinterval = 1; // 1 Minute SoftwareSerial co2Serial(D2, D1); // RX, TX Pinns festlegen Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800); int leseCO2() // Kommunikation mit MH-Z19 CO2 Sensor { byte cmd[9] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79}; char antwort[9]; co2Serial.write(cmd, 9); co2Serial.readBytes(antwort, 9); if (antwort[0] != 0xFF) return -1; if (antwort[1] != 0x86) return -1; int antwortHigh = (int) antwort[2]; // CO2 High Byte int antwortLow = (int) antwort[3]; // CO2 Low Byte int ppm = (256 * antwortHigh) + antwortLow; return ppm; // Antwort des MH-Z19 CO2 Sensors in ppm } void setup() { co2Serial.begin(9600); CO2Wert = leseCO2(); // MH-Z19 CO2 Sensor lesen int temp = 150 - (150 * CO2Wert / 1800); // CO2 in Farbe Umrechnen if (temp < 0)temp += 256; uint ADCValue = 0; ADCValue = system_adc_read(); // LDR Wert lesen int x = ADCValue / 5; if (x < 0)x = 0; if (x > 100)x = 100; farbe = Wheel(temp, x, x, x); // Farbe und Intensität einstellen strip.begin(); // WS2812B RGB initialisieren strip.setPixelColor(0, farbe); strip.show(); // Daten zum WS2812B RGB LED senden Serial.begin(115200); Serial.println(""); Serial.println("Start"); esp.deepSleep(Messinterval * 60e6, WAKE_RF_DISABLED); // ESP8266 geht für x Minuten schlafen } void loop() { yield(); } // Input a value 0 to 255 to get a color value. // The colours are a transition r - g - b - back to r. uint32_t Wheel(byte Wert, byte Rdimm, byte Gdimm, byte Bdimm) { uint16_t Phase, Blue, Green, Red, Level; Phase = Wert / 42; Level = Wert % 42; switch ( Phase ) { case 0: // { Red = 255; Green = Level * 6; Blue = 0; } break; case 1: { Red = 255 - Level * 6; Green = 255; Blue = 0; } break; case 2: { Red = 0; Green = 255; Blue = Level * 6; } break; case 3: { Red = 0; Green = 255 - Level * 6; Blue = 255; } break; case 4: { Red = Level * 6; Green = 0; Blue = 255; } break; case 5: { Red = 255; Green = 0; Blue = 255 - Level * 6; } break; default: Red = Green = Blue = 255; } return strip.Color(Red * Rdimm / 100, Green * Gdimm / 100, Blue * Bdimm / 100); } |
CO2-Ampel mit Arduino Nano
Hier eine Arduino NANO mit ATmega168
WS2812B RGB LED ist an PIN 8 angeschlossen
MH-Z19B CO2 Sensor - Rx an PIN 2, - Tx an PIN 3
LED und MH-Z19B an die +5V Anchluss und GND der Platine angeschlossen
Stromversorgung empfehle ich auch an diese 5V Anchluss der Platine zu geben, weil der Micro-USB anchluss bis 0,5V spannungsabfall erzeugt.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
#include <SoftwareSerial.h> #include <Adafruit_NeoPixel.h> #define PIXEL_PIN 8 // RGB LED. #define PIXEL_COUNT 1 int CO2Wert; // CO2 Messwert in ppm uint32_t farbe = 0; int Messinterval = 1000; // in Millisekunden, hier 1s #define Helligkeit 50 // 25%...100% Wenn LED zu hell SoftwareSerial co2Serial(2, 3); // RX vom MH-Z19B, TX vom MH-Z19B Pinns festlegen Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800); int leseCO2() // Kommunikation mit MH-Z19 CO2 Sensor { byte cmd[9] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79}; byte antwort[9]; co2Serial.write(cmd, 9); co2Serial.readBytes(antwort, 9); if (antwort[0] != 0xFF) return -1; if (antwort[1] != 0x86) return -1; int antwortHigh = (int) antwort[2]; // CO2 High Byte int antwortLow = (int) antwort[3]; // CO2 Low Byte int ppm = (256 * antwortHigh) + antwortLow; return ppm; // Antwort des MH-Z19 CO2 Sensors in ppm } void setup() { co2Serial.begin(9600); Serial.begin(115200); Serial.println(""); Serial.println("Start"); } void loop() { CO2Wert = leseCO2(); // MH-Z19 CO2 Sensor lesen Serial.println(CO2Wert); int temp = 150 - (150 * CO2Wert / 1800); // CO2 in Farbe Umrechnen if (temp < 0)temp += 256; int x=100; farbe = Wheel(temp, Helligkeit, Helligkeit, Helligkeit); // Farbe und Intensität einstellen strip.begin(); // WS2812B RGB initialisieren strip.setPixelColor(0, farbe); strip.show(); // Daten zum WS2812B RGB LED senden delay(Messinterval); } uint32_t Wheel(byte Wert, byte Rdimm, byte Gdimm, byte Bdimm) { uint16_t Phase, Blue, Green, Red, Level; Phase = Wert / 42; Level = Wert % 42; switch ( Phase ) { case 0: // { Red = 255; Green = Level * 6; Blue = 0; } break; case 1: { Red = 255 - Level * 6; Green = 255; Blue = 0; } break; case 2: { Red = 0; Green = 255; Blue = Level * 6; } break; case 3: { Red = 0; Green = 255 - Level * 6; Blue = 255; } break; case 4: { Red = Level * 6; Green = 0; Blue = 255; } break; case 5: { Red = 255; Green = 0; Blue = 255 - Level * 6; } break; default: Red = Green = Blue = 255; } return strip.Color(Red * Rdimm / 100, Green * Gdimm / 100, Blue * Bdimm / 100); } |
Christoph hat vorgeschlagen, 6 definierte Farben statt weiche Farbübergänge zu verwenden.
uint32_t Wheel(byte Wert, byte Rdimm, byte Gdimm, byte Bdimm) { uint16_t Phase, Blue, Green, Red, Level; Phase = Wert / 21; Level = Wert % 21; switch ( Phase ) { case 0: //rot >1548 { Red = 255; Green = 0; Blue = 0; } break; case 1: //orange > 1296 { Red = 255; Green = 55; Blue = 0; } break; case 2: //gelb > 1044 { Red = 255; Green = 255; Blue = 0; } break; case 3: //gelbgrün >792 { Red = 187; Green = 255; Blue = 0; } break; case 4: //grün >540 { Red = 0; Green = 255; Blue = 0; } break; case 5: //blau >288 { Red = 0; Green = 0; Blue = 255; } break; default: Red = Blue = 255; Green =0; // rosa } return strip.Color(Red * Rdimm / 100, Green * Gdimm / 100, Blue * Bdimm / 100); }
webmaster_x_esp8266-server.de |