Capteur de Température DS18B20 et enregistrement des valeurs sur Excel

Bonjour,

Dans la réalisation d'un programme d'une sonde thermique dont je pourrais enregistrer les valeurs sur un tableur Excel j'ai rencontré plusieurs problème. Je suis plutôt débutant sur Arduino et la majorité des lignes de codes du programme on été reprise de différente source.

Mon capteur de température fonctionnait parfaitement et j'affichais les résultats directement sur l'application Arduino (J'utilise une bibliothèque OneWire pour le capteur). J'ai ensuite ajouté la partie du programme qui doit permettre de transmettre les données via une application de l'Arduino jusqu'au tableur Excel. Et là plusieurs erreur sont apparu que je ne sais comment corriger.
Il faut aussi savoir qu'entre le moment ou le capteur fonctionnait et l'ajout de la partie sur Excel j'ai changé de PC et donc de version d'arduino si cela peut être lié.

Voici le programme :

#include <OneWire.h>

//Déclaration des variables

int Mesure_Pin = A0;  // EXCEL nous allons envoyer l'état de l'entrée analogique

//CAPTEUR
const int DS18B20_PIN=10;
const int DS18B20_ID=0x28;
OneWire ds(DS18B20_PIN); 

float DS18B20_temperature;
const int SERIAL_PORT=9600;

//Préparation du Capteur
void setup() {
  Serial.begin(SERIAL_PORT);
  Serial.println("Initialisation du programme");
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
}
//EXCEL
Serial.begin(9600); // initialisation de la communication série à 9600 bps 
Serial.println("CLEARDATA");  // on efface les données déjà présentes, s'il y a lieu 
Serial.println("LABEL,Temps,Mesure"); // titre des colonnes, dans Excel 
} 


//Affichage des données du capteurs
void loop() {
  //EXCEL
int ValeurMesuree = analogRead(Mesure_Pin);  // lecture de la pin A0 
Serial.print("DATA,TIME,");  // envoi du temps et la mesure à Excel 
Serial.println(ValeurMesuree);   
delay(1000);  // 1 seconde d'attente entre chaque mesure 
} 
  //CAPTEUR
  DS18B20_temperature = getTemperatureDS18b20();
  Serial.print("(DS18B20) =>/t temperature: ");
  Serial.print(DS18B20_temperature);

  //Allumage de la LED en fonction de la température 
  if(DS18B20_temperature <= 26);
  {digitalWrite(2, HIGH);
}

/* Acquisition de la température */
float getTemperatureDS18b20(){
  byte i;
  byte data[12];
  byte addr[8]
  float temp =0.0;

 ds.search(addr);

 //Vérification les données du capteur
 if (addr[0] != DS18B20_ID) {
  Serial.println("L'équipement trouvé n'est pas un DS18B20");
  return false;
 }

 //On récupère les données du capteur
 ds.reset();
 ds.select(addr);
 ds.write(0x44);
 delay(850);
 ds.reset();
 ds.select(addr);
 ds.write(0xBE);

 //On transforme les données en bit du capteur en température en Degré
 for ( i = 0; i < 9; i++) {
  data[i] = ds.read();
 }
 temp = ( (data[1] << 8) + data[0] )*O.O625

 return temp;
}

Et voici les premières erreurs obtenues

Arduino : 1.6.8 (Windows 10), Carte : "Arduino/Genuino Uno"

Programme_Final:35: error: 'DS18B20_temperature' does not name a type

   DS18B20_temperature = getTemperatureDS18b20();

   ^

Programme_Final:36: error: 'Serial' does not name a type

   Serial.print("(DS18B20) =>/t temperature: ");

   ^

Programme_Final:37: error: 'Serial' does not name a type

   Serial.print(DS18B20_temperature);

   ^

Programme_Final:40: error: expected unqualified-id before 'if'

   if(DS18B20_temperature <= 26);

   ^

Programme_Final:41: error: expected unqualified-id before '{' token

   {digitalWrite(2, HIGH);

   ^

C:\Users\thoma\Documents\Arduino\Programme_Final\Programme_Final.ino: In function 'float getTemperatureDS18b20()':

Programme_Final:49: error: expected initializer before 'float'

   float temp =0.0;

   ^

Programme_Final:51: error: 'addr' was not declared in this scope

  ds.search(addr);

            ^

Programme_Final:72: error: 'temp' was not declared in this scope

  temp = ( (data[1] << 8) + data[0] )*O.O625

  ^

Programme_Final:72: error: 'O' was not declared in this scope

  temp = ( (data[1] << 8) + data[0] )*O.O625

                                      ^

Programme_Final:74: error: expected ';' before 'return'

  return temp;

  ^

exit status 1
'DS18B20_temperature' does not name a type

Ce rapport pourrait être plus détaillé avec
l'option "Afficher les résultats détaillés de la compilation"
activée dans Fichier -> Préférences.

Merci d'avance.

hello
fais marche arrière pour la version de l'IDE Arduino

Merci une ancienne version de Arduino a effectivement résolu le problème.

Mais maintenant je me rend compte d'un nouveau problème que je n'avais pas remarqué n'ayant pas pu tester mon programme.

Les valeurs que j'envoie sur Excel ne semble pouvoir venir que d'une entrée analogique or mes valeurs viennent sur une entrer numérique.
Y a t il quand même une solution pour pouvoir enregistrer la température sur un tableau Excel d'un DS18B20 même avec une autre solution ?

Voici le tutoriel que j'ai suivi pour le macro sur Excel : Électronique en amateur: Transmettre les données de l'Arduino vers un tableur (Excel ou Libre Office Calc)

Les valeurs que j'envoie sur Excel ne semble pouvoir venir que d'une entrée analogique or mes valeurs viennent sur une entrer numérique.

je comprends pas ta phrase.
tu envoies les données recues de A0, donc comme dans le tuto.

par contre, as tu lu les commentaires en bas du tuto?
quelle version windaub et office?

Oui effectivement sur mon programme il s'agit de A0 mais mon capteurs est branché sur le DIGITAL 10, j'ai utilisé le A0 pour des test car le macro ne peut utiliser que des entrées de A0 à A5 d'après ce que j'ai compris.

Mais le capteurs lui ne peut venir que sur du Digital 13,12,11,10.... De plus justement les bit que le capteurs envois sont a la fois la valeur de la température et aussi des bits d'identifications donc de toute façon cela ne marcherait pas de les envoyer directement a Excel.

En fait ce que j'aimerais savoir si il est possible que je face entrer ma valeur final obtenu après cette partie du programme donc :

/* Acquisition de la température */
float getTemperatureDS18b20(){
  byte i;
  byte data[12];
  byte addr[8]
  float temp =0.0;

 ds.search(addr);

 //Vérification les données du capteur
 if (addr[0] != DS18B20_ID) {
  Serial.println("L'équipement trouvé n'est pas un DS18B20");
  return false;
 }

 //On récupère les données du capteur
 ds.reset();
 ds.select(addr);
 ds.write(0x44);
 delay(850);
 ds.reset();
 ds.select(addr);
 ds.write(0xBE);

 //On transforme les données en bit du capteur en température en Degré
 for ( i = 0; i < 9; i++) {
  data[i] = ds.read();
 }
 temp = ( (data[1] << 8) + data[0] )*O.O625

 return temp;
}

Sur une entrée analogique pour que je puisse la récupéré sur Excel a l'aide du macro. (Même si c'est par exemple du coup faire ressortir les données pour les faires à nouveau entrée sur de l'analogique).

Pour ce qui est du macro en lui même j'ai pas de problème. J'ai essayer le programme sur un potentiomètre il fonctionne. Et j'ai Windows 10 et Office 2016

la macro ne fait que réceptionner

Serial.print("DATA,TIME,");  // envoi du temps et la mesure à Excel
Serial.println(ValeurMesuree);

mais tu as mis

int Mesure_Pin = A0;

ton loop ne prend pas en compte le return temp

et je serais surpris que le code compile comme il faut

tu as des } sans { ouvrantes

Voilà le programme que j'ai testé et qui fonctionne pour ce qui est du capteur, le macro aussi mais bien entendu vu qu'il n'y a rien sur le A0 il ne reçoit rien. J'avais effectivement fait quelque correction d'erreurs j'ai pas pensé a le renvoyer :

#include <OneWire.h>

int Mesure_Pin = 10;  // EXCEL nous allons envoyer l'état de l'entrée analogique

//Déclaration des variables
const int DS18B20_PIN=10;
const int DS18B20_ID=0x28;
OneWire ds(DS18B20_PIN); 

float DS18B20_temperature;
const int SERIAL_PORT=9600;

//Préparation du Capteur
void setup() {
Serial.begin(SERIAL_PORT);
Serial.println("Initialisation du programme");
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);

//EXCEL
Serial.begin(9600); // initialisation de la communication série à 9600 bps 
Serial.println("CLEARDATA");  // on efface les données déjà présentes, s'il y a lieu 
Serial.println("LABEL,Temps,Mesure"); // titre des colonnes, dans Excel 
}

//Affichage des données du capteurs
void loop() { 
 //EXCEL
int ValeurMesuree = analogRead(Mesure_Pin);  // lecture de la pin A0 
Serial.print("DATA,TIME,");  // envoi du temps et la mesure à Excel 
Serial.println(ValeurMesuree);   
delay(1000);  // 1 seconde d'attente entre chaque mesure 

//CAPTEUR
DS18B20_temperature = getTemperatureDS18b20(); 
Serial.print("(DS18B20) =>\t temperature: "); 
Serial.println(DS18B20_temperature);

//Allumage de la LED en fonction de la température
if(DS18B20_temperature <= 26);
{digitalWrite(2, HIGH);
}

}

/*  Acquisition de la température */
float getTemperatureDS18b20(){
byte i;
byte data[12];
byte addr[8];
float temp =0.0;

ds.search(addr);

//Vérification du Capteur
if (addr[0] != DS18B20_ID) {
Serial.println("L'équipement trouvé n'est pas un DS18B20");
return false;
}

//On récupère les données du capteur 
ds.reset();
ds.select(addr);
ds.write(0x44);
delay(850);
ds.reset();
ds.select(addr);
ds.write(0xBE);

//On transforme les données en bit du capteur en température en Degré°
for ( i = 0; i < 9; i++) {
data[i] = ds.read();
}
temp = ( (data[1] << 8) + data[0] )*0.0625;

return temp;
}

Mais pour ce qui est du macro c'est justement pour cela que je cherche une solution. Il ne fait que réceptionné directement à une entrée sauf que j'ai besoin de traité les données reçut ( j'ai actuellement le A0 mais je pourrais très bien le changer c'est juste que je n'ai rien d'autre a mettre car aucune entrée n'a les données que j'aimerais transmettre)

Et j'aimerais bien trouver une solution pour pouvoir envoyer mes données après traitement, ci elle existe ou est possible.

tu refais la même erreur.
si tu veux la temp dans excel, il faut lui donner
tu lui envoie que ca

Serial.print("DATA,TIME,");  // envoi du temps et la mesure à Excel
Serial.println(ValeurMesuree);

il faut lui envoyer

getTemperatureDS18b20();
Serial.print("DATA,TIME,");  // envoi du temps et la mesure à Excel
Serial.print(ValeurMesuree);   
Serial.print(",");
Serial.println(temp);

J'ai déjà essayer d'envoyer la valeur "temp" mais j'obtiens ce message d'erreur

Arduino : 1.6.7 (Windows 10), Carte : "Arduino/Genuino Uno"

C:\Users\thoma\Desktop\Programme_Final\Programme_Final.ino: In function 'void loop()':

Programme_Final:34: error: 'temp' was not declared in this scope

 Serial.println(temp);

                ^

exit status 1
'temp' was not declared in this scope

  Ce rapport contiendrait plus d'informations si l'option
  "Montrer les informations de sortie pendant la compilation"
  était activée dans Fichier > Préférences.

Encore merci de prendre du temps pour mon problème

Edit : Si le programme ce compile c'est bon je l'avais remplacer au même endroit mais si je le place après le calcul de la valeur "temp" ça passe. J'essayerais aujourd'hui sur le système

Alors j'ai essayé plusieurs variante du programme avec un ami mais on n'a pas réussi a obtenir de température sur Excel cependant plusieurs message d'erreur c'est déjà une avancé quelque chose est envoyé.

Il a essayer ceci et juste après ce qu'affiche Excel

#include <OneWire.h>
int Mesure_Pin = 10; // EXCEL nous allons envoyer l'état de l'entrée analogique
//Déclaration des variables
const int DS18B20_PIN=10;
const int DS18B20_ID=0x28;
OneWire ds(DS18B20_PIN);
float DS18B20_temperature;
const int SERIAL_PORT=9600;
//Préparation du Capteur
void setup() {
Serial.begin(SERIAL_PORT);
Serial.println("Initialisation du programme");
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
//EXCEL
Serial.begin(9600); // initialisation de la communication série à 9600 bps
Serial.println("CLEARDATA"); // on efface les données déjà présentes, s'il y a lieu
Serial.println("LABEL,Temps,Mesure"); // titre des colonnes, dans Excel
}
//Affichage des données du capteurs
void loop() {
//CAPTEUR
DS18B20_temperature = getTemperatureDS18b20();
Serial.print("(DS18B20) =>\t temperature: ");
Serial.println(DS18B20_temperature);
//Allumage de la LED en fonction de la température
if(DS18B20_temperature <= 26);
{digitalWrite(2, HIGH);
}
}
// Acquisition de la température /
float getTemperatureDS18b20(){
byte i;
byte data[12];
byte addr[8];
float temp =0.0;
ds.search(addr);
//Vérification du Capteur
if (addr[0] != DS18B20_ID) {
Serial.println("L'équipement trouvé n'est pas un DS18B20");
return false;
}
//On récupère les données du capteur
ds.reset();
ds.select(addr);
ds.write(0x44);
delay(850);
ds.reset();
ds.select(addr);
ds.write(0xBE);
//On transforme les données en bit du capteur en température en Degré°
for ( i = 0; i < 9; i++) {
data[i] = ds.read();
}
temp = ( (data[1] << 8) + data[0] )*0.0625;
return temp;
//EXCEL
int ValeurMesuree = analogRead(Mesure_Pin); // lecture de la pin A0
getTemperatureDS18b20();
Serial.print("DATA,TIME,"); // envoi du temps et la mesure à Excel
Serial.print(ValeurMesuree);
Serial.print(",");
Serial.println(temp);
delay(1000); // 1 seconde d'attente entre chaque mesure
}

J'ai essayé ceci

#include <OneWire.h>
int Mesure_Pin = 10; // EXCEL nous allons envoyer l'état de l'entrée analogique
//Déclaration des variables
const int DS18B20_PIN=10;
const int DS18B20_ID=0x28;
OneWire ds(DS18B20_PIN);
float DS18B20_temperature;
const int SERIAL_PORT=9600;
//Préparation du Capteur
void setup() {
Serial.begin(SERIAL_PORT);
Serial.println("Initialisation du programme");
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
//EXCEL
Serial.begin(9600); // initialisation de la communication série à 9600 bps
Serial.println("CLEARDATA"); // on efface les données déjà présentes, s'il y a lieu
Serial.println("LABEL,Temps,Mesure"); // titre des colonnes, dans Excel
}
//Affichage des données du capteurs
void loop() {
//EXCEL
int ValeurMesuree = analogRead(Mesure_Pin); // lecture de la pin A0
getTemperatureDS18b20();
Serial.print("DATA,TIME,"); // envoi du temps et la mesure à Excel
Serial.print(ValeurMesuree);
Serial.print(",");
Serial.println(ValeurMesuree);
delay(1000); // 1 seconde d'attente entre chaque mesure
//CAPTEUR
DS18B20_temperature = getTemperatureDS18b20();
Serial.print("(DS18B20) =>\t temperature: ");
Serial.println(DS18B20_temperature);
//Allumage de la LED en fonction de la température
if(DS18B20_temperature <= 26);
{digitalWrite(2, HIGH);
}
}
//  Acquisition de la température /
float getTemperatureDS18b20(){
byte i;
byte data[12];
byte addr[8];
float temp =0.0;
ds.search(addr);
//Vérification du Capteur
if (addr[0] != DS18B20_ID) {
Serial.println("L'équipement trouvé n'est pas un DS18B20");
return false;
}
//On récupère les données du capteur
ds.reset();
ds.select(addr);
ds.write(0x44);
delay(850);
ds.reset();
ds.select(addr);
ds.write(0xBE);
//On transforme les données en bit du capteur en température en Degré°
for ( i = 0; i < 9; i++) {
data[i] = ds.read();
}
temp = ( (data[1] << 8) + data[0] )*0.0625;
return temp;
}

Et obtenu ça

Le 500 on suppose qu'il provient de ce que l'arduino affiche dans son propre affichage tout les secondes ont obtient ça:

DATA,TIME,504,504
(DS18B20) =>	 temperature: 22.31

La température change et est prise correctement