Super simpler ESP32 nach MySQL Datenlogger

Wer sich mit dem ESP32 beschäftigt, damit Sensoren abfragen möchte und zusätzlich etwas von Datenbanken versteht, der wird über kurz oder lang den Wunsch verspüren, die Sensordaten direkt in einer Datenbank zu speichern. Denn die damit verbundenen Möglichkeiten sind enorm!

Klar kann ich nur mit dem ESP32, einem Temperatursensor und einem Relais bewaffnet, eine Heizung temperaturgesteuert regeln. Aber was wäre, wenn ich für eine größere Steuerung einige zig Sensoren an unterschiedlichen Orten einsetzen möchte? Schon beim Thema Hausautomation stellt sich die Frage, ob man das nicht irgendwie systematischer angehen sollte?

Einige Vorteile:

Günstige Sensoren

Wenn wir annehmen, das ein ESP32 Board ca. 5,- Euro kostet und dann noch ein USB-Netzteil für ebenfalls 5,- Euro dazu kommt, kostet ein Sensor mit eingebautem Datenbankzugriff ungefähr 10,- Euro!

Vereinfachung und Standardisierung des Codes

Der Code für den ESP32 kann standardisiert werden. Es geht nur noch darum, irgendwie einen Wert von einem angelöteten Sensor zu bekommen und ihn zur Datenbank zu senden. Fertig! Ich werde Euch unten zeigen, mit wie wenig Code das möglich ist.

Alles auf einen Blick

Ihr habt eine zentrale Sammelstelle für Hunderte von Sensoren! Und die sind mit einem einzigen SQL-Select abgefragt! Wer sich mit Datenbanken etwas auskennt oder SQL kann, für den ist dies eine wahre Offenbarung!

Keine Middleware wie PHP notwendig

Bei randomnerdtutorials gibt es einen Beitrag, der zeigt, wie man die von mir genannten Ziele mit Hilfe einer Middleware wie PHP erreichen kann. Das ist viel zu viel Aufwand! Wenn der ESP32 selbst auf die Datenbank zugreifen kann, benötigt man keinen Webserver mit integrierter PHP-Unterstützung und muss auch keinen Extra PHP Code schreiben!

Stark vereinfachte Anwendungsentwicklung

Da die Daten jetzt in einer verbreiteten Datenbank vorliegen, kann man die zugehörige Anwendung in jeder Programmiersprache entwickeln, die einen Zugriff auf die Datenbank erlaubt. Egal ob Desktop- oder Webanwendung, alles ist möglich.

Super-simpler-Datenlogger

Das Beispiel, das ich Euch jetzt zeige, dient nur der Demonstration, wie einfach es tatsächlich sein kann. Die meisten von Euch werden wahrscheinlich eine aufwendigere Lösung entwickeln. Was auch sehr sinnvoll ist, denn ich lass jetzt einmal sämtliche ‘Korrektheit’ beiseite und gehe die Sache extrem minimalistisch an. Es geht nur darum, Eure Augen für einen neuen Weg zu öffnen.

Der Client kann natürlich um viele Fähigkeiten ergänzt werden. Wie zum Beispiel Webkonfiguration, ‘Deep Sleep’, Uhrzeitermittlung über WiFi, Ausgabe auf ein OLED-Display und vieles mehr.

Datenbank

Auch die Datenbank besteht erst einmal nur aus einer einzigen Tabelle. Hier sollten später mindestens noch ein, zwei weitere Tabellen dazu kommen. Eine zum Beispiel für Sensortypen und eine für die eingesetzten Sensoren selbst. So dass man beim Einfügen der Werte die ID des Sensors angeben kann.

Damit das Ganze funktioniert, müsst Ihr einen MySQL-Datenbankserver aufgesetzt haben. Meiner läuft auf einem Raspberry Pi, der sowieso das ganze Jahr rund um die Uhr online ist. Dort verwendet Ihr ein eventuell schon existierende Datenbankschema, oder Ihr legt Euch ein neues Schema an:

CREATE DATABASE `test`;

Jetzt benötigt Ihr noch einen User ‘testuser’, dem es erlaubt wird, mit dieser Datenbank zu arbeiten:

CREATE USER testuser@'%' IDENTIFIED BY 'password';

GRANT ALL ON test.* TO testuser@'%';

Mit diesem User muss sich der ESP32 bei der Datenbank anmelden, damit die SQL-Inserts auch angenommen werden. Und zum Schluss noch die Tabelle, die die einzelnen Datensätze aufnehmen wird:

CREATE TABLE `test`.`sensordata` (
  `ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `TimeStamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `Temperature` float NOT NULL,
  `Humidity` float NOT NULL,
  PRIMARY KEY (`ID`)
);

Und hier das SQL-Insert um neue Sensorwerte in die Tabelle einzufügen:

INSERT INTO sensordata (TimeStamp, Temperature, Humidity) VALUES ('2020-1-22 12:42:03', 12.5, 33.4);

Mit folgender Anweisung könnt Ihr Euch die bisher gesammelten Einträge anzeigen lassen:

SELECT * FROM sensordata t ORDER BY TimeStamp DESC;

Arduino-Code

#include <WiFi.h>
#include <SimpleDHT.h>
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>

const char* SSID = "SSID";
const char* PASS = "Password";

int pinDHT22 = 17;
SimpleDHT22 dht22(pinDHT22);
WiFiClient client;
MySQL_Connection conn(&client);
MySQL_Cursor* cursor;

IPAddress server_addr(192, 168, 178, 20);
char user[] = "testuser"; 
char password[] = "password";

float temperature = 0;
float humidity = 0;

void setup() {
}

void loop() {
  WiFi.begin(SSID, PASS);
  delay (1000);
  dht22.read2(&temperature, &humidity, NULL);
  conn.connect(server_addr, 3306, user, password);
  delay (1000);
  cursor = new MySQL_Cursor(&conn);
  char statementChar[256];
  String statementStr = "INSERT INTO test.sensordata (Temperature, Humidity) VALUES  (" + String (temperature) + ", " + String (humidity) + ");";
  statementStr.toCharArray (statementChar, statementStr.length());
  cursor->execute(statementChar);
  conn.close();
  WiFi.disconnect();
  delay(5000);
}

Für das gezeigte Beispiel habe ich folgenden Sensor verwendet:

Den gezeigten Code habe ich kompiliert und auf dieses Board von Banggood hochgeladen. Um den Code zu kompilieren benötigt man zwei Bibliotheken:

Für die Abfrage des DHT22:

https://github.com/winlinvip/SimpleDHT

Für den Zugriff auf MySQL:

https://github.com/ChuckBell/MySQL_Connector_Arduino

Die könnt Ihr vermutlich am schnellsten über die in der Arduino IDE vorhandene Funktion

‘Sketch/Bibliotken einbinden->Bibliotheken verwalten…’

integrieren.

Achtet auf die richtige MySQL-Server IP! Wenn es nicht gleich funktioniert, so kontrolliert noch einmal alles und baut Euch mit ‘Serial.println’ Testausgaben ein, mit denen Ihr überprüfen könnt, wie weit das Programm kommt! Was man nicht so leicht sieht, sind eventuell Rechteprobleme von MySQL oder eine aktive Firewall! Also gewissenhaft den MySQL User einrichten und vielleicht erst einmal über den MySQL Query Browser testen!

MySQL Query Browser

Ich lasse die Datenbank auf einem Raspberry Pi mit der Version 5.5.43 von MySQL laufen. Kann also sein, dass es mit neueren Versionen Probleme gibt. Wenn Ihr MariaDB verwendet, so muss der Port vermutlich 3307 sein!

Der größte Nachteil sind die fest konfigurierten Einstellungen wie die SSID, der MySQL-User, die Passwörter dazu und die IP des Datenbankservers. Das sollte man später durch eine integrierte Webseite ergänzen, die es erlaubt die Einstellungen über einen Browser vorzunehmen. Zugegebenermaßen wird das dann wesentlich mehr Code. 🙂

Aber, hey, es funktioniert! Ich habe noch ein bisschen Code für Deep Sleep dazu gebaut, in das Board einen 18650er Akku gesteckt und das Board in einer Plastikflasche auf den Balkon gestellt. Dort sendet es mir schon seit ein paar Tagen Temperatur und Luftfeuchtigkeit in meine kleine Datenbank.

 

Kommentar hinterlassen

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