Arduinoscripte

Code 1: Analoger Sensor und DHT22

Abfrage diverser Sensoren und Upload zum Server

// Netzwerverbindung nach: https://gist.github.com/SergXIIIth/1628715

#include "DHT.h"
#include <SPI.h>
#include <Ethernet.h>
#include <SoftwareSerial.h>


// Verbindungsdaten für die Netzwerkkarte
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // hat man mehr Arduinos im Netz: mac adresse verändern!!!!
IPAddress ip(192,168,178,140);  // IP-Adresse ändern!!!!
byte gateway[] = { 192, 168, 178, 1 }; 
byte subnet[] = { 255, 255, 255, 0 };

// Verbindungsdaten des Servers:
IPAddress server(136,243,78,203); // IP-Adresse von www.info-checker.de
EthernetClient client;


// Sachen für den CO2 - Sensor
SoftwareSerial SerialCom (A2,A3); // für CO2-Sensor
byte addArray[] = { 0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79 }; // Befehl zur Abfrage des CO2 Sensors
byte zeroArray[] = { 0xFF, 0x01, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78};  // Befehl zum Reset des COS2 Sensors
char dataValue[9];
String dataString = "";
long zeit;
int i=0;

  
// Sachen für den DHT - Sensor (Luftfeuchtigkeit und Temperatur    
#define DHTPIN 2    // Anschluss am digitalen PIN2     
#define DHTTYPE DHT22 //DHT11, DHT21, DHT22
DHT dht(DHTPIN, DHTTYPE);

static char t_str[15]; // zur Umwandlung der Messwerte von float to String
static char h_str[15]; // zur Umwandlung der Messwerte von float to String

// Sachen für den analogen Sensor  
int MessPin = A5;  //analoger Eingang 
int Messwert = 0; 


void connect(){
  float h = dht.readHumidity();     //Luftfeuchte auslesen
  float t = dht.readTemperature();  //Temperatur auslesen
  
  dtostrf(h,4, 2, h_str);  // Wandelt den float Wert h in einen String h_str um.
  dtostrf(t,4, 2, t_str);  // Wandelt den float Wert t in einen String t_str um.
  Messwert = analogRead(MessPin); // Analogen Port auslesen
   delay(1000);
  // Prüfen ob eine gültige Zahl zurückgegeben wird. Wenn NaN (not a number) zurückgegeben wird, dann Fehler ausgeben.
  if (isnan(t) || isnan(h)) 
  {
    Serial.println("DHT22 konnte nicht ausgelesen werden");
  } 
  

  if (client.connect(server, 80)) {  
  // Serial.println("Server verbunden."); 
  
  // vergebe eine eindeutige Beschreibung für deine Messung
    String beschreibung="DEADBEEFED";   
  // beschreibe deine Eingänge
   String info="Analog_Luftfeuchtigkeit_Temperatur(DHT22)";
  // url hier werden die Daten an das PHP-Script übergeben
   String url = "GET /raumklima/MesswertAbspeichern.php?beschreibung="+beschreibung+"&info="+info+"&wert1="+String(Messwert)+"&wert2="+h_str+"&wert3="+t_str+" HTTP/1.1";
    client.println(url);
    client.println("Host: www.info-checker.de");
    client.println("Connection: close"); // beendet die Verbindung
    client.println(); 
    // Serial.println("ok"); // falls Verbindung geklappt hat.
	  } 
	  else {
	    Serial.println("connection failed");
	}
}

void setup() {
	Serial.begin(9600);  
	Serial.print("Setup LAN ... ");
	// give the Ethernet shield a second to initialize:
	delay(1000);
	Ethernet.begin(mac, ip);
	Serial.println("ok");
	delay(1000);       
	connect();  	
}

void loop(){
// die folgenden Zeilen verursachen die Ausgabe der Serverantwort auf dem SeriellenMonitor 
// brauchen wir nur zur Fehlersuche bei Problemen 
// if (client.available()) {
//     char c = client.read();
//    Serial.print(c);
//  }

  // if the server's disconnected, stop the client:  
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
    delay(3000);
    connect();
  }	
}
Code 2: amaloger Sensor, DHT22 und Feinstaub (SDS011)

Abfrage vom KTY-81-222; DHT22 und SDS011 und upload zum Server

// Netzwerverbindung nach: https://gist.github.com/SergXIIIth/1628715

#include "DHT.h"
#include <SPI.h>
#include <Ethernet.h>
#include <SoftwareSerial.h>

// Sachen für den Feinstaubsensor
#define LEN 9
unsigned char incomingByte = 0;
unsigned char buf[LEN];
int PM2_5Val = 0;
int PM10Val = 0; 



// Verbindungsdaten für die Netzwerkkarte
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // hat man mehr Arduinos im Netz: mac adresse verändern!!!!
IPAddress ip(192,168,178,140);  // IP-Adresse ändern!!!!
byte gateway[] = { 192, 168, 178, 1 }; 
byte subnet[] = { 255, 255, 255, 0 };

// Verbindungsdaten des Servers:
IPAddress server(136,243,78,203); // IP-Adresse von www.info-checker.de
EthernetClient client;


// Sachen für den CO2 - Sensor
SoftwareSerial SerialCom (A2,A3); // für CO2-Sensor
byte addArray[] = { 0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79 }; // Befehl zur Abfrage des CO2 Sensors
byte zeroArray[] = { 0xFF, 0x01, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78};  // Befehl zum Reset des COS2 Sensors
char dataValue[9];
String dataString = "";
long zeit;
int i=0;

  
// Sachen für den DHT - Sensor (Luftfeuchtigkeit und Temperatur    
#define DHTPIN 2    // Anschluss am digitalen PIN2     
#define DHTTYPE DHT22 //DHT11, DHT21, DHT22
DHT dht(DHTPIN, DHTTYPE);

static char t_str[15]; // zur Umwandlung der Messwerte von float to String
static char h_str[15]; // zur Umwandlung der Messwerte von float to String

// Sachen für den analogen Sensor  
int MessPin = A5;  //analoger Eingang 
int Messwert = 0; 


void connect(){
  // zuerst den Feinstaubsensor auslesen
   int i;
   unsigned char checksum;
     // send data only when you receive data:
     if (Serial.available() > 0) {
       // read the incoming byte:
       incomingByte = Serial.read();
         if (incomingByte == 0xAA) {
           Serial.readBytes((char *) buf, LEN);
           if ((buf[0] == 0xC0) && (buf[8] == 0xAB)) {
             for (i=1; i<=6; i++) {
               checksum = checksum + buf[i];
             }
             if (checksum == buf[7]) {
                 PM2_5Val=((buf[2]<<8) + buf[1])/10;
                 PM10Val=((buf[4]<<8) + buf[3])/10;
    //             Serial.print("PM2.5: ");
    //             Serial.print(PM2_5Val);
    //             Serial.println(" ug/m3");

   //              Serial.print("PM10 : ");
   //              Serial.print(PM10Val);
   //              Serial.println(" ug/m3");
   //              Serial.println();
             }
             else {
                 Serial.println("checksum Error");
             }
         }
         else {
             Serial.println("frame error");
         }
     }
 } 
  
  // DHT 22 auslesen
  float h = dht.readHumidity();     //Luftfeuchte auslesen
  float t = dht.readTemperature();  //Temperatur auslesen
  
  dtostrf(h,4, 2, h_str);  // Wandelt den float Wert h in einen String h_str um.
  dtostrf(t,4, 2, t_str);  // Wandelt den float Wert t in einen String t_str um.
  Messwert = analogRead(MessPin); // Analogen Port auslesen
   delay(1000);
  // Prüfen ob eine gültige Zahl zurückgegeben wird. Wenn NaN (not a number) zurückgegeben wird, dann Fehler ausgeben.
  //if (isnan(t) || isnan(h)) 
  //{
  //  Serial.println("DHT22 konnte nicht ausgelesen werden");
  //} 
  

  if (client.connect(server, 80)) {  
  // Serial.println("Server verbunden."); 
  
  // vergebe eine eindeutige Beschreibung für deine Messung
    String beschreibung="2018_12_12_Test1";   
  // beschreibe deine Eingänge
   String info="Analog_Luftfeuchtigkeit_Temperatur(DHT22)_PM2.5_PM10";
  // url hier werden die Daten an das PHP-Script übergeben
  // hier die Variablen noch abändern, wahrscheinlich für den CO2-Wert und evtl. noch ein Wert
  String wert6 = "..";
  String wert7 = "..";
   String url = "GET /raumklima/MesswertAbspeichern.php?beschreibung="+beschreibung+"&info="+info+"&wert1="+String(Messwert)+"&wert2="+h_str+"&wert3="+t_str+"&wert4="+PM2_5Val+"&wert5="+PM10Val+"&wert6="+wert6+"&wert7="+wert7+" HTTP/1.1";
    client.println(url);
    client.println("Host: www.info-checker.de");
    client.println("Connection: close"); // beendet die Verbindung
    client.println(); 
    // Serial.println("ok"); // falls Verbindung geklappt hat.
	  } 
	  else {
	    Serial.println("connection failed");
	}
}

void setup() {
	Serial.begin(9600);  
	Serial.print("Setup LAN ... ");
	// give the Ethernet shield a second to initialize:
	delay(1000);
	Ethernet.begin(mac, ip);
	Serial.println("ok");
	delay(1000);       
	connect();  	
}

void loop(){
// die folgenden Zeilen verursachen die Ausgabe der Serverantwort auf dem SeriellenMonitor 
// brauchen wir nur zur Fehlersuche bei Problemen 
//if (client.available()) {
//     char c = client.read();
  //  Serial.print(c);
//  }

  // if the server's disconnected, stop the client:  
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
    delay(180000); // 180 Sekunden
    connect();
  }	
}
Code 3: Analog; Luftfeuchtigkeit, Temperatur; Feinstaub; CO2 und upload zum Server

Analog; Luftfeuchtigkeit, Temperatur; Feinstaub; CO2 und upload zum Server

// Netzwerverbindung nach: https://gist.github.com/SergXIIIth/1628715
 
#include "DHT.h"
#include <SPI.h>
#include <Ethernet.h>
#include <SoftwareSerial.h>
 
// Sachen für den Feinstaubsensor
#define LEN 9
unsigned char incomingByte = 0;
unsigned char buf[LEN];
int PM2_5Val = 0;
int PM10Val = 0; 
 
 
 
// Verbindungsdaten für die Netzwerkkarte
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // hat man mehr Arduinos im Netz: mac adresse verändern!!!!
IPAddress ip(192,168,178,140);  // IP-Adresse ändern!!!!
byte gateway[] = { 192, 168, 178, 1 }; 
byte subnet[] = { 255, 255, 255, 0 };
 
// Verbindungsdaten des Servers:
IPAddress server(136,243,78,203); // IP-Adresse von www.info-checker.de
EthernetClient client;
 
 
// Sachen für den CO2 - Sensor
SoftwareSerial SerialCom (A2,A3); // für CO2-Sensor
byte addArray[] = { 0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79 }; // Befehl zur Abfrage des CO2 Sensors
byte zeroArray[] = { 0xFF, 0x01, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78};  // Befehl zum Reset des COS2 Sensors
char dataValue[9];
String dataString = "";
long zeit;
int i=0;
 
   
// Sachen für den DHT - Sensor (Luftfeuchtigkeit und Temperatur    
#define DHTPIN 7    // Anschluss am digitalen PIN2     
#define DHTTYPE DHT22 //DHT11, DHT21, DHT22
DHT dht(DHTPIN, DHTTYPE);
 
static char t_str[15]; // zur Umwandlung der Messwerte von float to String
static char h_str[15]; // zur Umwandlung der Messwerte von float to String
 
// Sachen für den analogen Sensor  
int MessPin = A0;  //analoger Eingang 
int Messwert = 0; 
 
 
void connect(){
  delay(1000);
  // zuerst den Feinstaubsensor auslesen
   int i;
   unsigned char checksum;
     // send data only when you receive data:
     if (Serial.available() > 0) {
       // read the incoming byte:
       incomingByte = Serial.read();
         if (incomingByte == 0xAA) {
           Serial.readBytes((char *) buf, LEN);
           if ((buf[0] == 0xC0) && (buf[8] == 0xAB)) {
             for (i=1; i<=6; i++) {
               checksum = checksum + buf[i];
             }
             if (checksum == buf[7]) {
                 PM2_5Val=((buf[2]<<8) + buf[1])/10;
                 PM10Val=((buf[4]<<8) + buf[3])/10;
                 Serial.print("PM2.5: ");
                 Serial.print(PM2_5Val);
                 Serial.println(" ug/m3");
 
                 Serial.print("PM10 : ");
                 Serial.print(PM10Val);
                 Serial.println(" ug/m3");
                 Serial.println();
             }
             else {
                 Serial.println("checksum Error");
             }
         }
         else {
             Serial.println("frame error");
         }
     }
 } 
   delay(1000);
  // DHT 22 auslesen
  float h = dht.readHumidity();     //Luftfeuchte auslesen
  float t = dht.readTemperature();  //Temperatur auslesen
   
  dtostrf(h,4, 2, h_str);  // Wandelt den float Wert h in einen String h_str um.
  dtostrf(t,4, 2, t_str);  // Wandelt den float Wert t in einen String t_str um.
  Serial.print(h_str);
  Serial.println(" %H20");
  Serial.print(t_str);
  Serial.println(" °C");

 
  // Prüfen ob eine gültige Zahl zurückgegeben wird. Wenn NaN (not a number) zurückgegeben wird, dann Fehler ausgeben.
  if (isnan(t) || isnan(h)) 
  {
    Serial.println("DHT22 konnte nicht ausgelesen werden");
  } 
 // ANlog auslesen
  Messwert = analogRead(MessPin); // Analogen Port auslesen
  delay(1000);
 
   
 // CO2 auslesen
  SerialCom.write(addArray, 9);
  SerialCom.readBytes(dataValue, 9);
  int resHigh = (int) dataValue[2];
  int resLow  = (int) dataValue[3];
  int pulse = (256*resHigh)+resLow;
  dataString = String(pulse);
  Serial.print(dataString);
  Serial.println(" CO2 ppm");
  //
  delay(1000); 
  if (client.connect(server, 80)) {  
   Serial.println("Server verbunden."); 
   
  // vergebe eine eindeutige Beschreibung für deine Messung
    String beschreibung="2018_12_29_Test1";   
  // beschreibe deine Eingänge
   String info="Analog_Luftfeuchtigkeit_Temperatur(DHT22)_PM2.5_PM10";
  // url hier werden die Daten an das PHP-Script übergeben
  // hier die Variablen noch abändern, wahrscheinlich für den CO2-Wert und evtl. noch ein Wert
  String wert6 = dataString;
  String wert7 = "..";
   String url = "GET /raumklima/MesswertAbspeichern.php?beschreibung="+beschreibung+"&info="+info+"&wert1="+String(Messwert)+"&wert2="+h_str+"&wert3="+t_str+"&wert4="+PM2_5Val+"&wert5="+PM10Val+"&wert6="+wert6+"&wert7="+wert7+" HTTP/1.1";
    client.println(url);
    client.println("Host: www.info-checker.de");
    client.println("Connection: close"); // beendet die Verbindung
    client.println(); 
     Serial.println("Verbindung zum Server ok"); // falls Verbindung geklappt hat.
      } 
      else {
        Serial.println("connection failed");
    }
}
 
void setup() {
    Serial.begin(9600);  
    Serial.print("Setup LAN ... ");
    // give the Ethernet shield a second to initialize:
    delay(1000);
    Ethernet.begin(mac, ip); 
    Serial.println("Netzwerk ok");
    delay(1000);
    SerialCom.begin(9600);
    delay(1000);
    connect();      
}
 
void loop(){
// die folgenden Zeilen verursachen die Ausgabe der Serverantwort auf dem SeriellenMonitor 
// brauchen wir nur zur Fehlersuche bei Problemen 
if (client.available()) {
     char c = client.read();
     Serial.print(c);
  }
 
  // if the server's disconnected, stop the client:  
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
    delay(120000); // 120 Sekunden
    connect();
  } 
}
CO2 über PWM Messung

CO2 mit PWM

// set pin numbers:
const int sensorPin = 5; // the number of the sensor pin
 
long niedrig = 0;
long hoch = 0;
long lowZeit = 0;
long highZeit = 0;
 
void setup() {
  Serial.begin(9600);
  // initialize the sensor pin as an input
  pinMode(sensorPin, INPUT);
  // Read starting value for millis... (just some value)
while(digitalRead(sensorPin) == LOW) {;}
  hoch = millis();
}
 
void loop(){
  // Check for high and low timing - low time * 2 = PPM
  while(digitalRead(sensorPin) == HIGH) {;}
  niedrig = millis();
  highZeit = niedrig - hoch;
  
  while(digitalRead(sensorPin) == LOW) {;}
  hoch = millis();
  lowZeit = hoch - niedrig;
 
  // Validity check high+low = 1004 (small margin or error allowed -> 990)
  if(lowZeit + highZeit > 990)
  {
    Serial.print("H: ");
    Serial.println(highZeit,DEC);
    Serial.print("L: ");
    Serial.println(lowZeit,DEC);
    Serial.print("CO2  -  ");
    Serial.print(lowZeit * 2,DEC);
    Serial.println(" ppm");    
  } else {
    // Output in case of invalid check: value instead of 1004 ms
    Serial.print("-- CK:");
    Serial.println(lowZeit+highZeit, DEC);
  }
}
Nur Feinstaub

Anschluss:

von links 1. Kabel --> pin 0 (weiß)

von links 2. Kabel --> pin 1 (gelb)

nur Feinstaub

#include "DHT.h"
#include <SPI.h>
#include <SoftwareSerial.h>
 
// Sachen für den Feinstaubsensor
#define LEN 9
unsigned char incomingByte = 0;
unsigned char buf[LEN];
int PM2_5Val = 0;
int PM10Val = 0; 
 

 
void connect(){
  // zuerst den Feinstaubsensor auslesen
   int i;
   unsigned char checksum;
     // send data only when you receive data:
     if (Serial.available() > 0) {
       // read the incoming byte:
       incomingByte = Serial.read();
         if (incomingByte == 0xAA) {
           Serial.readBytes((char *) buf, LEN);
           if ((buf[0] == 0xC0) && (buf[8] == 0xAB)) {
             for (i=1; i<=6; i++) {
               checksum = checksum + buf[i];
             }
             if (checksum == buf[7]) {
                 PM2_5Val=((buf[2]<<8) + buf[1])/10;
                 PM10Val=((buf[4]<<8) + buf[3])/10;
              Serial.print("PM2.5: ");
              Serial.print(PM2_5Val);
              Serial.println(" ug/m3");
 
              Serial.print("PM10 : ");
              Serial.print(PM10Val);
              Serial.println(" ug/m3");
              Serial.println();
             }
             else {
                 Serial.println("checksum Error");
             }
         }
         else {
             Serial.println("frame error");
         }
     }
 } 
 
 }
 
void setup() {
    Serial.begin(9600);  
    delay(1000);       
    connect();      
}
 
void loop(){
    delay(1000); // 180 Sekunden
    connect();
   
}

beschreibung=Raum002
Wert1=sWPm25 (Feinstaub)
Wert2=sWPm10(Feinstaub)
Wert3=sWT_A Temperatur über den analogen Sensor
Wert4=sWCO2 Kohlenstoffdioxid
Wert5=sWFeuchtigkeit Luftfeuchtigkeit
Wert6=sWTemperatur+ Temperatur (digital vom DHT22)

http://www.info-checker.de/raumklima/

Version 18.7.2019

#include "DHT.h" //DHT Bibliothek laden
#include <SPI.h>
#include <SoftwareSerial.h>
#include <Ethernet.h>


// Verbindungsdaten für die Netzwerkkarte // Ethernet Shield W5100 – Arduino Shield
byte mac[] = { 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xF1 };
byte gateway[] = { 10, 144, 1, 2 }; 
byte subnet[] = { 255, 255, 0, 0 };


// Verbindungsdaten des Servers:
IPAddress server(136,243,78,203); // IP-Adresse von www.info-checker.de
EthernetClient client;

// Sachen für den DHT22
#define DHTPIN 2 //Der Sensor wird an PIN 2 angeschlossen   
#define DHTTYPE DHT22    // Es handelt sich um den DHT22 Sensor
DHT dht(DHTPIN, DHTTYPE); //Der Sensor wird ab jetzt mit „dth“ angesprochen

// Sachen für den Feinstaubsensor
#define LEN 9
unsigned char incomingByte = 0;
unsigned char buf[LEN];
int PM2_5Val = 0;
int PM10Val = 0; 


// Sachen für den CO2 Sensor  via UART
SoftwareSerial SerialCom (A5,A4);
byte addArray[] = { 0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79 };
char dataValue[9];

// Sachen für den analogen Sensor  
int MessPin = A2;  //analoger Eingang 
int Messwert = 0; 
int X_T;
float U_T, R_T, T_R;
const int R_H = 10000;
/*
Zuordnung Widerstand zu Temperatur laut Datenblatt Seite 8  
*/  
int R[] ={ 990,1040,1146,1260,1381,1510,1646,1790,1941,2020,
          2100,2267,2441,2623,2812,3009,3214,3426,3643,3855,
          3955,4048,4208,4323};
