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 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 ?
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
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: