envoi données capteurs vers BDD au format Json

Bonjour à tous,

Je développe actuellement une petite station météo perso.

J'aimerais envoyer les données reçues des capteurs vers une base de données, en local pour le moment, au format Json.

Pour l'instant, j'arrive à les envoyer dans la base sous localhost (wamp) avec une Uno et un shield Ethernet mais pas sous format Json.

J'ai fait pas mal de recherches mais je ne trouve rien qui corresponde à mon besoin. Je sollicite donc votre aide pour me guider...

Ci dessous le programme test arduino qui envoie les données à un programme PHP (write_Jdata.php) qui écrit ces mêmes données dans la base "anemo", table "jdata".

J'ai créé un string jData des données Json que je veux envoyer mais, comment l'envoyer ?

la table jdata contient, dans l'ordre : Id, time, temperature, humidite, pression, windSpeed, windDirection, averageSpeed

Sketch arduino :

//https://www.instructables.com/id/PART-1-Send-Arduino-data-to-the-Web-PHP-MySQL-D3js/
//Carte Uno+Shield Ethernet - Base anemo - Table: jdata
#include <Ethernet.h>
#include <SPI.h>

byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x01 }; // RESERVED MAC ADDRESS
// L'adresse IP que prendra le shield
IPAddress ip(192, 168, 1, 40);
// L'objet qui nous servira a la communication
EthernetClient client ;
// Le serveur à interroger
IPAddress server(192, 168, 1, 26);

long previousMillis = 0;
unsigned long currentMillis = 0;
long interval = 60000; // READING INTERVAL

float windSpeed = 21.5;
float windDirection = 180.0;
float averageSpeed = 20.5;
float averageDirection = 185.0;
float temperature = 18.52;
float tension = 3.3;
float pression = 950.10;
float humidite = 52.32;

void setup() {
  Serial.begin(115200);

  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
  }

  Serial.println("connecté...");
}

void loop() {

  currentMillis = millis();
  if (currentMillis - previousMillis > interval) { // READ ONLY ONCE PER INTERVAL
    previousMillis = currentMillis;
//Données pour test    
    float windSpeed = 21.5;
    float windDirection = 180.0;
    float averageSpeed = 20.5;
    float averageDirection = 185.0;
    float temperature = 18.52;
    float tension = 3.3;
    float pression = 950.10;
    float humidite = 52.32;
  }

  /*
      //    Données Json
      String jData = "{\"t\":\"";
      jData += temperature;
      jData += "\",\"h\":\"";
      jData += humidite;
      jData += "\",\"p\":\"";
      jData += pression;
      jData += "\",\"ws\":\"";
      jData += windSpeed;
      jData += "\",\"wd\":\"";
      jData += windDirection;
      jData += "\",\"as\":\"";
      jData += averageSpeed;
      jData += "\"}";
      Serial.println(jData);

*/
  // Connect to the server (computer or web page)
  if (client.connect(server, 80)) {
    Serial.println("--> connection ok\n");
    client.print("GET /database/JsonSend/write_jdata.php?");
    client.print("temperature=");
    client.print( temperature );
    client.print("&&");
    client.print("humidite=");
    client.print( humidite );
    client.print("&&");    
    client.print("pression=");
    client.print( pression );
    client.print("&&");    
    client.print("windSpeed=");
    client.print( windSpeed );
    client.print("&&");    
    client.print("windDirection=");
    client.print( windDirection );
    client.print("&&");    
    client.print("averageSpeed=");
    client.print( averageSpeed );
    client.println(" HTTP/1.1"); // Part of the GET request
    client.print( "Host: " );
    client.println(server);
    client.println("Connection: close"); // Part of the GET request telling the server that we are over transmitting the message
    client.println(); // Empty line
    client.println(); // Empty line
    client.stop();    // Closing connection to server
    Serial.println("--> finished transmission\n");
  }
  else {
    // If Arduino can't connect to the server (computer or web page)
    Serial.println("--> connection failed\n");
  }

  delay(5000); // WAIT FIVE MINUTES(300000) BEFORE SENDING AGAIN (For testing 5 s)

}//fin Loop

Le programme write_jdata.php :

<?php

    // Prepare variables for database connection
   
    $dbusername = "root";  // enter database username
    $dbpassword = "";  // enter database password
    $server = "localhost"; // IMPORTANT: if you are using XAMPP enter "localhost", but if you have an online website enter its address, ie."www.yourwebsite.com"

    // Connect to your database

    $dbconnect = MySQLi_connect($server, $dbusername, $dbpassword);
    $dbselect = MySQLi_select_db($dbconnect, "anemo");

    // Prepare the SQL statement

    $sql = "INSERT INTO anemo.jdata (`temperature`, `humidite`, `pression`, `windSpeed`, `windDirection`, `averageSpeed`) VALUES ('".$_GET["temperature"]."', '".$_GET["humidite"]."', '".$_GET["pression"]."', '".$_GET["windSpeed"]."', '".$_GET["windDirection"]."', '".$_GET["averageSpeed"]."')";    

    // Execute SQL statement

    MySQLi_query($dbconnect,$sql);

?>

En espérant que vous pourrez "éclairer ma lanterne", je vous remercie par avance pour votre aide.

Fitness04 -

On envoie avec un GET (dans l'URL), soit en POST.

bien sûr de l'autre côté il faut que le programme PHP attende la bonne info

Bonjour J-M-L,

Cela veut dire que le programme PHP décode les données Json qui arrivent sous cette forme :

{"t":"18.52","h":"52.32","p":"950.10","ws":"21.50","wd":"180.00","as":"20.50"}

et qu'il remplit chaque champ de la base de données un peu à la manière de ce que fait mon programme write_Jdata.php ?

Je crois que je commence à comprendre le concept (à force de chercher!) et je vais essayer de trouver des scripts comme exemple.

Merci.

vous pouvez envoyer une requête HTPP avec un param qui aurait cette tête là

?json={"t":"18.52","h":"52.32","p":"950.10","ws":"21.50","wd":"180.00","as":"20.50"}

ensuite vous décodez dans le programme

Une URL a une longueur max (environ 2k) donc tant que ça reste court c'est envisageable, sinon faut passer en POST