int T[] = {-55,-50,-40,-30,-20,-10,0,10,20,25,
            30,40,50,60,70,80,90,100,110,120,
            125,130,140,150};          

  
void connect(){
  // zuerst  den Feinstaubsensor auslesen: PM Sensor SDS011
   int i;
   unsigned char checksum;
     // send data only when you receive data:   
     if (Serial.available() > 0) {
       // read the incoming byte:
       incomingByte = Serial.read();
         if (incomingByte == 0xAA) {
           Serial.readBytes((char *) buf, LEN);
           if ((buf[0] == 0xC0) && (buf[8] == 0xAB)) {               
                 PM2_5Val=((buf[2]<<8) + buf[1])/10;
                 PM10Val=((buf[4]<<8) + buf[3])/10;
         }
     }
 } // ende Feinstaubsensor
delay(500);
  
// den analogen Port abfragen: Temperatursensor KTY-81-222
  X_T = analogRead(MessPin);
  U_T = (float(X_T)*5/1023);
  R_T = float(R_H)*U_T/(5-U_T);
    for(int i=0; i <= sizeof(R); i=i+1){
      if(R_T<R[i]){
        T_R = (R_T-R[i-1])*(T[i]-T[i-1])/(R[i]-R[i-1]) + T[i-1];
      break;
     } 
   }
delay(500);
  
// jetzt CO2  über UART // hier MH-Z14
  SerialCom.write(addArray, 9);
  SerialCom.readBytes(dataValue, 9);
  int resHigh = (int) dataValue[2];
  int resLow  = (int) dataValue[3];
  int pulse = (256*resHigh)+resLow; 
// ende CO2 -Sensor

// jetzt den DHT22 messen
  delay(2000);//Zwei Sekunden bis zur Messung warten damit der Sensor etwas messen kann weil er relativ langsam ist
  float Luftfeuchtigkeit = dht.readHumidity(); //die Luftfeuchtigkeit auslesen und unter „Luftfeutchtigkeit“ speichern
  float Temperatur = dht.readTemperature();//die Temperatur auslesen und unter „Temperatur“ speichern 
// ende DHT22 Messung

// Kontakt zum Server aufnehmen:
 delay(1000); 
  if (client.connect(server, 80)) {  
   //zu übertragende MessDaten in Strings umwandeln
    String sWPm25=String(PM2_5Val);
    String sWPm10=String(PM10Val);
    String sWT_A=String(T_R);
    String sWCO2 =String(pulse);
    String sWFeuchtigkeit=String(Luftfeuchtigkeit);
    String sWTemperatur =String(Temperatur);
    
String url="GET /raumklima/MesswertAbspeichern.php?beschreibung=Raum002&Wert1="+sWPm25+"&Wert2="+sWPm10+"&Wert3="+sWT_A+"&Wert4="+sWCO2+"&Wert5="+sWFeuchtigkeit+"&Wert6="+sWTemperatur+"  HTTP/1.1";

//zu übertragende MessDaten
    client.println(url);
    client.println("Host: www.info-checker.de");
    client.println("Connection: close"); // beendet die Verbindung
    client.println(); 
    } 
// ende Kontakt Server
} // ende connect
  
void setup() {
     Serial.begin(9600);
     SerialCom.begin(9600);
     dht.begin(); //DHT22 Sensor starten  
     delay(1000);
     Ethernet.begin(mac);
     delay(1000);
     connect();
}
  
void loop(){
    // die folgenden Zeilen verursachen die Ausgabe der Serverantwort auf dem SeriellenMonitor 
    // brauchen wir nur zur Fehlersuche bei Problemen 
   if (client.available()) {
     char c = client.read();   
      // Serial.print(c);
  }
  if (!client.connected()) {
    client.stop();
    delay(116000); // 116 Sekunden + 4 Sekunden
    connect();
  }  
}

Aufgaben

  1. Markiere alle Datentypen. Recherchiere im Internet, welchen Bereich diese abdecken.
  2. Markiere alle Stellen, die für die Netzwerkverbindung notwendig sind.
  3. Welche Bedeutung hat Serial.println()? Können wir darauf verzichten, oder sind diese dennoch sinnvoll? Streiche alle Stellen an, welche für Serial.println() notwendig sind.
  4. In welcher Variablen wird die Luftfeuchtigkeit abgespeichert? Verfolge im Skript den Weg dieser Variablen vom „Einlesen“ bis zum „Wegschicken“ an den Server.
  5. Welche Teile sind individuell für deine Messung und sollten bzw. müssen verändert werden?
  6. Vergleiche das Script mit dem Script, welches zum Auslesen des CO2- Sensors benutzt wird. Wo, wann und wie wird der CO2-Messwert gelesen. In welcher Variablen wird er abgespeichert?   

PHP - Skripte

PHP-Script zur Messwertspeicherung

PHP - Skript zum Einlesen

<?php

$pdo = new PDO('mysql:host=localhost;dbname=**DB_Name*', '**Username**', '**Passwort***');

/* Verbindungsdaten
Host: ***
Datenbankname: ***
User: ***
Passwort: ***
*/

// GET Werte einlesen
if(isset($_GET['wert1'])) {$wert1 = $_GET['wert1'];
} else {$wert1 ="-------";}

