Problème d'envoie sur base de données MySQL

Bonjour ,
Je suis un débutant en arduino et je dois effectuer dans le cadre de mes études un envoi de données sur une base de donnés MySQL.

Détail de mon matériel:
-Arduino UNO
-Module GROVE
-Shield Ethernet 2
-Capteur Temperature/Humidité : AM2302

Base de données : MySQL ( hébergé depuis UwAmp)

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

J'ai utilisé plusieurs codes trouvé sur internet :

#include "DHT.h"   // Librairie des capteurs DHT
#include <Ethernet.h>
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>


#define DHTPIN 2    // Changer le pin sur lequel est branché le DHT


IPAddress ip(192,168,198,243);  // IP donnée a l'arduino

byte mac_addr[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

IPAddress server_addr(192,168,198,1);  //the IP address to that of the system on which my MySQL server is set up
char user[] = "root";              // MySQL user login username
char password[] = "root";        // MySQL user login password


// Sample query
char query[] = "SELECT id FROM world.city";

EthernetClient client;
MySQL_Connection conn((Client *)&client);



// Dé-commentez la ligne qui correspond à votre capteur 
//#define DHTTYPE DHT11     // DHT 11 
#define DHTTYPE DHT22      // DHT 22  (AM2302)
//#define DHTTYPE DHT21     // DHT 21 (AM2301)

// Initialisation du capteur pour un Arduino à 16mhz par défaut
// Il faudra modifier le 3ème paramètres pour une autre carte (sinon le capteur renvoie 0). Quelques valeurs : 8mhz => 3, 16mhz => 6, 84mhz => 84

DHT dht(DHTPIN, DHTTYPE); 
void setup() {
  Serial.begin(9600); 
  Serial.println("DHTxx test!");
 
  dht.begin();
}

void loop() {
  // Délai de 2 secondes entre chaque mesure. La lecture prend 10000 millisecondes
  delay(10000);

  // Lecture du taux d'humidité
  float h = dht.readHumidity();
  // Lecture de la température en Celcius
  float t = dht.readTemperature();
  // Pour lire la température en Fahrenheit
  float f = dht.readTemperature(true);
  
  // Stop le programme et renvoie un message d'erreur si le capteur ne renvoie aucune mesure
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Echec de lecture !");
    return;
  }

  // Calcul la température ressentie. Il calcul est effectué à partir de la température en Fahrenheit
  // On fait la conversion en Celcius dans la foulée
  float hi = dht.computeHeatIndex(f, h);
  

  Serial.print("Humidite: "); 
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: "); 
  Serial.print(t);
  Serial.print(" *C ");
  Serial.print("Temperature ressentie: ");
  Serial.print(dht.convertFtoC(hi));
  Serial.println(" *C");



  Serial.begin(9600);
  while (!Serial); // wait for serial port to connect
  Ethernet.begin(mac_addr);

  //while(!conn.connect(server_addr, 3306, user, password));

  Serial.println("Connecting...");
  if (conn.connect(server_addr, 3306, user, password)) {
    delay(1000);
  }
  else
    Serial.println("Connection failed.");
    
}

Le programme ne retourne pas d'erreur.
Je ne sais pas si il fonctionne, il me reste a envoyer les données sur la base de données nommée : "arduino"

Pour avoir un résultat comme montré en pièce jointe.

J'aimerais donc avoir votre aide pour recevoir les données de température et d'humidité sur ma BDD.

Merci d'avance pour votre aide

Capture.PNG

Capture.PNG

cette requête va lire dans la base de données

char query[] = "SELECT id FROM world.city";

Alors que vous, vous voulez insérer des choses dans la base donc plutôt une requête du type

char INSERT_SQL[] = "INSERT INTO test_arduino.hello_arduino (message) VALUES ('Hello, Arduino!')";

==> partez du code d'exemple qui insère des données, pas qui les lit

une fois que vous avez compris cet exemple, regardez celui qui est un peu plus compliqué (complex_insert.ino) et qui va insérer des valeurs obtenues par différents capteurs

En utilisant le premier code exemple , je suis arriver à ce résultat la :

#include <Ethernet.h>
#include "DHT.h" // Librairie des capteurs DHT
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>

#define DHTTYPE DHT22 
#define DHTPIN 2    // Changer le pin sur lequel est branché le DHT

byte mac_addr[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

IPAddress ip(172,17,3,243);  // IP donnée a l'arduino

IPAddress server_addr(172,17,3,231);  // IP of the MySQL *server* here
char user[] = "root";              // MySQL user login username
char password[] = "root";        // MySQL user login password

// Sample query
char INSERT_SQL[] = "INSERT INTO arduino (Temperature, Humidité) VALUES ('t', h)";

EthernetClient client;
MySQL_Connection conn((Client *)&client);

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(115200);
  Serial.println("DHTxx test!");
  while (!Serial); // wait for serial port to connect
  Ethernet.begin(mac_addr);
  Serial.println("Connecting...");
  if (conn.connect(server_addr, 3306, user, password)) {
    delay(1000);
  }
  else
    Serial.println("Connection failed.");
}


void loop() {
  delay(2000);

// Lecture du taux d'humidité
  float h = dht.readHumidity();
  // Lecture de la température en Celcius
  float t = dht.readTemperature();
  // Pour lire la température en Fahrenheit
  float f = dht.readTemperature(true);
  
  // Stop le programme et renvoie un message d'erreur si le capteur ne renvoie aucune mesure
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Echec de lecture !");
    return;
  }

  // Calcul la température ressentie. Il calcul est effectué à partir de la température en Fahrenheit
  // On fait la conversion en Celcius dans la foulée
  float hi = dht.computeHeatIndex(f, h);
  

  Serial.print("Humidite: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.print(" *C ");
  Serial.print("Temperature ressentie: ");
  Serial.print(dht.convertFtoC(hi));
  Serial.println(" *C");
  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;
}

Rien n'a changé sur la base de données, j'obtient le résultat la sur le moniteur série :

DHTxx test!
1⸮e⸮::⸮f⸮⸮⸮⸮⸮⸮⸮⸮08:57:24.511 -> ⸮⸮⸮%⸮⸮⸮⸮⸮%⸮%⸮⸮%⸮⸮⸮⸮⸮
⸮⸮J⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮%⸮⸮⸮J⸮J⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮%⸮

Savez-vous me dire ou est mon erreur ?

Ouvrez la console à 115200 bauds

La requête SQL que vous écrivez n’est pas bien formée, commencez par tester les accès avec des valeurs fixes à insérer avec

 char INSERT_SQL[] = "INSERT INTO arduino (Temperature, Humidité) VALUES (’22’, ’55’)";

(vérifiez le nom des colonnes, notamment l’usage d’un accent aigu pour Humidité)

Ensuite il faudra générer dynamiquement la requête en insérant la représentation en ascii des nombres aux bons endroits de la requête. Mais chaque chose en son temps.

Merci pour votre réponse, :slight_smile:
J'ai essayé une nouvelle fois le programme en lui ajoutant des variables fixes comme dans votre exemple mais rien ne change .
Je pense que l'arduino n'arrive pas du tout à accéder a la base de données .
Faut-il que je change quelque chose à mon programme suite à l'usage d'un shield ethernet ?

En ouvrant la console à 115200 bauds
Le message change :
Connecting...
...trying...
ERROR: Timeout waiting for client.
Error: -1 = Connection failed.
Echec de lecture !

Bon ça veut dire que la connexion ne fonctionne pas...

Testez déjà avec des exemples du shield Ethernet pour voir si l’accès au réseau est fonctionnel

Ce code ne permet même pas de savoir si le problème se situe au niveau connexion Ethernet ou MySql.

 Ethernet.begin(mac_addr);

Il serait bien de tester la valeur retournée (tiré des exemples de la librairie) :

  if (Ethernet.begin(mac_addr) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    if (Ethernet.hardwareStatus() == EthernetNoHardware) {
      Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
    } else if (Ethernet.linkStatus() == LinkOFF) {
      Serial.println("Ethernet cable is not connected.");
    }
    // no point in carrying on, so do nothing forevermore:
    while (true) {
      delay(1);
    }
  }

dans vos print il manque le & pour séparer dans l'URL temp1 de humi1
vous devez générer un truc qui ressemble à

[color=purple]GET /sensors/essai_sql_0.php?temp1=33.20&humi1=40.24[/color]

côté PHP vous fabriquez une chaîne de caractère pour la requête SQL, donc autant conserver les paramètres sous forme texte. ==> Si vous virez ces 2 lignes (louches de toutes façons)

   $_GET['temp1'] = floatval($_GET['temp1']);
   $_GET['humi1'] = floatval($_GET['humi1']);

ça donne quoi?

On passe du coq à l'âne : MySql à HTTP.

L'URL devrait être /sensors/essai_sql_0.php?temp1=t**&**humi1=h

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.