Arduino Wifi SQL hilfe

Grüße,

ich habe für mein Projekt für das auch der BMP und die RTC gedacht sind die Überlegung gehab, das ganze über eine SD Karte zu speichern und dann mit Excel Auszuwerten.

Nun kam jemand mit der blendenden Idee das man das ganze ja auch via Wifi und einer SQL Datenbank machen könnte.

Von beidem habe ich wenig bis keine Ahnung.

Nun die Frage, funktioniert das so ohne weiteres?

Ich hab mir mal ein paar Wifi Module auf Basis eines ESP8266 gekauft und ein bisschen rumgespielt.

Die Idee ist es die Sensoren mit einem Arduino via Wifi die Messwerte in eine SQL Datenbank schreiben zu lassen. Und dann aus dieser Datenbank die Daten mit einem anderen Arduino auszulesen.

Funktioniert das so grundsätzlich?

Beim Aufbau gab es dann wieder Probleme, am Anfang ging es nicht, dann ging es plötzlich ohne Grund und jetzt geht wieder gar nichts.

Angeschlossen ist das ganze wie hier nur, das am RX Des Arduino ein Spannungsteiler hängt der die Spannung auf 3,3V reduziert, da ich mehrfach gelesen habe das das notwendig ist.
außerdem habe ich einen Taster an RST der beim drücken den Reset auf GND zieht.


Eigentlich brauchst Du den UNO nicht, da der ESP8266 das auch allein kann.
Du hast Dir die für einen Anfänger ungünstigsten ESP8266 herausgesucht.
Besser wäre ein LOLON/WEMOS D1 mini, da hast Du den USB-Anschluss gleich dran.
In wieweit das seriell über AT-Kommandos funktioniert, weiß ich nicht, ich benutze WEMOS D1 mini.
Dann kommt es darauf an, wo Deine Datenbank ist. Wenn Du lokal eine MySQL-DB hast, kannst Du direkt darauf zu greifen, musst allerdings den ESP8266 direkt programmieren (Deine mit Programmieradapter).
Wenn die DB bei einem Provider im Netz liegt, solltest Du eine HTTPS-Verbindung dorthin aufbauen und über eine PHP-Zwischenschicht (als HTTPS-Empfänger, weil die wenigsten MySQL-DB mit SSL kompiliert sind) die Daten in die DB schreiben. Da dürften Deine ESP8266 aber zu schmalbrüstig dazu sein.
Nochmal zur Sicherheit, alle diese Aussagen beziehen sich auf D1 mini, die bei mir seit Jahren Daten in eine DB beim Provider schreiben.

Gruß Tommy

1 Like

Sry, das habe ich noch vergessen.


Das ist der Serielle Monitor wenn ich den reset Button Drücke.

Das sieht ja grundsätzlich erstmal aus als ob das ganze richtig verdrahtet worden wäre

Danke für die info. Ich versuche die ganze Sensoreinheit so klein wie möglich zu halten, daher kam der Gedanke dieses kompakte Wlan Modul mit einem Attiny in kombination zu verwenden. Inzwischen habe ich aber auch erkannt das der Chip der da drauf ist eig. viel mehr kann und nur in seinen Anschlüssen Boardseitig limitiert ist.

Die Datenbank soll fürs erste in einem Lokalen Netzwerk stehen, wie sich das in Zukunft gestaltet ist aber fraglich da wäre es wahrscheinlich schlauer gleich auf eine HTTPS basierte variante zu gehen bevor man dann im laufenden Prozess nochmal alles umbaut.

Statt des ESp8266-01 kannst du auch den ESP8266-12E verwenden. Der hat dann etwas mehr Pins zur Verfügung. Ist auch nur minimal größer und kann genau so geflasht werden, wie der ESP8266-01. Hat aber mehr Speicher zur Verfügung.

Und falls du doch beim ESP8266-01S hängen bleibst, kann ich dir noch diesen Beitrag empfehlen.

Meinst du die Hier ?

und macht es da Sinn so ein Adapterboard mit zu kaufen oder Programmiert man das dann wieder über den Arduino ?

Oder meinst du die Hier wo schon ein USB Interface fest verbaut ist?

Als Alternative zum ESP8266-01S meinte ich schon den reinen ESP8266-12E (Link 1).
Und ich verwende zum Flashen auch den FTDI (USB zu Serial) Adapter. Allerdings kaufe ich garantiert nie bei AZ- Dingsmull. Die sind mir total unsympathisch und zu teuer, und das nicht nur mir.
Ich Kaufe bei Reichelt oder Ali.

1 Like

Danke für die schnelle Antwort.

ich habe AZ über ebay kennen gelernt und hatte noch nie Probleme.
Preislich fand ich das bislang auch besser als Reichelt. Klar mit Ali kann keiner mithalten aber da hab ich noch nie bestellt weil mir das iwi komisch vorkam.

Ich bestelle meist über ebay im Kompromiss aus Preis und Lieferzeit ih Habe für den ganzen kram nur 2 Wochen Zeit da kann ich nicht ewig auf die Module warten.

Ok, wenn es eilig ist, dann ist Ali nicht die erste Wahl.
Für mich ist Vorrat wichtig, also ist Ali ok.
Ansonsten habe damit keine Probleme. Zudem findest du auch über ebay günstige Händler in DL.

So ist bestellt.

Ich habe mich jetzt doch für das WEMOS D1 mini was Tommy vorgeschlagen hat entschieden, da ich glaube das das zum entwickeln erstmal besser geeignet ist.
So wie ich das verstanden habe funktioniert das wie beim Arduino-> ranstecken, geht.
Später kann ich das ja dann durch eine eigene Platine wo nur noch der chip drauf kommt ersetzen.

Ok, für den Anfang und um es einfach zu haben, ist das sicher die bessere Alternative. Und ja, wenn man eigene Platinen entwirft, ist der ESP8266-12E später dann gut geeignet.

Und wenn es dann noch kleiner werden soll, geht auch ein ESP32-C3. Aber das wird dann Zukunft. :wink:

Vorher die Erweiterung für den ESP8266 installieren.

Gruß Tommy

Der wurde doch auch schon für den ESP8266-01S gebraucht.

Genau die Boards sind schon zugefügt. Aber falls jemand das hier später liest ist die info nciht ganz unwichtig^^

Ja. Ich bezog mich auf die zitierte Aussage.

Gruß Tommy

Ok, alles gut.

So, die Controller sind da.

23:02:18.994 -> Hello Arduino Forum
23:02:18.994 -> I am An ESP Controller
23:02:19.975 -> Hello Arduino Forum
23:02:19.975 -> I am An ESP Controller
23:02:21.004 -> Hello Arduino Forum
23:02:21.004 -> I am An ESP Controller
23:02:21.988 -> Hello Arduino Forum
23:02:21.988 -> I am An ESP Controller
23:02:23.014 -> Hello Arduino Forum
23:02:23.014 -> I am An ESP Controller
23:02:23.984 -> Hello Arduino Forum
23:02:23.984 -> I am An ESP Controller
23:02:25.013 -> Hello Arduino Forum
23:02:25.013 -> I am An ESP Controller

Das wirkt erstmal sehr komfortabel, Arduino Style
Jetzt kanns weiter gehen^^

So dank dem Code Beispiel von @Tommy56

#include <ESP8266WiFi.h>
#include <Hash.h>
#include <MySQL.h>

// weil ich faul bin
#define sp Serial.print
#define spn Serial.println

// WLAN
// das bitte ändern
// <= 31 Zeichen
char *ssid = "MathrimsWLan";
// >= 8 oder <= 63 Zeichen oder NULL
char *password = "mathrimsPW";

// DB
char *server_addr = "999.999.999.99"; 
static char user[] = "house1"; // SQL-Nutzer
static char dbpassword[] = "1234"; // SQL Kennwort
static char db[] = "amsel";
const char ins1[] = "insert into ardu1 (tmst, intval, strval, floatval) values(now(),";
Connector my_conn;

void setup() {
boolean erg;  
  Serial.begin(74880);
  spn("\nStart");
  WiFi.begin(ssid,password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    sp(".");
  }
  if(WiFi.status()==WL_CONNECTED){sp("Connectet to: ");spn(ssid);}
  
  spn("Connecting to database . . .");
  if (my_conn.mysql_connect(server_addr, 3306, user, dbpassword)) {
    spn("Connection ok.");
    delay(500);
  }
  else
    spn("Connection failed.");

  erg = my_conn.cmd_query("use ardutest");
  spn("use ardutest");
  erg = my_conn.cmd_query("insert into ardu1 (tmst, intval, strval, floatval) values( now(),11,'Text54',5.44)");
  spn("insert");
  my_conn.disconnect();
  
}

void loop() {
  
}

bin ich zumindest soweit das der ESP sich ins WLan einwählt. Laut Frizbox auch erfolgreich.

Nun bekomm ich aber keine Verbindung zu MySQL DB.

Also er sagt auch nciht Connection Failed er stucked einfach nur

Ich habe die DB wie Folgt eingerichtet

ich habe mir in der Workbench einen Server gebastelt
Screenshot 2024-07-01 175844

Dort habe ich das schema "amsel" angelegt
und darin befinden sie die tabellen house1-3 wo schon ein paar Dummy Daten drin stehen.
Screenshot 2024-07-01 175958

danach habe ich für jeden ESP (4) ein Profil angelegt

CREATE USER 'house1'@'127.0.0.1' IDENTIFIED BY '1234';
CREATE USER 'house2'@'127.0.0.1' IDENTIFIED BY '1234';
CREATE USER 'house3'@'127.0.0.1' IDENTIFIED BY '1234';
CREATE USER 'Central_SPS'@'127.0.0.1' IDENTIFIED BY '1234';

Ich habe öfters mal gelesen das Xampp da iwi mitlaufen muss damit das geht aber ich versteh nicht so ganz was das ist.

Und muss bei

char *server_addr = "999.999.999.99"; 

eigentlich die PC adresse oder die die mir im MySQL angezeigte 127.0.0.1:3306?

Da geht noch einiges durcheinander. Usernamen (houseX) und Tabellennamen (houseX) gleich zu bezeichnen ist schon mal keine gute Idee.
127.0.0.1 ist der jeweilige Rechner und auch nur auf diesem verfügbar.

Nimm erst mal nur einen User und lass den von allen Hosts (%) zugreifen:
CREATE USER 'arduino'@'%' IDENTIFIED BY '1234';
Das brauchst Du beim connect. dessen Rückgabewert solltest Du auch auswerten.

Die DB ist natürlich auf der IP des NAS.
Dann musst Du dem User noch Grants (Rechte) auf die Tabellen zuweisen.

Die Lib hat auch ein gutes wiki

Gruß Tommy

So, ich habe einige erfolge zu vermelden, es geht aber immer noch nicht.^^

ich habe mir auf dem Rechner Virtual Box installiert und darauf ein Linux System laufen. Dort habe ich eine MySQL Datenbank eingerichtet.
Auf diese kann ich über den Wirt PC zugreifen. Daher gehe ich davon aus das die Datenbank korrekt eingerichtet ist und der Fremdzugriff über das Netzwerk funktioniert.

Allerdings ist es mir nicht möglich, mich mit dem ESP in der Datenbank anzumelden.

Die Anmeldedaten funktionieren die habe ich mit dem Windows PC probiert, da ging es.

Das ist der Code den ich benutze, den habe ich zu weiten teilen hier aus dem Forum.

#include <ESP8266WiFi.h>
#include <Hash.h>
#include <MySQL.h>

// weil ich faul bin
#define sp Serial.print
#define spn Serial.println

// WLAN
// das bitte ändern
// <= 31 Zeichen
char *ssid = "Mathrims_Netzwerk";
// >= 8 oder <= 63 Zeichen oder NULL
char *password = "Mathrims_Passwort";

// DB
char *server_addr = "192.168.178.65"; 
static char user[] = "house3"; // SQL-Nutzer
static char dbpassword[] = "house3"; // SQL Kennwort
//static char db[] = "amselNeu";
const char ins1[] = "insert into ardu1 (tmst, intval, strval, floatval) values(now(),";
Connector my_conn;

void setup() {
  WiFi.hostname(user);
boolean erg;  
  Serial.begin(74880);
  spn("\nStart");
  WiFi.begin(ssid,password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    sp(".");
  }
  if(WiFi.status()==WL_CONNECTED){sp("Connectet to: ");spn(ssid);}

  spn("Connecting to database . . .");
  if (my_conn.mysql_connect(server_addr, 3306, user, dbpassword)) {
    spn("Connection ok.");
    delay(500);
  }
  else
    sp("Connection failed.   ");spn(my_conn.mysql_connect(server_addr, 3306, user, dbpassword));

//bis hier hin komme ich der rest ist erstmal egal.

  erg = my_conn.cmd_query("use ardutest");
  spn("use ardutest");
  erg = my_conn.cmd_query("insert into ardu1 (tmst, intval, strval, floatval) values( now(),11,'Text54',5.44)");
  spn("insert");
  my_conn.disconnect();
  
}

void loop() {
  
}

und das ist das Ergebnis

10:28:43.595 -> 
10:28:43.595 ->  ets Jan  8 2013,rst cause:2, boot mode:(3,6)
10:28:43.595 -> 
10:28:43.595 -> load 0x4010f000, len 3424, room 16 
10:28:43.595 -> tail 0
10:28:43.595 -> chksum 0x2e
10:28:43.595 -> load 0x3fff20b8, len 40, room 8 
10:28:43.595 -> tail 0
10:28:43.595 -> chksum 0x2b
10:28:43.595 -> csum 0x2b
10:28:43.595 -> v000451e0
10:28:43.627 -> ~ld
10:28:43.691 -> rf cal sector: 1020
10:28:43.691 -> freq trace enable 0
10:28:43.691 -> rf[112] : 0�
//Hier gehts los
10:28:43.691 -> Start
10:28:44.304 -> ..............Connectet to: Fluffelwuff //netzwerkname
10:28:51.526 -> Connecting to database . . .
10:28:52.591 -> Connection failed.   0

Ich weis nicht was ich da falsch mache.
gibt es in der Lib einen Befehl wo man etwas über die gründe des Connectfail erfährt?
ich hatte das hier probiert

spn(my_conn.mysql_connect(server_addr, 3306, user, dbpassword));

aber da kommt als return nur 0