-
Notifications
You must be signed in to change notification settings - Fork 1
/
co2-ampel.ino
141 lines (123 loc) · 4.01 KB
/
co2-ampel.ino
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include <SoftwareSerial.h> // brauchen wir für serielle Kommunikation mit dem Sensor
#include <Adafruit_NeoPixel.h> // brauchen wir für die RGB LED
// brauchen wir das? Geht auch ohne ...
//extern "C" {
//#include "user_interface.h"
//}
#define PIXEL_PIN D5 // wir haben die RGB LED an PIN D5
// LED kann auch mit 3.3V betrieben werden
// Konfigurieren der NeoPixel Bibliothek
// wieviele Pixels (1), welcher Pin
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(1, PIXEL_PIN, NEO_GRB + NEO_KHZ800);
//EspClass esp; // brauchen wir, um den ESP schlafen zu schicken
int CO2Wert; // CO2 Wert in ppm
int Messinterval = 1; // alle x Minuten messen
// RX, TX Pins festlegen
SoftwareSerial co2Serial(D2, D1);
// misst CO2 Wert und liefert ihn zurück in ppm
// Kommunikation mit MH-Z19B CO2 Sensor
int leseCO2()
{
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
}
char GetColor(int co2)
{
// int temp = 150 - (150 * co2 / 1800); // co2 in Farbe Umrechnen
// if (temp < 0)temp += 256; // wir wollen einen Wert zw. 0 und 255
if (co2 < 1000) {
// grün
return 'G';
} else if (co2 < 2000) {
// gelb
return 'Y';
} else {
// rot
return 'R';
}
if (co2 > 2500) {
// violett
return 'V';
}
}
void setup() {
// verbinde D0 mit RST für WakeUp (Kabel stecken nicht vergessen)
pinMode(D0, WAKEUP_PULLUP);
// messen
co2Serial.begin(9600); // serielle Kommunikation mit dem Sensor beginnen
CO2Wert = leseCO2(); // MH-Z19 CO2 Sensor lesen
// NeoPixels Biliothek initialisieren
pixels.begin();
// blink in all colors ending blue to show that thing is working
for (int i=0; i<5; i++)
{
switch (i) {
case 0:
pixels.setPixelColor(0, pixels.Color(255, 0, 0)); //red
break;
case 1:
pixels.setPixelColor(0, pixels.Color(255, 153, 0)); //yellow
break;
case 2:
pixels.setPixelColor(0, pixels.Color(0, 255, 0)); //green
break;
case 3:
pixels.setPixelColor(0, pixels.Color(153, 0, 255)); //violet
break;
case 4:
pixels.setPixelColor(0, pixels.Color(0, 0, 255)); //blue
break;
}
pixels.show();
delay(200); // delay for a period of time (in milliseconds)
pixels.setPixelColor(0,0,0,0);
pixels.show();
delay(200);
}
if (CO2Wert < 0){
pixels.setPixelColor(0, pixels.Color(0, 0, 255)); // blue
} else {
// Berechnen der Farbe
char farbe = GetColor(CO2Wert);
switch (farbe)
{
case 'G':
pixels.setPixelColor(0, pixels.Color(0, 255, 0));
break;
case 'R':
pixels.setPixelColor(0, pixels.Color(255, 0, 0));
break;
case 'Y':
pixels.setPixelColor(0, pixels.Color(255, 153, 0));
break;
case 'V':
pixels.setPixelColor(0, pixels.Color(153, 0, 255));
break;
default:
pixels.setPixelColor(0, pixels.Color(0, 0, 255)); // blue
break;
}
}
pixels.show(); // This sends the updated pixel color to the hardware.
// Ausgabe
Serial.begin(115200); // serielle Kommunikation mit dem PC beginnen
Serial.println("");
Serial.println("Wach auf und geh messen ...");
Serial.printf("CO2 Wert = %d ppm\n\n", CO2Wert);
Serial.println("Geh wieder schlafen ...");
//esp.deepSleep(Messinterval * 60e6, WAKE_RF_DISABLED); // ESP8266 geht für x Minuten schlafen
// convert to microseconds
ESP.deepSleep(Messinterval * 60e6);
}
void loop()
{
// empty because of deepsleep
}