Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung |
www-fuer-alle:co2 [2024/04/04 09:42] – biebl | www-fuer-alle:co2 [2024/07/26 21:09] (aktuell) – [CO2 im Arbeitsraum] biebl |
---|
====== CO2 im Arbeitsraum ====== | ====== CO2 im Arbeitsraum ====== |
| |
| |
| ====== Messung über WLAN - D1-mini ====== |
| |
| ===== Ergebnis ===== |
| |
| |
{{:www-fuer-alle:co2-klassenraum-2024-04-03-121-physik2-2024-04-04-08-42.png?800|}} | {{:www-fuer-alle:co2-klassenraum-2024-04-03-121-physik2-2024-04-04-08-42.png?800|}} |
| |
| * 3 aktive Sensoren |
| * 2 Unterrichtsräume |
| * 1 Sammlungsraum |
| |
| {{:www-fuer-alle:co2-klassenraum-beispielmessung-1.png?400|}} |
| |
| * deutliche Pausenzeiten |
| |
| ===== Sensor ===== |
| |
| {{:www-fuer-alle:co2-nur-esp-03.jpg?400|}} |
| |
| ===== WLAN ===== |
| |
| * alte Fritzbox ohne Internet |
| ===== Software - Client ===== |
| |
| * |
| |
| |
| |
| <code> |
| /***************************************************************************************************************************************************************************** |
| * * |
| * Spannungsmessung an ZWEI Stellen muss der D1-mini fuer EmonCMS EINDEUTIG identifiziert werden 1) IP-Adresse 2) CLIENT-Name * |
| * Der Messwert wird immer in der Variablen Messwert uebergeben * |
| * * |
| ****************************************************************************************************************************************************************************/ |
| |
| // ----------------------------------------- Bibliotheken -------------------------------------------------------------------------------------------------------------------- |
| /***************************************************************************************************************************************************************************** |
| * Including the Libraries for WiFi Connection, HTTP Send and Sensor |
| *********************************************************************************************/ |
| |
| #include <ESP8266WiFi.h> |
| #include <ESP8266HTTPClient.h> |
| #include <WiFiClient.h> |
| // ----------------------------------------- Variablendeklaration------------------------------------------------------------------------------------------------------------- |
| /***************************************************************************************************************************************************************************** |
| * |
| * Replace with your network details |
| * |
| *********************************************************************************************/ |
| const char* ssid = "...."; |
| const char* password = "...."; |
| |
| /***************************************************************************************************************************************************************************** |
| * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| * Provide IP Adresse, Gateway, Subnet and DNS matching your network - Hier muss die feste EINDEUTIGE IP fuer den Sensor eingetragen werden. |
| * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| *********************************************************************************************/ |
| IPAddress ip(192,168,...,...); // I use fixed IP-Adress - muss für jedes Geraet angepasst werden - LISTE im DOKUWIKI |
| IPAddress gateway(192,168,...,...); // gateway = Weg ins Internet, also Router |
| IPAddress subnet(255, 255, 255, 0); // set subnet mask to match your |
| IPAddress dns(192,168,...,...); // DNS Server = Router IP |
| |
| /***************************************************************************************************************************************************************************** |
| * fuer den Sensor MHZ19B * |
| *********************************************************************************************/ |
| const int pwmpin = 16; // Der Sensor hängt NICHT an D4, sondern an D0, damit die LED nicht blinkt |
| const int range = 5000; // Der eingestellte Messbereich (0-5000ppm) |
| int ppm_pwm = 0; |
| |
| /***************************************************************************************************************************************************************************** |
| * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| * server settings, change node ID for every node Hier muss der EINDEUTIGE CLIENT-Name eingetragen werden, unter diesem Namen taucht der Mersswert in EmonCMS auf. |
| * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| *********************************************************************************************/ |
| const char* host = "192.168......."; // feste IP für den Apache |
| const char* CLIENT = "Co2-107"; // Der Name muss mit dem Device übereinstimmen !!!!!!!!!!!!!!!!!!!!!!!!! der Eintrag für NODE muss eindeutig sein |
| const char* apikey = "..."; // Emoncms apikey zum Lesen und Schreiben fuer alle Sensoren gleich |
| const int httpPort = 80; |
| const int sleepTimeInSec = 5; //Seconds to deep sleep 30 = 0,5 Min |
| |
| // ------------------------------------------ Setup - einmaliger Ablauf ------------------------------------------------------------------------------------------------------ |
| void setup() { |
| /***************************************************************************************************************************************************************************** |
| * für den Betrieb eines Sensors * |
| ******************************************/ |
| pinMode(pwmpin, INPUT); // PWM-Pin auf Eingang setzen |
| |
| /***************************************************************************************************************************************************************************** |
| * Initializing serial port for debugging purposes |
| *********************************************************************************************/ |
| Serial.begin(115200); // diese Einstellung muss im seriellen Monitor übernommen werden |
| Serial.println("2022-10-14 - CO2 Messung in ppm "); |
| |
| /***************************************************************************************************************************************************************************** |
| * Connect WiFi |
| * Fix https://github.com/esp8266/Arduino/issues/2186 |
| *********************************************************************************************/ |
| WiFi.config(ip, gateway, subnet, dns); |
| delay(100); |
| WiFi.persistent(false); |
| WiFi.mode(WIFI_OFF); |
| WiFi.mode(WIFI_STA); |
| WiFi.begin(ssid, password); |
| while (WiFi.status() != WL_CONNECTED) { |
| delay(500); |
| } |
| } |
| |
| // ---------------------------------------- Hauptprogeramm - Endlosschleife - loop -------------------------------------------------------------------------------------------- |
| |
| void loop(void) { |
| ppm_pwm = readCO2PWM(); // Messung der PWM-Länge mittels einer eigenen Funktion |
| Serial.print(ppm_pwm); // Wert am seriellen Monitor |
| Serial.println(" ppm CO2"); |
| sendData(ppm_pwm); //Send data to emoncms |
| delay(sleepTimeInSec * 1000); |
| } |
| |
| // ---------------------------------------- Unterprogramme und Funktionen ---------------------------------------------------------------------------------------------------- |
| |
| /********************************************************************************************************** |
| * |
| * Funktionen zum PWM-Auslese des CO2-Wertes |
| * |
| ***********************************************************************************************************/ |
| |
| int readCO2PWM() { |
| unsigned long th; |
| int ppm_pwm = 0; |
| float pulsepercent; |
| do { |
| th = pulseIn(pwmpin, HIGH, 1004000) / 1000; |
| pulsepercent = th / 1004.0; // Pulslänge in Prozent (%) |
| ppm_pwm = range * pulsepercent; // PPM-Werte bei gegebenem Range |
| } while (th == 0); // Der gemessene Wert wird an die loop()-Funktion zurückgegeben, |
| return ppm_pwm; // wo er dann ausgegeben wird. |
| } |
| |
| /***************************************************************************************************************************************************************************** |
| * |
| * Zusammenbau der zu sendenden Textdatei fuer EmonCMS |
| * Der Messwert wird in der Variable "CLIENT" und "Messwert" uebergeben und dann von EnonCMS eingerichtet |
| * |
| *********************************************************************************************/ |
| void sendData(float t) { |
| |
| /***************************************************************************************************************************************************************************** |
| * Send data to REST server |
| *********************************************************************************************/ |
| WiFiClient client; |
| HTTPClient http; |
| Serial.print("[HTTP] begin...\n"); |
| |
| /***************************************************************************************************************************************************************************** |
| * configure traged server and url |
| *********************************************************************************************/ |
| String url = "http://"; |
| url += host; |
| url += ":"; |
| url += httpPort; |
| url += "/emoncms/input/post.json"; |
| |
| /***************************************************************************************************************************************************************************** |
| * http.begin(client, url); |
| *********************************************************************************************/ |
| String ausgabe; |
| ausgabe = url + "?"; |
| ausgabe += "node="; |
| ausgabe += CLIENT; |
| ausgabe += "&json={Messwert:"; |
| ausgabe += String(t, 1); |
| ausgabe += "}"; |
| http.begin(client, ausgabe); |
| Serial.print("[HTTP] POST..."+url+"\n"); |
| Serial.println(ausgabe); |
| |
| /***************************************************************************************************************************************************************************** |
| * start connection and send HTTP header |
| *********************************************************************************************/ |
| http.addHeader("Content-Type","application/json"); |
| http.addHeader("Authorization","Bearer 8b494fa8b58b82471c0f397bbeda611f"); |
| int httpCode = http.GET(); |
| if (httpCode > 0) { // httpCode will be negative on error |
| Serial.printf("[HTTP] POST... code: %d\n", httpCode); // HTTP header has been send and Server response header has been handled |
| if (httpCode == HTTP_CODE_OK) { // file found at server |
| String payload = http.getString(); |
| Serial.println(payload); |
| } |
| } else { |
| Serial.printf("[HTTP] POST... failed, error: %s\n", http.errorToString(httpCode).c_str()); |
| } |
| http.end(); |
| } |
| </code> |
| |
| |
| ===== Software - SERVER ===== |
| |
| * [[https://github.com/emoncms/emoncms]] |
| |
| {{:www-fuer-alle:emoncms-software.png?600|}} |
| |
| ====== Messung über PHYPHOX - ESP32 ====== |
| |
| ===== ESP-32 ===== |
| |
| {{:www-fuer-alle:2024-03-19-phyphox-co2-anzeige-03.jpg?600|}} |
| |
| ===== PHYPHOX-App ===== |
| * [[https://phyphox.org/]] |
| |
| {{:www-fuer-alle:2024-03-19-phyphox-co2-anzeige-02.png?600|}} |
| |
| ====== Messung und Speicherung auf einer SD-Karte - ARDUINO-NANO ====== |
| |
| {{:www-fuer-alle:nw-co2-handmessgeraet.png?600|}} |
| |
| {{:www-fuer-alle:co2-2023-10-17-diagramm-in-calc.png?600|}} |
| |
| |