if(isset($_GET['wert2'])) {$wert2 = $_GET['wert2'];
} else {$wert2 ="-------";}

if(isset($_GET['wert3'])) {$wert3 = $_GET['wert3'];
} else {$wert3 ="-------";}

if(isset($_GET['wert4'])) {$wert4 = $_GET['wert4'];
} else {$wert4 ="-------";}

if(isset($_GET['wert5'])) {$wert5 = $_GET['wert5'];
} else {$wert5 ="-------";}

if(isset($_GET['wert6'])) {$wert6 = $_GET['wert6'];
} else {$wert6 ="-------";}

if(isset($_GET['wert7'])) {$wert7 = $_GET['wert7'];
} else {$wert7 ="-------";}

if(isset($_GET['beschreibung'])) {$beschreibung = $_GET['beschreibung'];
} else {$beschreibung ="-------";}

if(isset($_GET['info'])) {$info = $_GET['info'];
} else {$info ="-------";}
    


// Eintrag in die Datenbank //   
$sql ="INSERT INTO `1` (`id`, `wert1`, `wert2`, `wert3`, `wert4`, `wert5`, `wert6`, `wert7`, `beschreibung`, `info`, `zeit`) VALUES (NULL, '".$wert1."', '".$wert2."', '".$wert3."', '".$wert4."', '".$wert5."', '".$wert6."', '".$wert7."', '".$beschreibung."', '".$info."', CURRENT_TIMESTAMP);";
$pdo->query($sql);

?>

<!DOCTYPE html>
<html lang="de">
<head>
 <meta charset="utf-8">
 <meta http-equiv="X-UA-Compatible" content="IE=edge">
 <meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
Werte in Datenbank eingetragen.
</body>
</html>
PHP-Script zur tabellarischen Messwertdarstellung

PHP - Skript zur Darstellung

<?php
$pdo = new PDO('mysql:host=localhost;dbname=***', '***', '***');
/* Verbindungsdaten
Host: localhost:3306
Datenbankname: ***
User: ***
Passwort: ***
*/


// GET Werte einlesen
if(isset($_GET['messung'])) {$beschreibung = $_GET['messung'];
	} else {$beschreibung ="";}
?>

<!DOCTYPE html>
<html lang="de">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <meta http-equiv="expires" content="0">
     <meta http-equiv="refresh" content="30">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Raumklima</title>

	<link rel="stylesheet" type="text/css" href="css/bootstrap.min.css" />
    <link rel="stylesheet" type="text/css" href="css/font-awesome.min.css" />

    <script type="text/javascript" src="js/jquery-1.10.2.min.js"></script>
    <script type="text/javascript" src="js/bootstrap.min.js"></script>
    <script src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/MathJax.js?config=TeX-MML-AM_CHTML'></script>
  
<style> <!--eigene Styles: besser in extra Datei / Hier nur zum Test--> 
    h1 { 
       background-color: green;
       color: white;
    }
    p {
    	text-align: left; 
    	color: black;
    }
     body {
	background-color: #CCC;
    }
    .col-sm-8{
	background-color: red;
    }
	
	
	a {text-decoration: none;}
	
		
    </style>
  </head>
 
  <body>
  <!-- Navigation -->
 
<nav class="navbar navbar-inverse">
  <div class="container-fluid">
    <div class="navbar-header">
      <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#myNavbar">
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>                        
      </button>
      <a class="navbar-brand zumachen" href="#">Raumklima</a>
    </div>
    <div class="collapse navbar-collapse" id="myNavbar">
      <ul class="nav navbar-nav">
        <li><a href="#" class="zumachen">Messwerte</a></li>
  
        
		  
		  <li class="dropdown">
          <a class="dropdown-toggle" data-toggle="dropdown" href="#">Sensoren<span class="caret"></span></a>
          <ul class="dropdown-menu">
            <li><a href="index.php#CO2" class="zumachen">CO2-Sensor</a></li>
            <li><a href="index.php#Luftfeuchtigekeit" class="zumachen">Luftfeuchtigkeit </a></li>
            <li><a href="index.php#Feinstaub" class="zumachen">Feinstaub</a></li>
			    <li><a href="index.php#Temperatur" class="zumachen">Temperatur</a></li>
          </ul>
        </li>
		  
	    <li><a href="#netzwerk" class="zumachen">Netzwerktechnik</a></li>
        <li class="dropdown">
          <a class="dropdown-toggle" data-toggle="dropdown" href="#">Internettechnik<span class="caret"></span></a>
          <ul class="dropdown-menu">
            <li><a href="index.php#bootstrap" class="zumachen">HTML & Bootstrap</a></li>
			  <li><a href="index.php#bootstrap" class="zumachen">SVG</a></li>
            <li><a href="index.php#javscript" class="zumachen">Javascript </a></li>
            <li><a href="index.php#php-mysql" class="zumachen">PHP und mySQL</a></li>
          </ul>
        </li>

      </ul>
      <ul class="nav navbar-nav navbar-right">
        <li><a href="#" class="zumachen"><span class="glyphicon glyphicon-user"></span> Kontakt</a></li>
        <li><a href="#" class="zumachen"><span class="glyphicon glyphicon-log-in"></span> Login</a></li>
      </ul>
    </div>
  </div>
</nav>
 
   
 
<!--  START -->
<div class="container">        
		<!--Überschrift: #Anker -->
		<h2>Messwerte:</h2>
		
