Addendum2 zum Tutorial – Speicherung von MySQL DB Werten mit ESP8266

Nachdem ich mich in meinen letzten Blogs intensiv mit dem ESP8266 auseinandergesetzt habe, steht logischerweise eine Erweiterung meines Tutorials zur Speicherung von Messwerten in eine MySQL DB unter Verwendung des ESP8266 an. Das Programm wurde weitestgehend analog dem bisherigen Programm aufgebaut, so dass es relativ einfach zu verstehen sein sollte.  Im Programm müssen noch die persönlichen Daten für das WLAN und den Host eingetragen werden.

/* 
 Programm zur Speicherung von Messwerten in einer webbasierten MySQL DB
  based on standard programs of the ESP8266Wifi library 
  and examples on sparkfun.com
 */
 
#include <ESP8266WiFi.h>
#define CYCLE 60000

const char* ssid     = "hier deine SSID";
const char* password = "und das Passwort des WLANs";
const char* host = "hier deinen Host eintragen";
unsigned long value = 0;
unsigned int lastcall = CYCLE;
int conn_time;

void setup() {
  Serial.begin(115200);
  delay(10);

  // We start by connecting to a WiFi network

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    conn_time++;
    if (conn_time > 20) {
      break;
    }
  }
  if (WiFi.status() == WL_CONNECTED) {
    Serial.println("");
    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
  }
  else {
    Serial.println("");
    Serial.println("no WiFi connection");
    ESP.deepSleep(100000);
    Serial.println("gone to sleep");
  }
}

void loop() {
  while (millis() - lastcall < CYCLE) {
    delay(1);
  }
  lastcall = millis();
  ++value;

  Serial.print("connecting to ");
  Serial.println(host);

  // Use WiFiClient class to create TCP connections
  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return;
  }

  // We now create a URI for the request
  String url = "/w2mysql.php";
  url += "?A0=";
  url += millis();
  url += "&A1=";
  url += value;
 
  Serial.print("Requesting URL: ");
  Serial.println(url);

  // This will send the request to the server
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Connection: close\r\n\r\n");
  delay(1000);

  // Read all the lines of the reply from server and print them to Serial
  while (client.available()) {
    String line = client.readStringUntil('\r');
    Serial.print(line);
  }

  Serial.println();
  Serial.println("closing connection");
}
Advertisements

Veröffentlicht am 24. Oktober 2015, in Arduino, ESP8266, MySQL, Tutorial, WiFi. Setze ein Lesezeichen auf den Permalink. 18 Kommentare.

  1. Danke erstmal für die tollen tutorials nur hab ich ne kleine frage: sind in dem sketch die A0 und die A1 die eingänge an dem esp modul selber ? das ganze wird doch standalone betrieben oder ?

    • A0 und A1 sind in diesem Fall lediglich die Übergabevariablen an die php-Webseite und wie in den bisherigen Beispielen übernommen worden. Übergeben werden hier als Beispiel der Inhalt von millis() und eine Zählvariable „value“. Der ESP8266-01 stellt leider keinen Analogeingang zur Verfügung. Man kann aber sehr einfach Sensoren per i2c oder Onewire anschließen.

  2. Hallo

    Ich habe eine Wetterstation anhand deines Codes nachgebaut, soweit funktioniert alles
    Noch ein paar optimierungen auf meiner HP nötig……..

    Besten Dank für Deinen Code !!!

    Ich habe noch eine Frage ich würde gerne noch einen Externen DHT 22 Sensor anschliessen ev. mit einem PRO mini und mit 433MHZ Funk
    leider finde ich keine library für den ESP um die Daten zu empfangen
    Hast Du da ev einen Tipp ?

    Besten Dank
    Markus

  3. Hallo
    Soweit habe ich es geschafft mit dem ESP Daten via 433 mhz von einem Pro mini zu empfangen
    Wo muss ich nun den Code integrieren, dass der ESP immer Daten vom pro mini empfangen kann aber nur alle 15 min an den Webserver sendet ?

    Gruss MABA

    Anbei mein Empfangscode:

    /*
      Simple example for receiving
      
      http://code.google.com/p/rc-switch/
    */
    
    #include 
    
    RCSwitch mySwitch = RCSwitch();
    
    void setup() {
      Serial.begin(9600);
      mySwitch.enableReceive(12);  // Receiver on inerrupt 0 =&gt; that is pin #12
    
      int hum = 0;
       float temp = 0;
       long lux = 0;
    }
    
    void loop() {
      if (mySwitch.available()) {
        
        int value = mySwitch.getReceivedValue();
        
        if (value == 0) {
          Serial.print("Unknown encoding");
        } else {
          Serial.print("Received ");
          Serial.print( mySwitch.getReceivedValue() );
          Serial.print(" / ");
          Serial.print( mySwitch.getReceivedBitlength() );
          Serial.print("bit ");
          Serial.print("Protocol: ");
          Serial.println( mySwitch.getReceivedProtocol() );
        }
    
    Serial.print("test");
      // Serial.println( value);
       
    
    if (value &gt; 1 &amp;&amp; value  1000 &amp;&amp; value  7990 &amp;&amp; value &lt;100000) {
      long lux = value ;
      lux = (lux - 8000);
      
    Serial.print(&quot;Helligkeit &quot;);  
    Serial.print(lux);
    Serial.println(&quot; lux&quot;); 
    }
        mySwitch.resetAvailable();
      }
     }
  4. anbei noch der kompl Code um die Daten zu empfangen läuft auf den esp

    /*
      Simple example for receiving
      
      http://code.google.com/p/rc-switch/
    */
    
    #include 
    
    RCSwitch mySwitch = RCSwitch();
    
    void setup() {
      Serial.begin(9600);
      mySwitch.enableReceive(12);  // Receiver on inerrupt 0 =&gt; that is pin #12
    
      int hum = 0;
       float temp = 0;
       long lux = 0;
    }
    
    void loop() {
      if (mySwitch.available()) {
        
        int value = mySwitch.getReceivedValue();
        
        if (value == 0) {
          Serial.print("Unknown encoding");
        } else {
          Serial.print("Received ");
          Serial.print( mySwitch.getReceivedValue() );
          Serial.print(" / ");
          Serial.print( mySwitch.getReceivedBitlength() );
          Serial.print("bit ");
          Serial.print("Protocol: ");
          Serial.println( mySwitch.getReceivedProtocol() );
        }
    
    Serial.print("test");
      // Serial.println( value);
       
    
    if (value &gt; 1 &amp;&amp; value  1000 &amp;&amp; value  7990 &amp;&amp; value &lt;100000) {
      long lux = value ;
      lux = (lux - 8000);
      
    Serial.print(&quot;Helligkeit &quot;);  
    Serial.print(lux);
    Serial.println(&quot; lux&quot;); 
    }
        mySwitch.resetAvailable();
      }
     }
  5. Hallo Markus,
    muss ich mir mal in Ruhe ansehen.
    Prinzipiell musst du 2 Loops bauen. Die äußere loop empfängt ständig Daten und mittelt diese oder speichert die Daten in einen Buffer, die innere Loop wird nur aktiv wenn eine Zeitkondition „alle 15min“ aktiv ist, darin werden dann die Daten abgespeichert.
    Vielleicht kannst du es mit dieser Anregung ja selber lösen.
    Bis dahin, Reinhard

  6. Code vom ESP „empfang“

    /*
      Simple example for receiving
    
      http://code.google.com/p/rc-switch/
    */
    
    #include <RCSwitch.h>
    
    RCSwitch mySwitch = RCSwitch();
    
    void setup() {
      Serial.begin(9600);
      mySwitch.enableReceive(12);  // Receiver on inerrupt 0 => that is pin #12
    
      int hum = 0;
      float temp = 0;
      long lux = 0;
    }
    
    void loop() {
      //Serial.println("test");
      if (mySwitch.available()) {
    
        int value = mySwitch.getReceivedValue();
    
        if (value == 0) {
          Serial.print("Unknown encoding");
        } else {
          Serial.print("Received ");
          Serial.print( mySwitch.getReceivedValue() );
          Serial.print(" / ");
          Serial.print( mySwitch.getReceivedBitlength() );
          Serial.print("bit ");
          Serial.print("Protocol: ");
          Serial.println( mySwitch.getReceivedProtocol() );
        }
    
        Serial.print("test");
        // Serial.println( value);
    
    
        if (value > 1 && value < 100) {
          int hum = value;
    
          Serial.print("Luftfeuctigkeit ");
          Serial.print( hum);
          Serial.println(" %");
    
        }
    
        if (value > 1000 && value < 7000) {
          float temp = value ;
          temp = ((temp - 3000) / 100);
    
          Serial.print("Temperatur ");
          Serial.print( temp);
          Serial.println(" C");
        }
    
        if (value > 7990 && value < 100000) {
          long lux = value ;
          lux = (lux - 8000);
    
          Serial.print("Helligkeit ");
          Serial.print(lux);
          Serial.println(" lux");
        }
        mySwitch.resetAvailable();
      }
    }
    
  7. Code esp 2
    noch etwas chaotisch……….

    /* 
     Programm zur Speicherung von Messwerten in einer webbasierten MySQL DB
      based on standard programs of the ESP8266Wifi library 
      and examples on sparkfun.com
     */
    
    #include <Wire.h>  
    #include <ESP8266WiFi.h>
    #define CYCLE 900000
    #include <Adafruit_BMP085.h>
    #include "DHT.h"
     
    const char* ssid     = "name";
    const char* password = "password";
    const char* host = "xyz.com";
    unsigned long value = 0;
    unsigned int lastcall = CYCLE;
    int conn_time;
    
    Adafruit_BMP085 bmp;
    
    #define DHTPIN 2     // what pin we're connected to
    
    // Uncomment whatever type you're using!
    //#define DHTTYPE DHT11   // DHT 11
    #define DHTTYPE DHT22   // DHT 22  (AM2302)
    //#define DHTTYPE DHT21   // DHT 21 (AM2301)
    
    // Connect pin 1 (on the left) of the sensor to +5V
    // NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1
    // to 3.3V instead of 5V!
    // Connect pin 2 of the sensor to whatever your DHTPIN is
    // Connect pin 4 (on the right) of the sensor to GROUND
    // Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor
    
    // Initialize DHT sensor.
    // Note that older versions of this library took an optional third parameter to
    // tweak the timings for faster processors.  This parameter is no longer needed
    // as the current DHT reading algorithm adjusts itself to work on faster procs.
    //DHT dht(DHTPIN, DHTTYPE);
    
    DHT dht(DHTPIN, DHTTYPE,16); 
     
    void setup() {
      Serial.begin(115200);
      delay(10);
     
      // We start by connecting to a WiFi network
     
      Serial.println();
      Serial.println();
      Serial.print("Connecting to ");
      Serial.println(ssid);
     
      WiFi.begin(ssid, password);
     
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
        conn_time++;
        if (conn_time > 20) {
          break;
        }
      }
      if (WiFi.status() == WL_CONNECTED) {
        Serial.println("");
        Serial.println("WiFi connected");
        Serial.println("IP address: ");
        Serial.println(WiFi.localIP());
      }
      else {
        Serial.println("");
        Serial.println("no WiFi connection");
        ESP.deepSleep(100000);
        Serial.println("gone to sleep");
      }
    if (!bmp.begin()) {
      Serial.println("Could not find a valid BMP085 sensor, check wiring!");
      while (1) {}
      }
    
    Serial.println("DHTxx test!");
    
      dht.begin();
    
    }
     
    void loop() {
      while (millis() - lastcall < CYCLE) {
        delay(1);
      }
      lastcall = millis();
      ++value;
     
      Serial.print("connecting to ");
      Serial.println(host);
     
      // Use WiFiClient class to create TCP connections
      WiFiClient client;
      const int httpPort = 80;
      if (!client.connect(host, httpPort)) {
        Serial.println("connection failed");
        return;
      }
    Serial.print("Temperature = ");
        Serial.print(bmp.readTemperature());
        Serial.println(" *C");
        
        Serial.print("Pressure = ");
        Serial.print(bmp.readPressure());
        Serial.println(" Pa");
        
        // Calculate altitude assuming 'standard' barometric
        // pressure of 1013.25 millibar = 101325 Pascal
        //Serial.print("Altitude = ");
        //Serial.print(bmp.readAltitude());
        //Serial.println(" meters");
    
        Serial.print("Pressure at sealevel (calculated) = ");
        Serial.print(bmp.readSealevelPressure(450)/100.00);
        Serial.println(" hPa");
    
     Serial.print("Pressure at Baar (calculated) = ");
        Serial.print(bmp.readSealevelPressure()/100.00);
        Serial.println(" hPa");
    
      // you can get a more precise measurement of altitude
      // if you know the current sea level pressure which will
      // vary with weather and such. If it is 1015 millibars
      // that is equal to 101500 Pascals.
        //Serial.print("Real altitude = ");
        //Serial.print(bmp.readAltitude(101500));
        //Serial.println(" meters");
        
        Serial.println();
    
    
    // Wait a few seconds between measurements.
      delay(2500);
    
      // Reading temperature or humidity takes about 250 milliseconds!
      // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
      float h = dht.readHumidity();
      // Read temperature as Celsius (the default)
      float t = dht.readTemperature();
      // Read temperature as Fahrenheit (isFahrenheit = true)
      float f = dht.readTemperature(true);
    
      // Check if any reads failed and exit early (to try again).
      if (isnan(h) || isnan(t) || isnan(f)) {
        Serial.println("Failed to read from DHT sensor!");
        return;
      }
    float p;  //Taupunkt
    float p5;  //Taupunkt
    //Taupunkt
      float tt = dht.readTemperature();       // Die Temperatur wird vom DHT22 ausgelesen, Wert in "t" schreiben
      float r = dht.readHumidity();          // Die Luftfeuchte wird vom DHT22 ausgelesen, Wert in "r" schreiben
      float d = 17.271;
      float b = 237.7;
      float taupunktTemp = (d * tt) / (b + tt) + log(r / 100);
       p5 = (b * taupunktTemp) / (d - taupunktTemp);
      //Serial.print("Taupunkt");
      //erial.println(p5);
    
    
    
      // Compute heat index in Fahrenheit (the default)
      float hif = dht.computeHeatIndex(f, h);
      // Compute heat index in Celsius (isFahreheit = false)
      float hic = dht.computeHeatIndex(t, h, false);
    delay(500);
      Serial.print("Humidity: ");
      Serial.print(h);
      Serial.print(" %\t");
      Serial.print("Temperature: ");
      Serial.print(t);
      Serial.print(" *C ");
      //Serial.print(f);
      //Serial.print(" *F\t");
      Serial.print("Heat index: ");
      Serial.print(hic);
      Serial.println(" *C ");
    
    
     
      // We now create a URI for the request
      String url = "/data2mysql.php";
      url += "?A0=";
      url += (bmp.readSealevelPressure(455)/100.00);
      url += "&A1=";
      url += (t);
     url += "&A2=";
      url += (p5);
       url += "&A3=";
      url += (hic);
       url += "&A4=";
      url += 0.0;
       url += "&A5=";
      url += (h);
     url += "&A6=";
      url += 0.0;
      url += "&A7=";
      url += 0.0;
      url += "&A8=";
      url += 0.0;
      url += "&A9=";
      url += 0.0;
      url += "&A10=";
      url += 0.0;
    
    
    
    
      
      
      Serial.print("Requesting URL: ");
      Serial.println(url);
     
      // This will send the request to the server
      client.print(String("GET ") + url + " HTTP/1.1\r\n" +
                   "Host: " + host + "\r\n" +
                   "Connection: close\r\n\r\n");
      delay(1000);
     
      // Read all the lines of the reply from server and print them to Serial
      while (client.available()) {
        String line = client.readStringUntil('\r');
        Serial.print(line);
      }
     
      Serial.println();
      Serial.println("closing connection");
    }
    
  8. Hallo Reinhard
    Wie am 10.1. kurz beschrieben

    Die beiden Codes funktionieren einzeln problemlos.

    Nun möchte ich die beiden Codes zusammenführen
    Der ESP soll immer auf Signale vom 433 Sender warten und dann alle Werte (vom 433 Sensor (Temp Aussen /Hum Aussen/ Helligkeit Aussen ) und die Messwerte vom ESP (Innenraum) alle 15 Minuten an meine mysql DB übermitteln.

    Danke für Deine Unterstützung
    Gruss Markus

    • Als erstes solltest du den Empfangssketch auf dem ESP zum laufen bringen. Ich bin mir allerdings nicht sicher, ob die RC Switch Library auf dem ESP funktioniert.
      Ich werde dir keine Lösung anbieten, da musst du schon selber ran gehen.

  9. Hallo

    Der Empfangssketch funktioniert auf dem ESP

    Markus

    • Ah, ok, das ist schonmal gut.

      Zunächst einige Tips, die mir beim Durchsehen der Sketche auffallen:
      im RCSwitch Sketch:
      Wenn du eine Variable innerhalb von void setup() definierst, ist sie auch nur dort gültig

      void setup() {
      ...
        int hum = 0;
        float temp = 0;
        long lux = 0;
      }
      

      und muss entsprechend in void loop() nochmal definiert werden, was du ja auch tust. Wenn eine Variable für das gesamte Programm gültig sein soll, immer außerhalb definieren, also ändern und Definition aus der loop() raus.
      Im zweiten Sketch:
      Wenn du folgendes statt deiner Konstruktion machst (als Beispiel):

      float t = dht.readTemperature();
      Serial.print("Temperature = ");
      Serial.print(f);
      Serial.println(" *C");
      

      musst du nur einmal messen und das Programm wird kompakter.
      Du hast noch viele delay(..) im Programm, in der Zeit wird die RCSwitch Empfangsroutine nicht bedient. Das geht zB mit if (millis() – lasttime > 500) … besser

      Zum Vorgehen der Zusammenschaltung beider Programme:
      nimm die Initialisierungen aus dem RCSwitch Sketch mit in den 2. Sketch, also

      #include 
      RCSwitch mySwitch = RCSwitch();
      void setup() {
      ....
        mySwitch.enableReceive(12);  // Receiver on inerrupt 0 =&gt; that is pin #12
      ....
      }
      

      Nimm alles zwischen
      if (mySwitch.available()) {
      und
      mySwitch.resetAvailable();
      außerhalb der while (millis() – lastcall < CYCLE) {
      Scheife in den zweiten Sketch. Damit hast du die Messungen bereits im zweiten Sketch und kannst sie abspeichern.

      Als Tips sollte das reichen, jetzt musst du nochmal ran :-)

  10. Hallo
    Ich habe nun meinen Code soweit mal bereinigt.

    Aber der sketch Teil ausserhalb der while Schlaufe funktioniert noch nicht
    Anbei ein Test sketch: da sollte doch jetzt alle 2 Sekunden „wetter daten einlesen“ auf dem serial monitor erscheinen und jede Minute der Datentransfer stattfinden oder interpretiere ich da was falsch ?

    Gruss Markus

    /* 
     Programm zur Speicherung von Messwerten in einer webbasierten MySQL DB
      based on standard programs of the ESP8266Wifi library 
      and examples on sparkfun.com
     */
      
    #include <ESP8266WiFi.h>
    #define CYCLE 60000
     
    const char* ssid     = "test";
    const char* password = "password";
    const char* host = "test.com";
    unsigned long value = 0;
    unsigned int lastcall = CYCLE;
    int conn_time;
     
    void setup() {
      Serial.begin(9600);
      delay(10);
     
      // We start by connecting to a WiFi network
     
      Serial.println();
      Serial.println();
      Serial.print("Connecting to ");
      Serial.println(ssid);
     
      WiFi.begin(ssid, password);
     
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
        conn_time++;
        if (conn_time > 20) {
          break;
        }
      }
      if (WiFi.status() == WL_CONNECTED) {
        Serial.println("");
        Serial.println("WiFi connected");
        Serial.println("IP address: ");
        Serial.println(WiFi.localIP());
      }
      else {
        Serial.println("");
        Serial.println("no WiFi connection");
        ESP.deepSleep(100000);
        Serial.println("gone to sleep");
      }
    }
     
    void loop() {
    
    Serial.println("wetter daten einlesen");
     delay(2000);
      
      while (millis() - lastcall < CYCLE) {
        delay(1);
      }
      lastcall = millis();
      ++value;
     
      Serial.print("connecting to ");
      Serial.println(host);
     
      // Use WiFiClient class to create TCP connections
      WiFiClient client;
      const int httpPort = 80;
      if (!client.connect(host, httpPort)) {
        Serial.println("connection failed");
        return;
      }
     
      // We now create a URI for the request
      String url = "/w2mysql.php";
      url += "?A0=";
      url += millis();
      url += "&A1=";
      url += value;
      
      Serial.print("Requesting URL: ");
      Serial.println(url);
     
      // This will send the request to the server
      client.print(String("GET ") + url + " HTTP/1.1\r\n" +
                   "Host: " + host + "\r\n" +
                   "Connection: close\r\n\r\n");
      delay(1000);
     
      // Read all the lines of the reply from server and print them to Serial
      while (client.available()) {
        String line = client.readStringUntil('\r');
        Serial.print(line);
      }
     
      Serial.println();
      Serial.println("closing connection");
    }
    
  1. Pingback: Tutorial: Website parsen mit dem ESP8266 – Teil 1 | Glaskugelsehen Blog

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: