Probléme de Syntaxe (Résolu)

Un log shield sur carte SD avec horloge RTC et zone de prototypage à pastilles carrées

Probléme de Syntaxe (Résolu)

Message non lude dustynova » Mar 19 Fév 2013 23:55

Bonjour a tous ,
je viens vers vous car je pense avoir probablement un souci de syntaxe que je n'arrive pas a identifier.


j'utilise
Arduino UNO REV3,
ide 1.0.3,
OS:Windows 7,
le Shield MEMOIRE + La sonde BMP085http://snootlab.com/adafruit/247-capteur-de-pression-bmp085.html en I2C

Mon projet est d'enregistrer des relevé de Températures Horodaté:

ci joint le CODE Utilisé
Code: Tout sélectionner
    /*
   
   
    Source Code
                SNOOTLAB
                Application N°1 Shield Mémoire + BMP 085
                avec fonction d'horodatage
                Arduino UNO et IDE 1.03
            */

            #include <Wire.h>
            #include <SD.h>
            #include <RTClib.h>
            #include <Adafruit_BMP085.h>
           
           
           

            // Declaration des pin utilisées
            const char pin_chipSelect = 10;
            int temp=0;
            //10 est la pin utilisée par le shield mémoire pour le signal ChipSelect
            //const char pin_capteur = 0;                                //Numéro de la pin où est relié le capteur en question

            // Declaration des variables générales
            const unsigned long F_refresh = 5000;                      //Entrez ici la fréquence de rafraichissement du capteur, en millisecondes
            RTC_DS1307 RTC;
            Adafruit_BMP085 bmp;
            File fichier;
            String datastring;

            void setup()
            {
             
              Serial.begin(57600);                                     //Initialisation de la liaison série
              Serial.print("Initialisation de la SD card...");
             
              pinMode(pin_chipSelect, OUTPUT);                         // Mettre la pin en output
             Wire.begin();
               RTC.begin();                           
               if (! RTC.isrunning())
           {
             // Si la RTC n'est pas configurée, le faire avec les tempeurs de l'ordinateur au moment de la compilation
             RTC.adjust(DateTime(__DATE__, __TIME__));
           }
           //initialisation Librairie Temperature
             if (!bmp.begin()) {
   Serial.println("Could not find a tempid BMP085 sensor, check wiring!");
   while (1) {}};
              if (!SD.begin(pin_chipSelect))                           // Vérification de la présence de la SD card
                {                         
                  Serial.println("Carte fausse ou absente");
                  return;                                              // Si problème, sortir et bloquer l'exécution
                }
             
              Serial.println("Carte OK.");
             
              datastring = "\nReleve et horodatage des Temperature du BMP085, selon horloge RTC\n---------\n ";
             
              fichier = SD.open("log1.txt", FILE_WRITE);               // Ouverture du fichier en mode Ecriture.

              if (fichier)                                             // Si le fichier existe déja, on écrira à la suite des données présentes.
                {

                  fichier.println(datastring);

                  fichier.close();

                  Serial.println(datastring);              // dupliquer la donnée sur port série
                }
               
              else                                                     //Si problème à l'ouvertre, alors signaler l'erreur
                {                                                       
                    Serial.println("erreur d'ouverture du fichier durant la configuration");
                }
             
            }

            void loop()
            {
              delay(F_refresh);
             
              DateTime moment = RTC.now();         //Init de l'objet temporel
              temp     = bmp.readTemperature();
              datastring=String(moment.day(),DEC);
              datastring+='/';
              datastring+=String(moment.month(),DEC);
              datastring+='/';
              datastring+=String(moment.year(),DEC);
              datastring+=';';
              datastring+=String(moment.hour(),DEC);
              datastring+=':';
              datastring+=String(moment.minute(),DEC);
              datastring+=':';
              datastring+=String(moment.second(),DEC);
              datastring+=';';
              datastring+="T";
              datastring+=';';
              datastring+=String(temp);
              datastring+=";";
              datastring+="celcius";
              //int sensor = analogRead(pin_capteur);                    // lire la tempeur du capteur et la mettre dans la chaine de caractères
             
              //datastring += ("\t tempeur capteur = ");            // préalablement remplie avec les données temporelles
              //datastring += String(sensor);
             
              fichier = SD.open("log1.txt", FILE_WRITE);
             
              if (fichier)
                {
                 
                  fichier.println(datastring);
                 
                  fichier.close();
                 
                  Serial.println(datastring);                 // dupliquer la donnée sur port série
                }
              else {
                    Serial.println("erreur d'ouverture du fichier");
                    }
             
              datastring =0;
            }







Ci joint les donnes du Fichier TXT

19/2/2013;21:7:38;T;22;Celsius
19/2/2013;21:7:43;T;22;Celsius
19/2/2013;21:7:48;T;22;Celsius
19/2/2013;21:7:53;T;22;Celsius
19/2/2013;21:7:58;T;22;Celsius

j'ai utilisé un Code Présent sur ce Forum et j'en remercie encore Grandement l'auteur,
tout Fonctionne Correctement ,mon seul Souci, je n'arrive pas a utiliser de Valeur avec décimale
deux chiffre apres la Virgules me Conviendrais Grandement,
j'ai donc Tenter de Remplacer :
Code: Tout sélectionner
int temp=0;
par
Code: Tout sélectionner
 float temp=0;


mais
j'ai l'erreur suivante:
Temprature_BMP085_et_Memore.ino: In function 'void loop()':
Temprature_BMP085_et_Memore:99: error: call of overloaded 'String(float&)' is ambiguous
C:\arduino\arduino\hardware\arduino\cores\arduino/WString.h:70: note: candidates are: String::String(long unsigned int, unsigned char)
C:\arduino\arduino\hardware\arduino\cores\arduino/WString.h:69: note: String::String(long int, unsigned char)
C:\arduino\arduino\hardware\arduino\cores\arduino/WString.h:68: note: String::String(unsigned int, unsigned char)
C:\arduino\arduino\hardware\arduino\cores\arduino/WString.h:67: note: String::String(int, unsigned char)
C:\arduino\arduino\hardware\arduino\cores\arduino/WString.h:66: note: String::String(unsigned char, unsigned char)
C:\arduino\arduino\hardware\arduino\cores\arduino/WString.h:65: note: String::String(char)


avez vous une idée ?
merci encore pour votre aide
Dernière édition par dustynova le Ven 22 Fév 2013 00:52, édité 1 fois.
dustynova
 
Messages: 4
Inscription: Mar 29 Jan 2013 17:45

Re: Probléme de Syntaxe

Message non lude SesechXP » Mer 20 Fév 2013 08:02

Salut,

Si tu regardes la doc de la classe String, il n'existe pas de surcharge prenant en paramètre un float. Il te faut donc trouver une autre manière de formater ta variable en chaîne de caractères...

++
SesechXP
 
Messages: 228
Inscription: Sam 28 Mai 2011 09:09
Localisation: 35

Re: Probléme de Syntaxe

Message non lude phil » Mer 20 Fév 2013 11:26

en cherchant un peu, j'ai trouvé ça : la fonction dtostrf() !!! (Double TO String)

#include<stdlib.h>
dtostrf(FLOAT,WIDTH,PRECSISION,BUFFER);

plus de détails ici
http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html#ga6c140bdd3b9bd740a1490137317caa44
et là
http://arduino.cc/forum/index.php/topic,37391.0.html

Peut être que cela peut t'aider ?
all your shields are belong to us...
Avatar de l’utilisateur
phil
 
Messages: 192
Inscription: Mer 7 Sep 2011 11:19

Re: Probléme de Syntaxe

Message non lude dustynova » Mer 20 Fév 2013 19:37

Bonjour, et merci pour vos réponses , je vais faire des testes ce soir ....
dustynova
 
Messages: 4
Inscription: Mar 29 Jan 2013 17:45

Re: Probléme de Syntaxe

Message non lude Sna » Jeu 21 Fév 2013 12:24

Hello

Y'a aussi le probleme que si ton projet est plutot gros comme le mien, utiliser des floats, indirectement ca fait augmenter la taille de ton programme car tu dois utiliser des fonctions que tu n'utiliserais pas normalement

Ce que j'ai fait c'est donc de stocker en int et simplement multiplier la valeur pour avoir une, 2 ou 3 decimales
Ca marche toujours, avec des instructions de base, et je pense que c'est pas trop lourd (je n'ai pas fait de test de comparaison)

Code: Tout sélectionner
int TempIn1;

TempIn1 = bmp.readTemperature(); * 10;

int tmpint = TempIn1 / 10;
int adc_raw = TempIn1 % 10;

datastring = tmpint;
datastring += '.';
datastring += adc_raw;
Sna
 
Messages: 9
Inscription: Sam 10 Nov 2012 13:45

Re: Probléme de Syntaxe

Message non lude phil » Jeu 21 Fév 2013 15:59

pas bête du tout ça :-)
all your shields are belong to us...
Avatar de l’utilisateur
phil
 
Messages: 192
Inscription: Mer 7 Sep 2011 11:19

Re: Probléme de Syntaxe

Message non lude dustynova » Ven 22 Fév 2013 00:49

Bonjour, effectivement je vais faire comme sa, sa simplifiera grandement!! :D
en tout cas merci !
dustynova
 
Messages: 4
Inscription: Mar 29 Jan 2013 17:45

Re: Probléme de Syntaxe

Message non lude SesechXP » Ven 22 Fév 2013 08:12

Sna a écrit:Y'a aussi le probleme que si ton projet est plutot gros comme le mien, utiliser des floats, indirectement ca fait augmenter la taille de ton programme car tu dois utiliser des fonctions que tu n'utiliserais pas normalement

Ce que j'ai fait c'est donc de stocker en int et simplement multiplier la valeur pour avoir une, 2 ou 3 decimales
Ca marche toujours, avec des instructions de base, et je pense que c'est pas trop lourd (je n'ai pas fait de test de comparaison)


C'est effectivement une bonne solution très souvent utilisée, sur l'Arduino et plus généralement sur les petits microcontrôleurs (AVR, PIC, MSP430, etc...). C'est beaucoup moins lourd que des réels, tant en empreinte mémoire qu'en temps d'exécution.
SesechXP
 
Messages: 228
Inscription: Sam 28 Mai 2011 09:09
Localisation: 35

Re: Probléme de Syntaxe (Résolu)

Message non lude john_lenfr » Ven 22 Fév 2013 18:46

Et si bmp.readTemperature() renvoie un float, cela ne pose pas de problème à la compilation?

:?:

Windows XP SP3
IDE 0.22 ou 1.0
Arduino Uno/Mini v4/Mini Pro/Nano
Deuligne/Mémoire/XBee/Ethernet/Stalker/Sablier/Rotoshield
john_lenfr
 
Messages: 32
Inscription: Jeu 3 Jan 2013 19:36

Re: Probléme de Syntaxe (Résolu)

Message non lude SesechXP » Ven 22 Fév 2013 20:29

Aucun problème et là il n'y a trop le choix puisque le float est imposé par la méthode readTemperature...
SesechXP
 
Messages: 228
Inscription: Sam 28 Mai 2011 09:09
Localisation: 35

Re: Probléme de Syntaxe (Résolu)

Message non lude dustynova » Sam 23 Fév 2013 23:49