<!-- Beginn des Formulars -->
<div class="col-xs-12 col-sm-6 col-md-6">
<form name="Messung"   method="GET"> 	
	
<div class="form-group">

<select class="form-control" id="messung" name ="messung">	
	<?php
		$sql ="SELECT DISTINCT `beschreibung` FROM `1` ";
			foreach ($pdo->query($sql) as $row) {
				echo"<option value=\"".$row['beschreibung']."\">".$row['beschreibung']."</option>";
			}
		?>
	
</select>
</div><!--Ende der FormGroup  -->
	<!-- beide Buttons -->
<button type="reset" class="btn col-4  btn-primary">Zurücksetzen</button>
<button type="submit" class="btn col-4 btn-primary">Absenden</button>
</form>
</div>
	<!-- Ende des Formulars-->
	
	

<?php
// schon oben vorhanden : $pdo = new PDO('mysql:host=localhost;dbname=***', '***', '**');


if($beschreibung ==""){
$sql= "SELECT * FROM `1` ORDER BY `id` DESC LIMIT 1000";
}
else {
$sql= "SELECT * FROM `1` where `beschreibung`='".$beschreibung."' ORDER BY `id` DESC LIMIT 1000";
}
echo "<table class=\"table table-striped table-bordered\">";
echo "<tr>";
 echo " <th>id</th><th>Wert 1 </th><th> Wert 2 </th><th> Wert 3 </th><th> Wert 4 </th><th> Wert 5 </th><th> Wert 6 </th><th> Wert 7 </th><th> Beschreibung </th><th> Info</th><th> Zeit</th>";
 echo "</tr>";
foreach ($pdo->query($sql) as $row) {
   echo "<tr>";	
 echo "<td>".$row['id']."</td><td>".$row['wert1']."</td><td>".$row['wert2']."</td><td>".$row['wert3']."</td><td>".$row['wert4']."</td><td>".$row['wert5']."</td><td>".$row['wert6']."</td><td>".$row['wert7']."</td><td>".$row['beschreibung']."</td><td>".$row['info']."</td><td>".$row['zeit']."</td>";
	echo "</tr>";
}
echo "</table>";



?>		

	 
	  
      	  
</div> <!-- ende des Containers der Panel Group-->

<style>
    .faqHeader {
        font-size: 27px;
        margin: 20px;
    }

    .panel-heading [data-toggle="collapse"]:after {
        font-family: 'Glyphicons Halflings';
        content: "\e072"; /* "play" icon */
        float: right;
        color: #F58723;
        font-size: 18px;
        line-height: 22px;
        /* rotate "play" icon from > (right arrow) to down arrow */
        -webkit-transform: rotate(-90deg);
        -moz-transform: rotate(-90deg);
        -ms-transform: rotate(-90deg);
        -o-transform: rotate(-90deg);
        transform: rotate(-90deg);
    }

    .panel-heading [data-toggle="collapse"].collapsed:after {
        /* rotate "play" icon from > (right arrow) to ^ (up arrow) */
        -webkit-transform: rotate(90deg);
        -moz-transform: rotate(90deg);
        -ms-transform: rotate(90deg);
        -o-transform: rotate(90deg);
        transform: rotate(90deg);
        color: #454444;
    }
</style>

<script>
$('.zumachen' ).click(function() {
        $('#myNavbar').collapse('hide');
    });
</script>
 
 
 </body></html>

Sensoren

CO2-Sensor

Tutorial

Anleitung, wie man den CO2 - Sensor über UART anschließen kann:

http://domoticx.com/arduino-co2-sensor-mh-z14/

CO2-Messung und upload zum Server

/*
  Vorlage: Web client 
 */
// und: http://domoticx.com/arduino-co2-sensor-mh-z14/
#include <SPI.h>
#include <Ethernet.h>
#include <SoftwareSerial.h>
SoftwareSerial SerialCom (A2,A3);
byte addArray[] = { 0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79 }; // Befehl zur Abfrage des Sensors
byte zeroArray[] = { 0xFF, 0x01, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78};  // Befehl zum Reset des Sensors
char dataValue[9];
String dataString = "";
long zeit;
int i=0;
 
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // hat man mehr Arduinos im Netz: mac adresse verändern
//byte server[] = { 192, 168, 178, 34 }; // IP -  Adresse des Servers 
char server[] = "www.roboter-im-unterricht.de";    // name address for Google (using DNS)
 
IPAddress ip(192,168,178,100);      //  IP - Adresse des Arduino // wird nur benötigt, wenn DHCP nicht geht.
byte gateway[] = { 192, 168, 178, 1 };
byte subnet[] = { 255, 255, 255, 0 };

EthernetClient client;
 
void setup() {
  Serial.begin(9600);
  SerialCom.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  Serial.println("MH-Z14 C02 Sensor Test Code");
  Serial.println("------------------------------------");
  // start the Ethernet connection:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    Ethernet.begin(mac, ip, gateway, subnet); 
    Serial.println("connecting...");    
  }
  delay(1000); 
  SerialCom.write(zeroArray, 9);
  delay(1000); 
}
 
