Daten vom Arduino per php-Script in mySQL-Datenbank - nicht wie gewünscht

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

Hallo Gerd,

ich fang mal hinten an:
Lass die DB einfach bei jeden Eintrag einen Timestamp selber anlegen. Du musst nur ein Datenbankfeld als Timestamp zusätzlich einfügen.

Ein INSERT macht immer einen Datensatz. Du musst dir alle Werte zB in einem Array speichern und dann alle auf einmal mit INSERT einfügen.

Gruß
Reinhard

Danke Reinhard.

Timestamp: OK

Das Array ist dann eindimensional? Hast Du dafür ein Beispiel? Ich habe Feld-/Spaltennamen und Werte.

Frage am Rande: Ist es möglich einen einzelnen Wert zu schreiben, bei gegebener Zeit und Spalte?

Groß Gerd