Bonjour Ci joint le Code Modifié ,si jamais cela peut servir
Code: Tout sélectionner
        /*
       
       
        Source Code
                    SNOOTLAB
                    Application N°1 Shield Mémoire + BMP 085
                    avec fonction d'horodatage
                    Arduino UNO et IDE 1.03
                */

                #include <Wire.h>
                #include <SD.h>
                #include <RTClib.h>
                #include <Adafruit_BMP085.h>
               
               
               

                // Declaration des pin utilisées
                const char pin_chipSelect = 10;
                int temp=0;
                int TempIn1;
                //10 est la pin utilisée par le shield mémoire pour le signal ChipSelect
                //const char pin_capteur = 0;                                //Numéro de la pin où est relié le capteur en question

                // Declaration des variables générales
                const unsigned long F_refresh = 5000;                      //Entrez ici la fréquence de rafraichissement du capteur, en millisecondes
                RTC_DS1307 RTC;
                Adafruit_BMP085 bmp;
                File fichier;
                String datastring;

                void setup()
                {
                 
                  Serial.begin(57600);                                     //Initialisation de la liaison série
                  Serial.print("Initialisation de la SD card...");
                 
                  pinMode(pin_chipSelect, OUTPUT);                         // Mettre la pin en output
                 Wire.begin();
                   RTC.begin();                           
                   if (! RTC.isrunning())
               {
                 // Si la RTC n'est pas configurée, le faire avec les tempeurs de l'ordinateur au moment de la compilation
                 RTC.adjust(DateTime(__DATE__, __TIME__));
               }
               //initialisation Librairie Temperature
                 if (!bmp.begin()) {
       Serial.println("Could not find a tempid BMP085 sensor, check wiring!");
       while (1) {}};
                  if (!SD.begin(pin_chipSelect))                           // Vérification de la présence de la SD card
                    {                         
                      Serial.println("Carte fausse ou absente");
                      return;                                              // Si problème, sortir et bloquer l'exécution
                    }
                 
                  Serial.println("Carte OK.");
                 
                  datastring = "\nReleve et horodatage des Temperature du BMP085, selon horloge RTC\n---------\n ";
                 
                  fichier = SD.open("log1.txt", FILE_WRITE);               // Ouverture du fichier en mode Ecriture.

                  if (fichier)                                             // Si le fichier existe déja, on écrira à la suite des données présentes.
                    {

                      fichier.println(datastring);

                      fichier.close();

                      Serial.println(datastring);              // dupliquer la donnée sur port série
                    }
                   
                  else                                                     //Si problème à l'ouvertre, alors signaler l'erreur
                    {                                                       
                        Serial.println("erreur d'ouverture du fichier durant la configuration");
                    }
                 
                }

                void loop()
                {
                  delay(F_refresh);
                 
                  DateTime moment = RTC.now();         //Init de l'objet temporel
                  TempIn1 = bmp.readTemperature() * 10;
                  int tmpint = TempIn1 / 10;
                  int adc_raw = TempIn1 % 10;
                 
                 
                 
                  datastring=String(moment.day(),DEC);
                  datastring+='/';
                  datastring+=String(moment.month(),DEC);
                  datastring+='/';
                  datastring+=String(moment.year(),DEC);
                  datastring+=';';
                  datastring+=String(moment.hour(),DEC);
                  datastring+=':';
                  datastring+=String(moment.minute(),DEC);
                  datastring+=':';
                  datastring+=String(moment.second(),DEC);
                  datastring+=';';
                  datastring+="T";
                  datastring+=';';
                  datastring+=String(tmpint);
                  datastring+=".";
                  datastring+=String(adc_raw);
                  //int sensor = analogRead(pin_capteur);                    // lire la tempeur du capteur et la mettre dans la chaine de caractères
                 
                  //datastring += ("\t tempeur capteur = ");            // préalablement remplie avec les données temporelles
                  //datastring += String(sensor);
                 
                  fichier = SD.open("log1.txt", FILE_WRITE);
                 
                  if (fichier)
                    {
                     
                      fichier.println(datastring);
                     
                      fichier.close();
                     
                      Serial.println(datastring);                 // dupliquer la donnée sur port série
                    }
                  else {
                        Serial.println("erreur d'ouverture du fichier");
                        }
                 
                  datastring =0;
                }






Résultat
Fichier TXT Généré

Initialisation de la SD card...Carte OK.

Releve et horodatage des Temperature du BMP085, selon horloge RTC
---------

23/2/2013;21:38:41;T;22.6
23/2/2013;21:38:46;T;22.6
23/2/2013;21:38:51;T;22.6
23/2/2013;21:38:56;T;24.9
23/2/2013;21:39:1;T;25.8
23/2/2013;21:39:6;T;24.4
23/2/2013;21:39:11;T;23.8
23/2/2013;21:39:16;T;23.5
23/2/2013;21:39:21;T;23.4
23/2/2013;21:39:26;T;23.3
23/2/2013;21:39:31;T;23.2
23/2/2013;21:39:36;T;23.2


et encore Merci !!! :)
dustynova
 
Messages: 4
Inscription: Mar 29 Jan 2013 17:45


Retourner vers Mémoire

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité