Sensordaten mit dem esp8266 Modul an einen Server senden

Wie ich im Artikel „http://fluuux.de/2016/08/einfuehrung-esp8266-wifi-modul/“ bereits erwähnt habe, möchte ich nun in diesem Beitrag zeigen wie man mit dem esp8266 WiFi Modul, die mittels DHT22 Sensor ermittelten Temperatur und Luftfeuchtewerte an einen Server senden und diese anschließend auswerten kann.

Für dieses Beispiel benötigen wir an Hardware gerade einmal ein esp8266 Modul, einen DHT22 Sensor, einen Widerstand für den DHT22 Sensor und ein paar Jumperkabel. Zum übertragen des Sketches auf den esp8266 brauchen wir aber wie gehabt zwei Buttons. Einen um das Board zu reseten und einen um in den Upload Modus zu wechseln.

esp8266 - DHT22 - Breadboard

 

Für dieses Beispiel wollte ich nicht erst selbst eine Website anlegen um die Sensordaten zu empfangen und in einer Datenbank zu speichern. Dafür gibt es ja bereits einen Beitrag.

Um es mir also einfach zu machen, habe ich auf https://data.sparkfun.com/streams/make einen neuen Stream, also ein Projekt erstellt in dem die Sensorwerte gespeichert werden. Im Formular auf dieser Seite müssen lediglich die Felder für Titel, Beschreibung, Sichtbarkeit und Felder ausgefüllt werden. Im Eingabefeld „Fields“ habe ich die schon vorgegebenen Bezeichner „humidity“ und „temp“ getrennt durch ein Komma eingetragen. Passt ja ganz gut zu diesem Projekt.

Außerdem habe ich angegeben dass mein Stream nicht in der Liste der öffentlichen Streams erscheinen soll. Das ist allerdings Geschmackssache und muss jeder selber wissen ob er will dass seine Sensordaten für alle sichtbar sein sollen. Nachdem Sie auf den Save Button geklickt haben, wird eine Seite geöffnet, auf der Sie sämtliche Daten für das Projekt und ein kleines Beispiel angezeigt werden.

Ganz wichtig. Notieren Sie sich die Daten oder lassen Sie sich diese per eMail zuschicken, da Sie diese für das Sketch und auch später zum verwalten des Streams auf data.sparkfun.com benötigen.

Wenn Sie den Aufbau wie oben zu sehen fertig haben, kann es auch schon an das schreiben des Sketches gehen das im Anschluss auf dem esp8266 gespeicheret werden soll.

 

Arduino Sketch für den esp8266

/*
 *  Sensordaten via HTTP GET requests an data.sparkfun.com service senden.
 */

#include <ESP8266WiFi.h>
#include <DHT.h>

#define DHTTYPE DHT22
#define DHTPIN  2
#define DEBUG false // true = Ausgabe im Seriellen Monitor

DHT dht(DHTPIN, DHTTYPE, 22);

const char* ssid       = "NETZWERKNAME";
const char* password   = "NETZWERKPASSWORT";
const char* host       = "data.sparkfun.com";
const char* publicKey  = "PUBLICKEY";
const char* privateKey = "PRIVATEKEY";

float humidity, temp;

unsigned long previousMillis = 0;  // will store last temp was read
const long interval = 600000;      // 600000ms = 10 Minuten interval at which to read sensor


// Temperatur und Luftfeuchte per DHT22-Sensor ermitteln
void getTemperature() {
  humidity = dht.readHumidity();          // Read humidity (percent)
  temp     = dht.readTemperature(false);    // Read temperature as Celsius

  if(DEBUG) {
    if (isnan(humidity) || isnan(temp)) {
      Serial.println(F("Fehler beim lesen vom DHT Sensor!"));
      return;
    } else {
      Serial.print(F("Luftfeuchte: "));
      Serial.print(humidity,1);
      Serial.print(F("%, Temp: "));
      Serial.print(temp,1);
      Serial.println(F(" Celsius"));
    }
  } else {
    if (isnan(humidity) || isnan(temp)) {
      return;
    }
  }
}




// Verbindung zu data.sparkfun.com herstellen
// Temperatur und Luftfeuchte an data.sparkfun.com senden
// Verbindung zu data.sparkfun.com beenden
void connectAndSendData() 
{
  if(DEBUG) {
    Serial.println("");
    Serial.print(F("Verbinde zu '"));
    Serial.print(host);
  }
  
  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    if(DEBUG) Serial.println(F("[FEHLER]"));
    return;
  }

  Serial.println("");

  getTemperature();
  
  String url = "/input/";
  url += publicKey;
  url += "?private_key=";
  url += privateKey;
  url += "&humidity=";
  url += humidity,1; //humidity mit 1 Nachkommastelle
  url += "&temp=";
  url += temp,1; //Temp mit 1 Nachkommastelle

  if(DEBUG) {
    Serial.print("Requesting URL: ");
    Serial.println(url);
  }
  
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" + 
               "Connection: close\r\n\r\n");
  unsigned long timeout = millis();
  while (client.available() == 0) {
    if (millis() - timeout > 5000) {
      if(DEBUG) Serial.println("[Client Timeout]");
      client.stop();
      return;
    }
  }
  
  // Read all the lines of the reply from server and print them to Serial
  if(DEBUG) {
    while(client.available()){
      String line = client.readStringUntil('\r');
      Serial.print(line);
    }
    Serial.println("");
    Serial.print(F("Verbindung zu '"));
    Serial.print(host);
    Serial.println(F("' beendet."));
  }
}
    


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

    Serial.println("");
    Serial.print(F("Verbinde zu WLAN-Netzwerk '"));
    Serial.print(ssid);
    Serial.print("' ");
  }
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }

  if(DEBUG) {
    Serial.println(F("[VERBUNDEN]"));  
    Serial.print(F("IP Adresse: "));
    Serial.print(WiFi.localIP());
    Serial.println("");
  }
  
  dht.begin();
  
  connectAndSendData();
}




