CO2 im Arbeitsraum
Messung über WLAN - D1-mini
Ergebnis
3 aktive Sensoren
2 Unterrichtsräume
1 Sammlungsraum
Sensor
WLAN
Software - Client
/*****************************************************************************************************************************************************************************
* *
* 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();
}
Software - SERVER
Messung über PHYPHOX - ESP32
ESP-32
PHYPHOX-App
Messung und Speicherung auf einer SD-Karte - ARDUINO-NANO