Hallo,
mal wieder komme ich nicht weiter und hoffe, auf Hilfe.
Arduino Mega sendet Daten mittels Ethernet-Shield über php-Script an eine mySQL-Datenbank auf meinem eigenen Rechner.
Folgendes funktioniert:
// Daten in Wolke
//
// Abschrift aus "t4a_temperature_drone_push"
//
if (!client.connect(server_wolke, 80)) {
Serial.println("-> Connection failure detected"); // only use serial when debugging
}
else client.stop();
if (client.connect(server_wolke, 80)) { // if you get a connection, report back via serial
Serial.println("-> Connected"); // only use serial when debugging
client.print( "GET /add_data.php?"); // Make a HTTP request:
TemperaturesToGetVariables(); // send serial and temperature readings
client.println( " HTTP/1.1");
client.println( "Host: 192.168.0.23" );
client.print(" Host: ");
client.println(server_wolke);
client.println( "Connection: close" );
Serial.println( "Connection: close" );
client.println();
client.println();
client.stop();
} // Ende if client.connect
else {
// you didn't get a connection to the server:
Serial.println("--> connection failed !!"); // only use serial when debugging
} // Ende else client.connect
Ethernet.maintain();
} // Ende if ZeitTemperaturMessen
// Ethernet-Server
uloop();
}// Ende Loop-Funktion
//====================================================================================================
void TemperaturesToGetVariables(void) {
byte i;
byte j;
float tempC;
oneWire1.reset_search();
for (i = 0; i < AnzahlSensoren; i++) { // Schleife über Sensor-Array
if (i > 0) client.print("&"); // add ampersand if not first sensor
//->client
client.print("serial"); // print: sensorx=
client.print(i);
client.print("=");
//Serial number
Serial.print(" Sensor : ");
Serial.println(i);
Serial.print(" Serial-ID : ");
Serial.print(sensorList[i].bez);
client.print(sensorList[i].bez);
Serial.print("T");
client.print("T");
Serial.println(); // only use serial when debugging
client.print("&temperature"); // print: &temperaturex=
client.print(i);
client.print("=");
tempC = sensors[sensorList[i].busnr].getTempC(sensorList[i].address);
if (tempC == -127.00) sensorList[i].falsch = 'L';
else if (tempC == 85.00) sensorList[i].falsch = 'H';
else {
sensorList[i].isttemp = tempC;
sensorList[i].falsch = ':';
}
client.print(tempC);
Serial.print(" Temperatur : ");
Serial.print(tempC);
Serial.println(" C");
} // Ende for AnzahlSensoren
return;
} // Ende Funktion TemperaturesToGetVariables
Erklärung:
Der Anfang ist das Ende von Loop.
Es werden Temperaturen mittels One-Wire gemessen und in einem Array "sensorList" neben der busNr, der Sensor-Adresse und mehrerer weiterer Daten gespeichert.
Das php-Script sieht so aus:
<?php
// Connect to MySQL
include("dbconnect.php");
$counter=0;
while ( isset( $_GET["serial".$counter] ) )
{
// Prepare the SQL statement
$SQL = "INSERT INTO test.temperature (sensor ,celsius) VALUES ('".$_GET["serial".$counter]."', '".$_GET["temperature".$counter]."')";
// Execute SQL statement
mysql_query($SQL);
// Increase counter
$counter++;
}
// Go to the review_data.php (optional)
header("Location: review_data.php");
?>
In dbconnect.php stehen die Anmeldedaten mySQL.
Sceenshots der Datenbank sind als Anhang beigefügt. Sie ließen sich hier nicht einfügen.
OK. So weit so gut. Dies funktioniert.
Aber,
Ich möchte nicht für jeden Sensor eine neue Zeile, sondern alle Sensoren in einer Zeile. Die Spalte heißen wie die Sensoren, z.B. OLT, OMT, ORT. Dieses Kürzel, aus zwei bis vier Buchstaben steht im Array im Arduino. Aber wie muss dann der php-Script aussehen in der Zeile "INSERT INTO test.temperature". Ich habe keine Ahnung.
Anmerkung: In der Realität geht es nicht nur um drei Sensoren, sondern um ca. 40.
Ein Zweites.
In obigem Beispiel wird für jede Zeile eine ID als Primärschlüssel erstellt. Muss das sein?
Ich hätte lieber die Zeit aus Datum und Uhrzeit als Schlüssel. Oder "mach man das nicht?"
Auch diese Zeit habe ich im Arduino als aktuelle UNIX-Zeit. Aber ich bekomme sie nicht in die Datenbank, so dass sie als Datum und Uhrzeit lesbar ist. Ich kann sie nur als INT übertragen und habe dann die reine Sekundenzahl. Sowie ich TIMESTAMP oder DATETIME in der Datenbank als Typ wähle, wird meine Zahl nicht angenommen. Gibt's dafür auch eine Lösung?
Ich hoffe sehr.
Gruß Gerd