CO2 im Arbeitsraum

Messung über WLAN - D1-mini

Ergebnis

  • 3 aktive Sensoren
    • 2 Unterrichtsräume
    • 1 Sammlungsraum

  • deutliche Pausenzeiten

Sensor

WLAN

  • alte Fritzbox ohne Internet

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

QR-Code
QR-Code www-fuer-alle:co2 (erstellt für aktuelle Seite)