In diesem DIYTechAdventure zeige ich dir, wie du mit einem ESP32 über WLAN einen HTTP-Request durchführen und die erhaltenen Sensordaten des SHT31 in eine Datenbank auf einem Webserver schreiben kannst. Der ESP ist ein Mikrocontroller, der sich ideal für IoT-Projekte eignet.
Hierbei sollen uns die Beiträge ESP8266 ins WLAN bringen und Temperaturmessung mit dem SH3x als Grundlagenbildung dienen. Lies gerne nach, wenn du unsicher bist.
Schaue dir auch unbedingt die Grundlagen zum Senden von Daten an einen Webserver an. Ich gehe hier nicht mehr auf die Verbindung zum WLAN ein.
Als Lerneffekt habe ich in diesem DIYTechAdventure die Möglichkeit einer Absicherung von Inserts an die Datenbank beschrieben.
Voraussetzungen
- Eine NodeMCU (ESP8266) -> bekommst du günstig bei AzDelivery oder Aliexpress
- Einen SHT31-> bekommst du günstig bei Aliexpress
- Zugang zu einem WLAN-Netzwerk
- Ein Webserver mit einer Datenbank (z.B. MySQL)
- Grundkenntnisse in Arduino-Programmierung und SQL
Ich stelle hier nochmals die Schaltung dar, wie ein I2C-Bus angeschaltet wird
Code zum Herstellen einer WLAN-Verbindung, Auslesen der Sensordaten und Senden an einen Webserver
//Code Eckhard Gerwien - Dies Code steht zur freien Verfügung // Einbinden der erforderlichen Libraries #include <WiFi.h> #include <HTTPClient.h> #include <Wire.h> #include <SPI.h> #include <Adafruit_SHT31.h> // WLAN-Einstellungen const char* ssid = "DEIN_SSID"; const char* password = "DEIN_PASSWORT"; // Webserver-URL const char* serverName = "http://deinserver.com/empfangsscript.php"; // Erstellen eines Objekts für den SHT31 Sensor Adafruit_SHT31 sht31 = Adafruit_SHT31(); void setup() { // Initialisierung der seriellen Kommunikation für Debugging Serial.begin(115200); // Initialisierung des I2C-Bus Wire.begin(); // Initialisierung des SHT31 Sensors if (!sht31.begin(0x44)) { // 0x44 ist die I2C-Adresse des SHT31 Serial.println("Konnte SHT31 nicht finden, überprüfe die Verkabelung!"); while (1) delay(1); } Serial.println("SHT31 Sensor gefunden!"); // Verbindung zum WLAN herstellen WiFi.begin(ssid, password); Serial.print("Verbinde mit WLAN"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } //Ausgaben an die serielle Schnittstelle Serial.println(""); Serial.println("WLAN verbunden"); Serial.print("IP-Adresse: "); Serial.println(WiFi.localIP()); } //Code der regelmäßig in einer Schleife ausgeführt wird void loop() { // Auslesen der Temperatur float temperature = sht31.readTemperature(); // Auslesen der Luftfeuchtigkeit float humidity = sht31.readHumidity(); // Überprüfen, ob die Messwerte gültig sind if (!isnan(temperature)) { // isnan überprüft, ob der Wert 'NaN' (Not a Number) ist Serial.print("Temperatur: "); Serial.print(temperature); Serial.println(" °C"); } else { Serial.println("Fehler beim Auslesen der Temperatur!"); } if (!isnan(humidity)) { Serial.print("Luftfeuchtigkeit: "); Serial.print(humidity); Serial.println(" %"); } else { Serial.println("Fehler beim Auslesen der Luftfeuchtigkeit!"); } // Senden der Daten an den Webserver if (WiFi.status() == WL_CONNECTED) { HTTPClient http; http.begin(serverName); http.addHeader("Content-Type", "application/x-www-form-urlencoded"); // Übernahme der Messwerte in den String zum Senden String postData = "temperature=" + String(temperature) + "&humidity=" + String(humidity); int httpResponseCode = http.POST(postData); if (httpResponseCode > 0) { String response = http.getString(); Serial.println(httpResponseCode); Serial.println(response); } else { Serial.print("Error on sending POST: "); Serial.println(httpResponseCode); } http.end(); } else { Serial.println("WiFi nicht verbunden"); } // Wartezeit von 10 Sekunden vor der nächsten Messung delay(10000); }
In diesem Code:
- HTTPClient http; erstellt eine Instanz der HTTPClient-Klasse.
- http.begin(client, serverName); initialisiert die Verbindung zum Server mit der angegebenen URL.
- http.addHeader(„Content-Type“, „application/x-www-form-urlencoded“); fügt einen Header hinzu, der den Content-Type des Requests spezifiziert.
- http.POST(postData); sendet einen POST-Request mit den angegebenen Daten an den Server und gibt den HTTP-Response-Code zurück.
- Danach werden die Rückmeldungen vom Server ausgegeben
- http.end(); beendet den aufgebauten Client
Schritt 4: PHP-Skript auf dem Server
Erstelle ein PHP-Skript auf deinem Webserver (z.B. empfangsscript.php), das die empfangenen Daten in die Datenbank schreibt:
<?php // Logindaten für die Datenbankverbindung bereitstellen $servername = "########"; $username = "#######"; $password = "#######"; $dbname = "######"; // Verbindung zur Datenbank herstellen $conn = new mysqli($servername, $username, $password, $dbname); // Verbindung überprüfen if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } // Daten aus dem POST-Request auslesen $temperature = $_POST['temperature']; $humidity = $_POST['humidity']; // SQL-Abfrage zum Einfügen der Daten vorbereiten $sql = $conn->prepare("INSERT INTO projekt (temperature, humidity) VALUES (?, ?)"); $sql->bind_param("ss", $temperature, $humidity); // "ss" bedeutet, dass zwei String-Werte gebunden werden // Prüfen ob die Daten in die Datenbank geschrieben wurden if ($sql->execute()) { echo "New record created successfully"; } else { echo "Error: " . $sql->error; } // Datenbankverbindung wieder schließen $sql->close(); $conn->close(); ?>
Zeile 3 – 6: Variablen für die Datenbankverbindung
Zeile 9: oben vereinbarte Variablen werden für den Connection-String benötigt
Zeile 12 – 14: Wenn die Verbindung zur Datenbank scheitert, beende das Skript
Zeile 17 – 18: Daten aus dem Post-Request übernehmen
Zeile 21 – 22: hier führe ich eine Parameterbindung oder auch prepared statements (vorbereitete Anweisungen) aus. Beide Begriffe beschreiben das Verfahren, um SQL-Inserts abzusichern. Parameterbindung wird verwendet, um die Eingabewerte vom eigentlichen SQL-Code zu trennen, was hilft, SQL-Injection-Angriffe zu verhindern.
Zeile 25 – 28: Ausgabe des Ergebnisses unserer Bemühungen
Zeile 32 – 33: Verbindungen abbauen
Die Ausgabe auf der seriellen Schnittstelle
18:46:54.818 -> Temperatur: 26.29 °C
18:46:54.818 -> Luftfeuchtigkeit: 43.49 %
18:46:54.914 -> 200
18:46:54.914 -> New record created successfully
18:47:04.947 -> Temperatur: 26.30 °C
18:47:04.978 -> Luftfeuchtigkeit: 43.46 %
18:47:05.043 -> 200
18:47:05.043 -> New record created successfully
18:47:15.103 -> Temperatur: 26.27 °C
18:47:15.103 -> Luftfeuchtigkeit: 43.38 %
18:47:17.771 -> 200
18:47:17.771 -> New record created successfully
18:47:27.830 -> Temperatur: 26.29 °C
18:47:27.830 -> Luftfeuchtigkeit: 43.51 %
18:47:27.894 -> 200
Die Datensätze sind anstandslos in die Datenbank übernommen worden. Statt date könnte in der Spalte richtiger Timestamp stehen. Aber das ist so ok.
Ich würde sagen – Ziel erreicht!
In diesem DIYTechAdventure hast du zusätzlich gelernt, wie du mit einer NodeMCU über WLAN einen HTTP-Request senden und die Sensordaten in eine Datenbank auf einem Webserver mit SQL-Parameterbindung speichern kannst.
In weiteren Beiträgen zeige ich dir auch, wie du vorgehst, wenn du keinen Webserver hast.
Und wenn sich Fragen oder Anregungen ergeben haben, schreibe gerne einen Kommentar.
Viel Erfolg bei deinen Projekten und happy coding!