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
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
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.
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.
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.
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.