[Résolu] Injection température sonde DS18B20 vers Mysql

Salut salut,

Je tente de sauvegarder la température relevée par une sonde DS18B20 vers Mysql. J'ai réussi à me connecter au serveur (hébergé sur un Pi Zero dédié à ça uniquement) et à ajouter une valeur fixe via une simple requête INSERT, mais lorsque je cherche à sauvegarder la température, pour une raison que je ne m'explique pas, il m'affiche 0 (au lieu de 19.00)

Voilà mon code :

#include <ESP8266WiFi.h>
#include <WiFiClient.h>

#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>

#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 4
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

// MySQL
IPAddress server_addr(192,168,1,5);
char user[] = "SQL_NAME"; 
char password[] = "SQL_PASSWORD";

// WiFi
char ssid[] = "WIFI_NAME";
char pass[] = "WIFI_PASSWORD";

char query[128];

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

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, pass);
  sensors.begin();
  while ( WiFi.status() != WL_CONNECTED ) {
    delay ( 500 );
    Serial.print ( "." );
  }
  Serial.println ( "" );
  Serial.print ( "Connected to " );
  Serial.println ( ssid );
  Serial.print ( "IP address: " );
  Serial.println ( WiFi.localIP() );
  Serial.println("DB - Connecting...");
  while (conn.connect(server_addr, 3306, user, password) != true) {
    delay(500);
    Serial.print ( "." );
  }
}

void saveTempData() {
  sensors.requestTemperatures();
  MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
  Serial.print("Température actuelle: ");
  Serial.println(sensors.getTempCByIndex(0));
  Serial.print("Requête SQL: ");
  sprintf(query, "INSERT INTO sensors.livingroom (temp, datetime) values ('%d',NOW())", sensors.getTempCByIndex(0)) ; 
  cur_mem->execute(query);
  Serial.println(query);
  Serial.println("Data stored!");
}

void loop() {
  delay(2000);
  saveTempData();
}

Le résultat dans le serial monitor :

Connected to YOUR_SSID
IP address: 192.168.1.6
DB - Connecting...
Connected to server version 5.5.52-0+deb8u1
Température actuelle: 19.50
Requête SQL: INSERT INTO sensors.livingroom (temp, datetime) values ('0',NOW())
Data stored!

Et la composition de ma table

CREATE TABLE `livingroom` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `temp` int(10) DEFAULT NULL,
  `datetime` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

Quelqu'un saurait m'expliquer où je me suis planté ?
Merci d'avance :confused:

je pense qu'il faut écrire dans ton sprintf : values (%d,NOW())

Bon ben j'ai finalement trouvé. En fait, j'étais complètement à côté de la plaque. suffisait que je m'inspire (très largement) de l'un des exemples fournis avec la lib de mysql_connector pour savoir comment faire.

Du coup tout fonctionne :wink:

bonjour,
sinon, une solution simple, c'est d'appeler un fihier php sur le PI par un GET

client.print('insert_php?temp=');
client.print(temp);
client.print('\r");

dan le insert.php, tu mets ta requete insert into.................

Trajectory:
Du coup tout fonctionne :wink:

c'est très bien, .... mais la richesse de ce forum se trouve plus dans les solutions trouvées que dans les questions posées, il serait bien que tu :

  • poste la solution que tu as trouvée
  • édite ton premier post pour mettre [Résolu] en début de titre et par la même occasion mettre un titre plus explicite du genre "injection température sonde DS18B20 vers Mysql"

@infobarquee J'y ai pensé, mais il y a déjà tellement de ressource sur le net qui utilise une page php pour insérer des données que je voulais vraiment faire autrement. Je n'ai rien contre php, c'était juste un choix personel.

@rjnc38 oui désolé, je vais corriger ça de suite.

Donc le "problème" était tout bête. En regardant les exemples fournis avec la library mysql_connector, j'ai vu le "complex_insert" qui explique comment ajouter une température (float) dans la table. Du coup c'était qu'une question de copier/coller, en particulier la ligne

    dtostrf(50.125, 1, 1, temperature);

et un petit tour sur la doc pour voir ce que fait dtostrf()

ce qui donne quelque chose comme ça au final

void saveTempData() {
            sensors.requestTemperatures();
            MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
            Serial.print("Temperature: ");
            Serial.println(sensors.getTempCByIndex(0));
            Serial.print("Query: ");
            dtostrf(sensors.getTempCByIndex(0), 2, 2, temperature);
            sprintf(query, INSERT_DATA, temperature);
            cur_mem->execute(query);
            Serial.println(query);
            delete cur_mem;
            Serial.println("Data stored!");

 }

Sincèrement, tout n'était qu'une question de regarder les exemples et de regarder sur internet à quoi correspond les argument de la fonction dtostrf() au lieu de rester buter sur le fait que ma température ne pouvais être qu'un INT et de bidouiller pendant des heures ma requête.

@infobarquee J'y ai pensé, mais il y a déjà tellement de ressource sur le net qui utilise une page php pour insérer des données que je voulais vraiment faire autrement. Je n'ai rien contre php, c'était juste un choix personel.

certes, mais si tu passe le server en php7 et mysql>5.6 tu risques de rencontrer des soucis
mysql se transforme en mysqli
une requete de ce type ne fonctionne plus sur ce type de server

$connexion = mysql_connect($dbHote, $dbUser, $dbPass);
$mysql_select_db = mysql_select_db("$dbName");
$insert ="INSERT blabla.....";
mysql_query($insert);

je n'ai pas jeté un oeil dans la lib pour voir si elle est prévue pour une version dernière génération mysql et php

c'est une des raisons pour laquelle je préfère traiter sur le server la requête, sans compter qu'ajouter une lib prend de la place sur l'arduino :wink:

infobarquee:
c'est une des raisons pour laquelle je préfère traiter sur le server la requête, sans compter qu'ajouter une lib prend de la place sur l'arduino :wink:

je rajouterais une autre raison :
si la base mysql est chez un hebergeur (free pour mon ex) il est impossible de faire une connexion a distance donc les script d'injection et d'interrogation doivent être sur les serveurs de l'hebergeur

@ rjnc38 la question ne s'est jamais posé étant donné que je compte pas y avoir accès de l'extérieur. Ce "module" n'étant qu'une partie d'un dashboard censé être posé dans la maison.

Mais il est certain que je changerais de méthode lorsque je verrais les limitations de mes choix. Wait & See comme on dit :wink: