Daten an MySQL Datenbank senden

Hallo ich würde gerne Daten einer Lichtschranke (LDR Sensor) an eine MySQL Datenbank übertragen. Ich verwende einen Arduino Uno + Ethernetshield2. Das funktioniert auch schon mit einem festen Wert allerdings als Temperaturwert weil ich mir damit die Verbindung zwischen Arduino und Datenbank aufgebaut habe und nun meine Lichtschranke übertragen möchte.
Hier der Code:

/*
 * Created by ArduinoGetStarted.com
 *
 * This example code is in the public domain
 *
 * Tutorial page: https://arduinogetstarted.com/tutorials/arduino-mysql
 */

#include <SPI.h>
#include <Ethernet.h>
int Lichtschranke = 0;

// replace the MAC address below by the MAC address printed on a sticker on the Arduino Shield 2
byte mac[] = { 0xA8, 0x61, 0x0A, 0xAE, 0xBB, 0x80 };

EthernetClient client;

int HTTP_PORT = 80;
String HTTP_METHOD = "GET";
char HOST_NAME[] = "10.0.0.51";  // change to your PC's IP address
String PATH_NAME = "/insert_temp.php";
String queryString = "?temperature=29.4";

void setup() {
  pinMode(7, OUTPUT);  //blaue LED
#define blau 7
  Serial.begin(9600);

  // initialize the Ethernet shield using DHCP:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to obtaining an IP address using DHCP");
    while (true)
      ;
  }

  // BEGIN Lichtschranke
  int widerstand = analogRead(Lichtschranke);
  //  Serial.print("Widerstand:");
  Serial.println(widerstand);
  if (widerstand > 200) {  //Wert um die Lichtverhältnisse auf den LDR zu korrigieren
    digitalWrite(blau, HIGH);
  } else {
    digitalWrite(blau, LOW);
  }
  // Ausgabe im Monitor
  //  Serial.print("Widerstand:");
  Serial.println(widerstand);
  if (widerstand > 200) {
    Serial.println("0");
  } else {
    Serial.println("1");
  }
   // END Lichtschranke
  // connect to web server on port 80:
  if (client.connect(HOST_NAME, HTTP_PORT)) {
    // if connected:
    Serial.println("Connected to server");
    // make a HTTP request:
    // send HTTP header
    //  client.println(HTTP_METHOD + " " + PATH_NAME + queryString + " HTTP/1.1");
    client.println(HTTP_METHOD + " " + PATH_NAME + queryString + " HTTP/1.1");
    client.println("Host: " + String(HOST_NAME));
    client.println("Connection: close");
    client.println();  // end HTTP header

    while (client.connected()) {
      if (client.available()) {
        // read an incoming byte from the server and print it to serial monitor:
        char c = client.read();
        Serial.print(c);
      }
    }

    // the server's disconnected, stop the client:
    client.stop();
    Serial.println();
    Serial.println("disconnected");
  } else {  // if not connected:
    Serial.println("connection failed");
  }
}

void loop() {
}

Bei  "// Begin Lichtschranke" möchte ich die Werte 0 und 1 mit einem Zeitstempel (Noch nicht im Sketch vorhanden) an die Datenbank  übertragen. 

Kann mir jemand hier weiterhelfen ? 
Gruß Uwe

Hast du ein passendes PHP Script?

ergänze deinen queryString um das Ergebnis aus der Lichtschrankenauswertung.
mach eine Variable String queryLicht

also dort wo du schon an die Serial 0 oder 1 schickst in etwa so etwas

queryLicht = "&lichtschranke=0";

und übertrage auch den dynamischen Wert

```
client.println(HTTP_METHOD + " " + PATH_NAME + queryString + queryLicht + " HTTP/1.1");
```

Du könntest den zeitstempel auch in deinem php skript ergänzen. Das ist ja bestimmt ein Rechner der über NTP seine Uhrzeit aktuell hält. Sonst müsstest du dich noch mit RTC und DS3231 o.ä. auseinander setzen was zusätzliche Hardware bedeutet. Oder dir über NTP am arduino die Uhrzeit aus dem Netzwerk holen / ab und zu synchronisieren :upside_down_face:

Warum via PHP?
Warum nicht direkt aus dem Programm mit
MySQL-Connector

weil der Weg über PHP schon funktioniert und es jetzt nur darum geht ein weiteres Identifier/Wert Pärchen zu ergänzen.

Hi bin noch Anfänger ein MySQL Connector ist mir Neu muss ich mal googeln.
Danke

Genau das ist der Punkt, aber ich möchte in der Endvariante nnur Daten schreiben wenn an der Lichtschranke kein Signal ansteht.

OK versuche ich

Der Connector ist gut gepflegt, birgt aber 2 Dinge.
a) Du musst einen Port auf dem MySQL-Server aufmachen, der von "aussen" erreichbar ist. (Also zumindest aus dem lokalen Netz)
b) Du hast damit Direktzugriff auf die Datenbank.
Letzteres vereinfacht die Zugriffe, aber birgt auch die Gefahr, das da Daten verändert werden, obwohl das nicht gewollt ist.

Wenn es nur um das eintragen geht, würde ich die .php-Variante vorziehen und das Script so anpassen, dass es möglich ist anhand der übergebenen Parameter zu uentscheiden, was damit passiert..

Zu a)
Den Port braucht man sowieso, z.b. wenn man mit einem anderen DB-Client (z.B. das hervorragende HeidiSQL) drauf zugreift.
Und "von außen erreichbar" ist es nur, wenn deine Haus-Infrastruktur eben "von außen" erreichbar ist. D.h. , wenn dein zentraler Internet-Zugang (Kabel-Router, DSL-Router, was-weiß-ich) nicht sorgfältig zugemauert ist, hast du eh ein Problem, das sich nicht nur auf die Datenbank beschränkt.

Zu b)
Den Zugriff auf die DB hast du über die PHP Scripts auch. Und da können genau so gut Fehler stecken, die dann Daten ungewollt verändern. Der Ort der möglichen Fehlerquelle verlagert sich nur. SQL-Aufrufe können große Wirkung haben (besonders wenn das where-Statement vergessen wird .... daran erinnert man sich immer wieder gerne).

Aber man sollte auch bedenken, was durch die direkte Lösung (SQL-Insert/Update/Delete direkt aus Programm) alles an Folgestufen wegfällt, die nicht (mehr) benötigt werden.

zu a) - wer einen webServer + php auf einer kiste mit mysql zu laufen hat, braucht kein heidisql.
Es ist nicht notwendig port 3306 für irgendwas aufzumachen, ausser für localhost.
(Von) aussen != localhost

zu b)
Es geht nicht um das script. Wer Zugriff hat, kann ändern.
Wer natürlich seine Zugangsdaten in das gleiche php-sript schreibt, wie seine Funktionen, dem ist sowieso nicht zu helfen.

Was fällt denn an Folgestufen weg und was wird nicht benötigt?

Die Zugriffsrechte auf die DB sollten genau an die Aufgaben angepasst sein.
Die Eintragung der Werte in die DB sollten über einen User erfolgen, der nur Insert-Rechte besitzt. Damit kann der nichts ändern.
Deshalb ist die Aussage von @my_xy_projekt falsch, dass jeder, der Zugriff hat auch ändern könne. Die Rechte der User können sehr granular eingestellt werden.

Gruß Tommy

Hallo ich bin noch in der Entwicklungsphase und habe es über eine PHP Datei gelöst, leider sind die MYSQL Datenbank Zugangsdaten noch in dieser Datei, werde ich aber später noch auslagern. Der Arduino Sketch muss ich noch sortieren und von LDR in einen Echo umschreiben, dann das PHP Script auch noch etwas übersichtlicher gestalten.

Die Zugriffsrechte sind aktuell auf der Entwicklerdatenbank für alles berechtigt, das würde ich wenn alles läuft einschränken damit nur der Arduino schreiben darf, sonst nichts.

Hi ich würde nn gerne noch die Farbpunkte in die Tabelle nehmen leider hat es bisher nicht geklappt:

$dbconnect=mysqli_connect($hostname,$username,$password,$db);

if ($dbconnect->connect_error) {
  die("Database connection failed: " . $dbconnect->connect_error);
}

?>

<table border="1" align="center">
<tr>
  <td>ID Nummer</td>
  <td>Status</td>
  <td>Time</td>
  <td>Farbpunkte</td>
</tr>

<?php

$query = mysqli_query($dbconnect, "SELECT * FROM tbl_temp order by CAST(temp_id AS UNSIGNED) desc LIMIT 5")
   or die (mysqli_error($dbconnect));

while ($row = mysqli_fetch_array($query)) {
  echo
   "<tr>
    <td>{$row['temp_id']}</td>
    <td>{$row['temp_licht']}</td>
    <td>{$row['temp_time']}</td>
   </tr>;\n";
 **/* beginn Farbpunkte */**  
    if($row['temp_licht'] == "1")
    {
    echo '<img src= "img\gruen.jpg">';
    }
  else
    {
    echo '<img src= "img\rot.jpg">';
    } 
    }
?>

</table>
</body>
</html>

Wo ist das Problem? Das Feld farbe Typ int in die DB. 1==grün, alles Andere == rot (zumindest nach Deinem Code). Evtl. besser in die Tabelle mit einbauen.

Gruß Tommy

in deiner Überschrift hast 4 Spalten

  <td>ID Nummer</td>
  <td>Status</td>
  <td>Time</td>
  <td>Farbpunkte</td>

die Inhalte schreibst nur mehr mit 3 Spalten. Ist das Absicht?
Wie heißt das DB Feld in dem deine "Farbpunkte" stehen? ist das temp_licht?

ich würde die 4. Spalte nutzen:

    echo "<tr>
    <td>{$row['temp_id']}</td>
    <td>{$row['temp_licht']}</td>
    <td>{$row['temp_time']}</td>";


    if($row['temp_licht'] == "1")
    {
    echo '<td><img src= "img\gruen.jpg"></td>';
    }
  else
    {
    echo '<td><img src= "img\rot.jpg"></td>';
    } 
   echo " </tr>";

hässlicher Code ist es trotzdem.

HI mein Problem das ich es nicht schaffe die 2 Grafiken in die Tabelle zu integrieren, wie ist Dein Vorschlag ?

HI die 4.Spalte sollen meine Farbpunkte (2 Grafiken) sein, diese ich aus der Variable temp_licht mit der IF Abfrage ermittel und die Fabpunkte in die Tabelle Spalte 4 integrieren möchte.

Das wurde Dir doch in #17 gezeigt.

Gruß Tommy