Zum Inhalt springen

Sensordaten an Webserver senden

    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!

    0 Kommentare
    Inline Feedbacks
    View all comments
    Schlagwörter: