/***************************************************************************************************************************************************************************** * * * 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(); }