INSERT depuis esp32 directement dans la DB avec variable

Bonjour, bonjour!

je débute en programmation Arduino, jusque là ça allais plutôt bien, j’arrive avec les tutoriels à peu prés à faire tout ce que je veux mais là… j’en ai marre ^^ j’y ai passé la journée, j’ai tout essayé (sauf la bonne réponse évidemment).

j’ai un ESP32 connecté à un DHT11 (capteur de temp + humidité), j’arrive à le connecter ma base de donnée MySQL que j’administre via laragon.

mais le soucis c’est que je n’arrive pas à envoyer les variables de temp et d’humidité dans ma requête insert into. c’est sure que ça viens de là, j’arrive à envoyer des chaines de caractère donc tout ce qui est connexion, c’est OK. c’est juste un problème de syntaxe, j’ai honte mais là j’en peux plus, désolé si un tuto existe déjà :S j’ai check, j’ai essayé plein de choses avec simple quote, double quote %h, .h. , $h, etc… parfois il me met “data truncate” mais si je les passe en String je me rend compte qu’il essaye d’écrire “%h” --’ bref,

voici mon code :

#include <WiFi.h>                  // Use this for WiFi instead of Ethernet.h
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>

#define DHTPIN 27     // Digital pin connected to the DHT sensor
#define DHTTYPE    DHT11     // DHT 11

DHT dht(DHTPIN, DHTTYPE);

String readDHTTemperature() {
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  //float t = dht.readTemperature(true);
  // Check if any reads failed and exit early (to try again).
  if (isnan(t)) {    
    Serial.println("Failed to read from DHT sensor!");
    return "--";
  }
  else {
    Serial.println(t);
    return String(t);
  }
}

String readDHTHumidity() {
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  if (isnan(h)) {
    Serial.println("Failed to read from DHT sensor!");
    return "--";
  }
  else {
    Serial.println(h);
    return String(h);
  }
}


byte mac_addr[] = { ---, ---, ---, ---, ---, ---};

IPAddress server_addr(---,---,-,--);  // IP of the MySQL *server* here
char user[] = "Esp32";              // MySQL user login username
char password[] = "";        // MySQL user login password

// WiFi card example
char ssid[] = "Livebox";    // your SSID
char pass[] = "topsecretdeso";       // your SSID Password

WiFiClient client;            // Use this for WiFi instead of EthernetClient
MySQL_Connection conn((Client *)&client);

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

  dht.begin();

  while (!Serial); // wait for serial port to connect. Needed for Leonardo only

  // Begin WiFi section
  WiFi.begin(ssid, pass);
  while ( WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi..");
  }
  // print out info about the connection:
    Serial.println("Connected to network");
    IPAddress ip = WiFi.localIP();
    Serial.print("My IP address is: ");
    Serial.println(ip);
    
  // End WiFi section
}

void loop() {
  // délai de 2 secondes entre 2 mesures
  delay(15000);
 
  // mesure de l'humidité
  int h = dht.readHumidity();
  // mesure de la température
  int t = dht.readTemperature();

   char INSERT_SQL[] = "INSERT INTO databasetest.sensordata (sensor, location, value1, value2) VALUES ('esp32','spa',"h","t")";


   on vérifie si les mesures sont exécutées sans faute
   Lors de la détection d'une erreur, affichage d'un message d'erreur
      if (isnan(h) || isnan(t)) {
        Serial.println("Erreur de lecture du capteur");
        return;
      }
  
  Serial.println("Connecting Database...");
  if (conn.connect(server_addr, 3306, user, password)) {
    delay(2000);

  Serial.println(h);
  Serial.println(t);

  
  Serial.println("Recording data.");

  // Initiate the query class instance
    MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
    
    // Execute the query
  cur_mem->execute(INSERT_SQL);
  // Note: since there are no results, we do not need to read any data
  // Deleting the cursor also frees up memory used
  delete cur_mem;
  }
  else
    Serial.println("Connection failed.");
  conn.close();
  

}

merci d’avance! :slight_smile:

:sob: :sob: :sob:

j'ai cru avoir trouvé, je pense être sur la bonne voie mais ça ne fonctionne toujours pas :slightly_frowning_face:

j'avais utilisé sprintf mais jusque maintenant je l'utilisais mal. j'ai modifié cette partie =>

char INSERT_SQL[] = "INSERT INTO databasetest.sensordata (sensor, location, value1, value2) VALUES ('esp32','spa','%d','%d')";
  char query[] = "";
  sprintf(query, INSERT_SQL, h, t);

  Serial.println(query);

  cur_mem->execute(query);

et il me renvoi:

9:04:34.247 -> INSERT INTO databasetest.sensordata (sensor, location, value1, value2) VALUES ('esp32','spa','32','26')
19:04:34.247 -> Connecting Database...
19:04:34.280 -> ...trying...
19:04:34.852 -> Connected to server version 5.7.24
19:04:36.879 -> 32
19:04:36.879 -> 26
19:04:36.879 -> Recording data.
19:04:37.181 -> Error: 233 = You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'I`@?⸮⸮
TO databasetest.sensordata (sensor, location, value1, value2) VAL' at line 1.
19:04:37.181 -> Disconnected.

j'ai copié collé la requête dans laragon, elle fonctionne! qu'est ce qui lui conviens pas à ce rel.....! ^^

Et avec une dimension pour query ?
Pour l'instant query a une taille nulle. Il faudrait au moins lui donner la taille de INSERT_SQL + quelques octets.

olalala merciiiiiiiiiiiiii, ça fonctionne! enfin! merci beaucoup! ^^ :slight_smile:

maintenant, je vais essayer de remettre les valeurs en float car sprintf aimais pas tout à l'heure (il me donne en valeur temp et humidité '0','1077805056') et vu que c’étais secondaire je les ai passé en entier.

la bonne route c'est plutôt de le passer en string? ou quelque chose de ce genre? "%.2f" à la place de %t?

encore merci!

%f doit être supporté par la librairie C de l'ESP32, je suppose.
Il faudra dimensionner la chaîne en conséquence.