Wemos D1 Mini Sketch an mySQL Server bringen

Hallo und Guten Abend,

ich probiere jetzt schon knapp 2 Stunden dran herum, kriege es aber einfach nicht kompiliert.
Ich habe einen Sketch (s.u.) welcher von einem Windmesser der am Wemos D1 mini angeschlossen ist Werte erhält. Diese Werte möchte ich “einfach” in meine vorhandenen mySQL Datenbank Schreiben, um diese dann später visualisieren zu können. Es müssen die Variablen “sb” und “sc” übergeben werden.

Nur kriege ich keinen SQL-Connect hin.

Kann mir jemand helfen?
Anbei mein Sketch, welcher eine WLAN-Verbindung aufbaut und mir die Werte im Seriellen Monitor auch fein anzeigt.

Danke!

#include <ESP8266WiFi.h>

const char* ssid     = "SSID-des-WLANS"; // Anpassen!
const char* password = "ganzGeheimesPasswort";  // Anpassen!

WiFiServer server(80);
ADC_MODE(ADC_VCC);

const byte DATAPIN=D2;
volatile boolean TX20IncomingData = false;

unsigned char chk;
unsigned char sa,sb,sd,se;
unsigned int sc,sf,pin;
String tx20RawDataS = "";

void isTX20Rising() {
if (!TX20IncomingData) {
TX20IncomingData = true;
}
}

void setup() 
{
  pinMode(DATAPIN, INPUT);
  attachInterrupt(digitalPinToInterrupt(DATAPIN), isTX20Rising, RISING);
  Serial.begin(115200);
  delay(10);

  // We start by connecting to a WiFi network

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) 
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");  
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}
//Windsensor Setup

boolean readTX20() {
    int bitcount=0;
    
    sa=sb=sd=se=0;
    sc=0;sf=0;
    tx20RawDataS = "";

    for (bitcount=41; bitcount>0; bitcount--) {
      pin = (digitalRead(DATAPIN));
      if (!pin) {
        tx20RawDataS += "1";      
      } else {
        tx20RawDataS += "0";      
      }
      if ((bitcount==41-4) || (bitcount==41-8) || (bitcount==41-20)  || (bitcount==41-24)  || (bitcount==41-28)) {
        tx20RawDataS += " ";
      }      
      if (bitcount > 41-5){
        // start, inverted
        sa = (sa<<1)|(pin^1);
      } else
      if (bitcount > 41-5-4){
        // wind dir, inverted
        sb = sb>>1 | ((pin^1)<<3);
      } else
      if (bitcount > 41-5-4-12){
        // windspeed, inverted
        sc = sc>>1 | ((pin^1)<<11);
      } else
      if (bitcount > 41-5-4-12-4){
        // checksum, inverted
        sd = sd>>1 | ((pin^1)<<3);
      } else 
      if (bitcount > 41-5-4-12-4-4){
        // wind dir
        se = se>>1 | (pin<<3);
      } else {
        // windspeed
        sf = sf>>1 | (pin<<11);
      } 
          
      delayMicroseconds(1220);    
    }
    chk= ( sb + (sc&0xf) + ((sc>>4)&0xf) + ((sc>>8)&0xf) );chk&=0xf;
    delayMicroseconds(2000);  // just in case
    TX20IncomingData = false;  

    if (sa==4 && sb==se && sc==sf && sd==chk){      
      return true;
    } else {
      return false;      
    }
}

void loop() {
  if (TX20IncomingData)
  {
    char a[90];
    boolean validData = readTX20();
    Serial.println(tx20RawDataS);
    sprintf(a, "ID: %d\t%d\n", sa, B00100);
    Serial.write (a);
    sprintf(a, "Windrichtung: %d\t%d\n", sb, se);
    Serial.write (a);
    sprintf(a, "Windgeschwindigkeit: %d\t%d\n", sc, sf);
    Serial.write (a);
    sprintf(a, "Checksum: %d\t%d\n", sd, chk);
    Serial.write (a);
    if (validData){      
      Serial.println(" :) OK :) OK :) OK :) OK");
    } else {
      Serial.println(" !!! ERROR !!! ERROR !!!");
    }
    Serial.println("");
  }
 }

Naja, 2 Stunden ist ja nicht viel. Die in die Suche investiert, hätte mehr gebracht.

Das Thema hatten wir hier schon. Im Beitrag #6 ist ein Beispiel dazu.

Der direkte Zugriff ist nur möglich, wenn die MySQL-Datenbank bei Dir lokal liegt oder Dein Provider den Fremdzugriff erlaubt, was nur wenige tun.

Gruß Tommy

Hallo,
Danek erstmal für die Antwort.
Anhand des von dir verlinkten Artikels habe ich mich ja die 2 Stunden dran gesetzt :wink:

Habe es aber trotzdem nicht hinbekommen.

Und ja, die MySQL-Datenbank liegt bei mir im lokalen Netz. Ich Schreibe da ja schon andere Werte rein.

Ich probiere es nochmal, aber gestern habe ich beim kompilieren lauter Fehler erhalten.
Gestern dachte ich: haust mal alles wieder raus, anstelle auf die Fehler einzugehen fragst mal lieber nach einer "kompletten Lösung"...

Die wirst Du nicht bekommen, da wir Dein Scenario nicht kennen.

Folgende bekannte Fehlerquellen:

  1. Die DB-Tabelle ist nur auf localhost eingestellt und nicht auf * bei Host. Du solltest dann aber einen speziellen Account nutzen, der nur das darf, was der Arduino macht - schreiben.
  2. Die SQL-Statements sind reine Zeichenketten. Lass Dir diese mal nach Serial ausgeben und gib sie in einem SQL-Programm ein. Da siehst Du die Fehlermeldungen, häufig ' (Hochkommas) um Zeichenketten im SQL-String vergessen.
    Ich kann dazu HeidiSQL empfehlen.

Die sind aber erst interessant, wenn der Sketch kompiliert.

Gruß Tommy

Das es immer gleich SQL direkt sein muss…

Was spricht denn gegen ein simples PHP Parse script das es erledigt, so bleibt es dann einfach nur text der vom PHP Script sicher in die DB eingefügt wird.

Im Php Script kann dann auch zum Beispiel eingies Vorverarbeitet werden.

Zum Beispiel spricht dagegen, dass damit der “single point of failure” auf 2 Teile erweitert wird.
Du musst 2 Teile warten, wenn Du was änderst. Bei der direkten Übertragung musst Du (neben der DB) nur 1 Teil ändern.
Der Direktzugriff läuft bei mir seit fast einem Jahr rund um die Uhr problemlos in eine DB bei meinem Provider.
PHP nutze ich für die Grafische Auswertung über jpGraph.

Gruß Tommy

Im Php Script kann dann auch zum Beispiel eingies Vorverarbeitet werden.

sehe ich ähnlich. lieber den esp/wemos einen "einfachen" webrequest an php stellen lassen und dann in php ein update auf die DB was auch immer das dahinter ist. ändert sich die datenbank, ändert man das php. es bleibt eine Änderung - die Frage ist nur - in welcher Schicht.

Das ist halt Ansichtssache. Beim Direktzugriff muss man keinen Webserver mit PHP-Unterstützung unnütz nebenher betreiben, wenn man den sonst nicht braucht.
Aber das kann jeder für sich selbst entscheiden, wie er es gestalten möchte.
Ich bevorzuge den Direktzugriff aud die DB und der funktioniert problemlos.

Gruß Tommy

Hallo, danke für die Antworten!

ich dachte mir auch das es einfacher/leichter ist nur eine Ebene zu haben: ESP -> MySQL

in den Beispielen die ich mir zu meinem vorhaben angeschaut hatte war auch die Variante ESP -> PHP -> MySQL die genannte. Aber ich dachte mir: das muss doch einfacher/leichter gehen.

Von meinen Sketch kommen 2 Variablen
sb ist eine Zahl zwischen 0 und 55,1 und
sc ist eine Zahl zwischen 1 und 15

Mehr kommt da nicht drüber...

ABER, ich habe jetzt die letzen 2h dran gesessen und es per ESP -> PHP -> MySQL gelöst!
eine Sache hat mich im nachhinein doch gestört:
Die Werte kommen als m/s rein, aber als z.B. 101 was 10,1 m/s entspricht...
Darauf eine Visualisierungen umzubauen (die ggf. mit km/s ausgelegt sind) kann ich somit relativ einfach im PHP Script umstricken und muss es nicht später in der Visualisierung machen.

Trotzdem danke an Alle!

desidia:
Die Werte kommen als m/s rein, aber als z.B. 101 was 10,1 m/s entspricht...

Das kann auch der Arduino umrechnen. Aber egal, jeder wie er mag.

Gruß Tommy

ja das stimmt,
ABER ich sitze an dem Projekt schon ein paar Tage, und ehrlich gesagt quäle ich mich mit dem Code des Arduino mehr als mit PHP.
Als ich mit diesem Projekt begann konnte ich keine der Sprachen und hatte nur Grundkenntnisse in der Programmierung und ich empfinde die PHP Sprache als "logischer".

Es ist natürlich immer Anwendungsabhängig, PHP ist halt "dafür geboren" (natürlich nicht, aber ist halt besser/einfacher Dokumentiert) in eine Datenbank zu Schreiben als Arduino.

aber Tommy - vielen Dank! für deine Hilfe! ich habe dir einen Karma-Punkt geschenkt :wink:

PHP erlaubt es einfacher, als C schmutzigen Code zu schreiben.
Zeige mal Deinen PHP-Code. Da wird demnächst einiges raus fallen an schlechter MySQL-Programmierung.

Gruß Tommy

Hallo Tommy,

hier das PHP Script.

<?php
date_default_timezone_set("Europe/Berlin");
$timestamp = time();
$Zeit = date("Y-m-d H:i:s",$timestamp);
$windgeschwindigkeit = $_GET['windgeschwindigkeit'] ;
$windrichtung = $_GET['windrichtung'] ;
$ms = $windgeschwindigkeit/10;
$kmh = $windgeschwindigkeit*0.36;

if ( $windrichtung == "0" ) {$namewindrichtung = 'N';}
if ( $windrichtung == "1" ) {$namewindrichtung = 'NNO';}
if ( $windrichtung == "2" ) {$namewindrichtung = 'NO'; }
if ( $windrichtung == "3" ) {$namewindrichtung = 'ONO';}
if ( $windrichtung == "4" ) {$namewindrichtung = 'O';}   
if ( $windrichtung == "5" ) {$namewindrichtung = 'OSO';}
if ( $windrichtung == "6" ) {$namewindrichtung = 'SO';}
if ( $windrichtung == "7" ) {$namewindrichtung = 'SSO';}
if ( $windrichtung == "8" ) {$namewindrichtung = 'S';}
if ( $windrichtung == "9" ) {$namewindrichtung = 'SSW';}
if ( $windrichtung == "10" ) {$namewindrichtung = 'SW';}
if ( $windrichtung == "11" ) {$namewindrichtung = 'WSW';}
if ( $windrichtung == "12" ) {$namewindrichtung = 'W';}
if ( $windrichtung == "13" ) {$namewindrichtung = 'WNW';}
if ( $windrichtung == "14" ) {$namewindrichtung = 'NW';}
if ( $windrichtung == "15" ) {$namewindrichtung = 'NNW';}   


$db = mysqli_connect("localhost", "NAME", "PASSWORT", "DATENBANK");
if(!$db)
{
  exit("Verbindungsfehler: ".mysqli_connect_error());
}

mysqli_query($db, "INSERT INTO windsensor (Zeit, windgeschwindigkeit, ms, kmh, windrichtung, namewindrichtung ) VALUES ('$Zeit','$windgeschwindigkeit','$ms','$kmh','$windrichtung','$namewindrichtung')");
?>

ich habe es über Nacht laufen lassen, bisher läuft es, ich sah aber es gab einmal einen “Fehlerwert” mit 4095. das muss ich im Script noch Filtern das solche Fehlerwerte nicht in die Datenbank geschrieben werden

Gut, Du verwendest MySQLi, das fällt mit PHP 7 nicht weg.
Schlecht, Du verwendest keine prepared Statements und bist damit anfällig für SQL-Injection.

Schau Dir hier mal die Grundlagen für prepared Statements mit MySQLi an.

Gruß Tommy