void loop() {
  unsigned long currentMillis = millis();
     
  if(currentMillis - previousMillis >= interval) 
  {
    previousMillis = currentMillis;

    connectAndSendData();
  }
}

 

Bitte passen Sie nun die Werte in den Zeilen 14, 15, 17 und 18 an. Geben Sie dazu die Werte, die nach dem erstellen des Streams angezeigt wurden, hier ein. Ich hoffe doch dass Sie diese auch wirklich gespeichert haben.
Wenn Sie in Zeile 10 DEBUG auf true setzen dann können Sie sich im Seriellen Monitor die ermittelten Sensorwerte, die Rückgabe des Servers und die ermittelte IP, sowie eventuell auftretende Fehler ausgeben lassen. Das ist also gerade am Anfang, bis alles sauber läuft, sehr emfehlenswert.

 

Sketch auf dem esp8266 speichern

Ich denke zum speichern des Sketches auf dem esp8266 brauche ich nicht mehr viel zu schreiben da dies bereits im Beitrag http://fluuux.de/2016/08/einfuehrung-esp8266-wifi-modul/ behandelt wurde. Nur noch mal in groben Zügen. Das esp8266 nie mit mehr als 3,6V betreiben. „Prog-Button“ drücken und gedrückt halten, „Reset-Button“ kurz drücken und anschließend den „Prog-Button“ loslassen. Nun kann man, nachdem man das passende Board und den richtigen Port im Menü ausgewählt hat, das Sketch auf den esp8266 speichern.

Um sich die auf den sparkfun Server gespeicherten Sensorwerte nun auch graphisch ansprechend anzeigen lassen zu können, muss noch eine kleine Html-Seite angelegt werden. Wenn Sie die Felder auf der sparkfun Seite auch humidity und temo genannt haben, müssen Sie lediglich Ihren PublicKey in Zeile 14 anpassen. Ansonsten ändern Sie noch die Feldnamen in den Zeilen 26 und 27. Die in Zeile 25 angegebene Spalte Time wird automatisch generiert. In dieser wird jedesmal wenn ein Sensorwert auf sparkfun.com gespeichert wird, der aktuelle TimeStamp abgelegt.

 

Html-Seite für die Ausgabe der Sensordaten

<!DOCTYPE html>
<html>
  <head>
    <!-- EXTERNAL LIBS-->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <script src="https://www.google.com/jsapi"></script>

    <!-- EXAMPLE SCRIPT -->
    <script>

      // onload callback
      function drawChart() {

        var public_key = 'PUBLICKEY';

        // JSONP request
        var jsonData = $.ajax({
          url: 'https://data.sparkfun.com/output/' + public_key + '.json',
          data: {page: 1},
          dataType: 'jsonp',
        }).done(function (results) {

          var data = new google.visualization.DataTable();

          data.addColumn('datetime', 'Time');
          data.addColumn('number', 'Luftfeuchte');
          data.addColumn('number', 'Temperatur');

          $.each(results, function (i, row) {
            data.addRow([
              (new Date(row.timestamp)),
              parseFloat(row.humidity),
              parseFloat(row.temp)
            ]);
          });

          var chart = new google.visualization.LineChart($('#chart').get(0));
			
		  
          chart.draw(data, {
            title: 'Fluuux - ESP8266 + DHT22'
          });

        });

      }

      // load chart lib
      google.load('visualization', '1', {
        packages: ['corechart']
      });

      // call drawChart once google charts is loaded
      google.setOnLoadCallback(drawChart);

    </script>

  </head>
  <body>
    <div id="chart" style="width: 100%;"></div>
  </body>
</html>

 

Wenn Sie diese Website nun aufrufen erhalten Sie eine Ausgabe in folgendem Design.
Da es sich hierbei um ein ganz gewöhnliches Google Chart handelt, kann man sich hier natürlich selbst noch einiges anpassen.

Webansicht_Sensorwerte

Misstrauen Sie Drittanbietern bei denen Sie kostenlos Daten ablegen können, haben Sie natürlich auch die Möglichkeit eine eigene Seite zu programmieren die Ihre Sensordaten entgegennimmt und vielleicht in einer MySQL-Datenbank abspeichert.
Das war es auch schon. Sie sehen wie einfach es Dank des esp8266 ist, Sensordaten an einen Server zu senden.

Ich hoffe der Beitrag hat Ihnen gefallen. Bei Fragen oder Anregungen benutzen Sie bitte das Kommentarfeld.

 

Über Enrico S.

Programmierer, Webdesigner, Grafiker, Blogger, Screencaster, Arduino- und eMobility Enthusiast. nefilim3006 ist auch bei Google+ vertreten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.