1. Der ESP8266-12E
Der ESP8266-12E ist ein Arduino-ähnlicher Baustein, welcher einen WLAN-Baustein mit integriert hat. Sucht man auf Google danach, findet man diesen bei vielen Quellen zu kaufen. Das Tolle ist, dass er mit der Arduino-Umgebung programmiert werden kann, sodass alle Libraries auch funktionieren!
2. Einrichtung Arduino für den ESP8266-12E
Zuerst sollte der CH340-Treiber installiert werden. Da es dazu genug im Internet gibt werde ich darauf nicht eingehen. Als nächstes muss in der Arduino-Umgebung auf die Voreinstellungen gehen:
Hier trägt man nun die zusätzliche Boardverwalter-URL ein:
http://arduino.esp8266.com/stable/package_esp8266com_index.json
Danach kann man dann auch schon im Boardverwalter die Einstellungen für die Boards herunterladen:
Hier muss nun nach "ESP8266" gesucht werden und das sollte dann auch installiert werden:
Nun ist eigentlich alles vorbereitet und wir können das Board auswählen, ich habe dabei "NodeMCU 1.2 (ESP8266-12E Module)" ausgewählt:
3. Der Code
Zu dem Code gibt es eigentlich nicht viel zu erklären. Einerseits muss man seine WLAN-Daten eingeben, darunter wird der DHT22-Sensor initialisiert. In "Loop" wird getestet ob man mit dem WLAN verbunden ist, sollte dies der Fall sein, so wird Temperatur und Luftfeuchte gemessen (float t und float h), diese Werte werden in einen String (requestString) geschrieben und dann als HTTP Get-Request an einen Webserver gesendet. Den Code für den Web-Server habe ich unten angefügt.
#include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> const char* ssid = "***"; const char* password = "***"; int wifiStatus; #include "DHT.h" #define DHTPIN D2 #define DHTTYPE DHT22 DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); // put your setup code here, to run once: Serial.print("Your are connecting to;"); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } dht.begin(); } void loop() { // put your main code here, to run repeatedly: wifiStatus = WiFi.status(); if(wifiStatus == WL_CONNECTED){ Serial.println(""); Serial.println("Your ESP is connected!"); Serial.println("Your IP address is: "); Serial.println(WiFi.localIP()); float t = dht.readTemperature(); float h = dht.readHumidity(); HTTPClient http; char requestString[255] = ""; sprintf(requestString, "http://webServer.de/Send.php?name=TemperatureSensor&data=%f,%f", t, h); http.begin(requestString); //Specify request destination int httpCode = http.GET(); //Send the request if (httpCode > 0) { //Check the returning code String payload = http.getString(); //Get the request response payload Serial.println(payload); //Print the response payload } http.end(); //Close connection delay(300000); } else{ Serial.println(""); Serial.println("WiFi not connected"); delay(1000); } }
4. Der Server-Code
Auf meinem Raspberry Pi läuft ein Apache-Webserver. In /var/www liegt die Datei "Send.php", welche einfach Sensordaten annimmt und in .csv-Dateien schreibt. Dabei übergibt der Sensor im Get-Befehl seinen Namen, das wird dann auch der Dateiname, hier wird dann mit aktuellem Zeitstempel der Inhalt von "data" angehängt, was in diesem Fall die Temperatur in °C und die Luftfeuchte in % ist.
<html>
<head>
<title>Send Sensor Values</title>
</head>
<body>
<?php
$name = htmlspecialchars($_GET["name"]);
$data = htmlspecialchars($_GET["data"]);
$date = date("Y-m-d") . "T" . date("H:i:s.u") . "Z";
$file = "data/".$name.".csv";
$Saved_File = fopen($file, 'a');
fwrite($Saved_File, $date . "," . $data . "\r\n");
fclose($Saved_File);
?>
</body>
</html>