void loop(){
  delay(60000); // Abfrage alle 60 Sekunden 
  // CO2 Abfragen
  SerialCom.write(addArray, 9);
  SerialCom.readBytes(dataValue, 9);
  int resHigh = (int) dataValue[2];
  int resLow  = (int) dataValue[3];
  int pulse = (256*resHigh)+resLow;
  zeit = millis();  // Zeit in Millisekunden nach Start   
  Serial.println("Zeit: "+ String(zeit)+" Messwert: " +String(pulse)); 
  if (client.connect(server, 80)) {
    Serial.println("Server verbunden.");   
    String url = "GET /Projekt/MesswertAbspeichern.php?zeit="+String(zeit)+"&messwert="+String(pulse)+" HTTP/1.1";
    client.println(url);
    client.println("Host: www.roboter-im-unterricht.de");
    client.println("Connection: close");
    client.println(); 
  } 
  else {
    Serial.println("Aufruf hat nicht geklappt.");
  }
  client.stop();
  client.flush();
}
DHT22-Abfrage

DHT 22 Luftfeuchtigkeit und Temperatur

#include "DHT.h"
 
#define DHTPIN 2     
#define DHTTYPE DHT22 //DHT11, DHT21, DHT22
 
DHT dht(DHTPIN, DHTTYPE);
 
void setup() 
{
  Serial.begin(9600); 
  Serial.println("DHT22 - Test!");
 
  dht.begin();
}
 
void loop() 
{
  float h = dht.readHumidity();     //Luftfeuchte auslesen
  float t = dht.readTemperature();  //Temperatur auslesen
   delay(1000);
  // Prüfen ob eine gültige Zahl zurückgegeben wird. Wenn NaN (not a number) zurückgegeben wird, dann Fehler ausgeben.
  if (isnan(t) || isnan(h)) 
  {
    Serial.println("DHT22 konnte nicht ausgelesen werden");
  } 
  else
  {
    Serial.print("Luftfeuchte: "); 
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperatur: "); 
    Serial.print(t);
    Serial.println(" C");
  }
}
Feinstaubsensor PM Sensor SDS011

Feinstaubsensor PM Sensor SDS011

http://opengeiger.de/Feinstaub/FeinstaubDatenLogger.pdf

Leider ist da ein kleiner Fehler im Script (siehe oben)

Wie die Abfrage (mit dem UART- Protokoll) funktioniert wird im Datenblatt des Sensors erklärt.

Über Sinn und Unsinn einen billigen Sensor zu verwenden hat sich das das Landesamt für Umwelt, Messungen und Naturschutz Baden-Württemberg Gedanken gemacht: Messungen mit dem Feinstaubsensor SDS011 Ein Vergleich mit einem eignungsgeprüften Feinstaubanalysator 

 

HTML und SVG Darstellung

Darstellung mit HTML und SVG

SVG Grafiken

Mit Hilfe von SVG  kann man die Messwerte darstellen. 

Ein Tutorial findet man unter https://www.w3schools.com/graphics/svg_intro.asp

oder bei http://thenewcode.com/1173/Web-Developer-Reading-List-SVG

HTML

<html>

<head>
</head>
<body>
<h2> Messwerte</h2>
<img width="600" height="600" src="bild.svg">
</body>
</html>

SVG

<?xml version="1.0"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg version="1.1" xmlns="http://www.w3.org/2000/svg">
 
 
 <!-- horizontal -->
    <line x1="0" y1="0" x2="600" y2="0" style="stroke:black;stroke-width:2;" />
    <line x1="0" y1="50" x2="600" y2="50" style="stroke:black;stroke-width:1;" />
    <line x1="0" y1="100" x2="600" y2="100" style="stroke:black;stroke-width:2;" />
    <line x1="0" y1="150" x2="600" y2="150" style="stroke:black;stroke-width:1;" />
    <line x1="0" y1="200" x2="600" y2="200" style="stroke:black;stroke-width:2;" />
    <line x1="0" y1="250" x2="600" y2="250" style="stroke:black;stroke-width:1;" />
    <line x1="0" y1="300" x2="600" y2="300" style="stroke:black;stroke-width:2;" />
    <line x1="0" y1="350" x2="600" y2="350" style="stroke:black;stroke-width:1;" />
    <line x1="0" y1="400" x2="600" y2="400" style="stroke:black;stroke-width:2;" />
    <line x1="0" y1="450" x2="600" y2="450" style="stroke:black;stroke-width:1;" />
    <line x1="0" y1="500" x2="600" y2="500" style="stroke:black;stroke-width:2;" />
    <line x1="0" y1="550" x2="600" y2="550" style="stroke:black;stroke-width:1;" />
	<line x1="0" y1="600" x2="600" y2="600" style="stroke:black;stroke-width:1;" />
 
<!-- vertikal--> 
   <line x1="0" y1="0" x2="0" y2="600" style="stroke:black;stroke-width:1;" />
    <line x1="100" y1="0" x2="100" y2="600" style="stroke:black;stroke-width:1;" />
   <line x1="200" y1="0" x2="200" y2="600" style="stroke:black;stroke-width:1;" />
   <line x1="300" y1="0" x2="300" y2="600" style="stroke:black;stroke-width:1;" />
   <line x1="400" y1="0" x2="400" y2="600" style="stroke:black;stroke-width:1;" />
   <line x1="500" y1="0" x2="500" y2="600" style="stroke:black;stroke-width:1;" />
   <line x1="600" y1="0" x2="600" y2="600" style="stroke:black;stroke-width:1;" />
   
   
  
   <polyline  points="0,0 10,10 20,40 30,50 40,62 50,70 60,80 400,500 450,10 600,600"
           style="stroke:black;stroke-width:3;fill:none" />
	
		
  
</svg>