Erreur compilation : expected constructor, destructor, [...]

Bonjour à tous,

Je suis actuellement en projet de TPE en 1ere S-SI au lycée, et je prépare une station météo sur base d’Arduino avec différents capteurs. J’ai également intégré un lecteur de carte SD. Je me suis inspiré d’un code trouvé sur internet, et j’ai une erreur à l’issu de la compilation :

expected constructor, destructor, or type conversion before ‘(’ token

à la ligne 134 du programme et colonne 8.
Voici le programme en question :

/*
  SD Card connection:  MOSI - pin 11 ; MISO - pin 12 ; CLK - pin 13 ; CS - pin 10  
*/
// Libraries
#include <SD.h> // Library for SD card connection
#include <SPI.h>
#include <Wire.h> // Library to communicate with I2C modules
#include "RTClib.h" // Library to use RTC module
#include <Adafruit_BMP085.h> // Library to use BMP085
#include "DHT.h" // library to use DHT sensor
#include <LiquidCrystal.h>

// Variable declaration
#define DHTPIN 2 // Digital pin of DHT sensor
#define DHTTYPE DHT22   // DHT 22  (AM2302)
DHT myDHT(DHTPIN, DHTTYPE,3); // Instanciate DHT module
RTC_DS1307 myRTC; // Instanciate RTC module
File myOutputFile; // Instanciate output file
char myData[100]; // Contain current data
Adafruit_BMP085 myBMP; // Instanciate BMP module
LiquidCrystal lcd(7, 8, 9, 3, 4, 5); //On définie les Pins pour l'écran LCD
 
uint16_t year;
uint8_t  month;
uint8_t day;
uint8_t hour;
uint8_t minute;
uint8_t second;
float temp_BMP;
int temp_BMP_int; // Integer part of temperature
int temp_BMP_dec; // Decimal part of temperature
int32_t pressure_BMP;
float temp_DHT;
int temp_DHT_int;
int temp_DHT_dec;
float humidity_DHT;
int humidity_DHT_int;
int humidity_DHT_dec;
 
void setup()
{
  // Start SD card connection : wait for port to open
  pinMode(10, OUTPUT);
  SD.begin(10);
  analogReference(INTERNAL);    
  // Start I2C connections
  Wire.begin();
  // Start RTC module
  myRTC.begin();
  if (! myRTC.isrunning()) {
    // Following line sets the RTC to the date & time this sketch was compiled
    myRTC.adjust(DateTime(__DATE__, __TIME__));
  }  
  // Start BMP module
  if (!myBMP.begin()) {
//Could not find a valid BMP085 sensor, check wiring
  }
  // Start DHT module
  myDHT.begin();
  // Start LCD module
  lcd.begin(20, 4);
  
}
 
void loop()
{
  // Retrieve RTC date
  DateTime myDateTime = myRTC.now();
  year =  myDateTime.year();
  month = myDateTime.month();
  day = myDateTime.day();
  hour = myDateTime.hour();
  minute = myDateTime.minute();
  second =  myDateTime.second();
  
  // Retrieve BMP085 data
  temp_BMP = myBMP.readTemperature();
  temp_BMP_int = int(temp_BMP);
  temp_BMP_dec = int((temp_BMP - temp_BMP_int)*100.);  
  pressure_BMP = myBMP.readPressure();
  
  // Retrieve DHT22 data
  temp_DHT = myDHT.readTemperature();
  temp_DHT_int = int(temp_DHT);
  temp_DHT_dec = int((temp_DHT - temp_DHT_int)*100.);  
  humidity_DHT = myDHT.readHumidity();
  humidity_DHT_int = int(humidity_DHT);
  humidity_DHT_dec = int((humidity_DHT - humidity_DHT_int)*100.);  
    
  sprintf(myData, "%u/%u/%u    %u:%u:%u    %i.%i    %li    %i.%i    %i.%i", year, month, day, hour, minute, second, temp_BMP_int, temp_BMP_dec, pressure_BMP, temp_DHT_int, temp_DHT_dec, humidity_DHT_int, humidity_DHT_dec);
  myOutputFile = SD.open("Data.txt", FILE_WRITE);
  myOutputFile.println(myData);
  myOutputFile.close();  
  
  // LCD Display+
  // Date
  sprintf(myData, "%u/%u/%u", day, month, year);  
  lcd.setCursor(0, 0);
  lcd.print("              ");
  lcd.setCursor(0, 0);
  lcd.print(myData);
  // Time
  sprintf(myData, "%u:%u:%u", hour, minute, second);  
  lcd.setCursor(0, 1);
  lcd.print("              ");
  lcd.setCursor(0, 1);
  lcd.print(myData);
  // BMP085 temp
  sprintf(myData, "%i.%idegC", temp_BMP_int, temp_BMP_dec);  
  lcd.setCursor(0, 2);
  lcd.print("              ");
  lcd.setCursor(0, 2);
  lcd.print(myData);
  // DHT22 temp
  sprintf(myData, "%i.%idegC",  temp_DHT_int, temp_DHT_dec);  
  lcd.setCursor(0, 3);
  lcd.print("              ");
  lcd.setCursor(0, 3);  
  lcd.print(myData);
  // BMP085 pressure
  sprintf(myData, "%liPa", pressure_BMP);  
  lcd.setCursor(0, 4);
  lcd.print("              ");
  lcd.setCursor(0, 4);
  lcd.print(myData);
  // DHT22 humidity
  sprintf(myData, "%i.%i%%", humidity_DHT_int, humidity_DHT_dec);  
  lcd.setCursor(10, 4);
  lcd.print("              ");  
  lcd.setCursor(10, 4);
  lcd.print(myData);
 
  }
  delay(100);

A noter que je n’ai pas encore adapté l’affichage des données sur l’écran LCD 20x4 que je possède au programme. (initialement conçu pour un écran LCD de vieux téléphone Nokia …)

Merci à ceux qui auraient une idée d’où pourrait provenir le problème. :smiley:

Problème de hors-jeu ligne 134 ! Que fait ce “delay(100);” ?

ta dernière ligne est en dehors de la fonction loop

EDIT: GRILLÉ

Pour une fois l’énoncé était long mais la réponse était simple ! D’habitude avec les TPE c’est l’inverse :slight_smile:

En effet, merci à vous, je ne comprend pas pourquoi je n'ai pas fait attention à ce delay ... :stuck_out_tongue:

Bonjour,

Je reviens vers vous car j’ai un problème concernant l’écriture de données sur un SD breakout, je retrouve des valeurs pas vraiment cohérentes avec les données pourtant bien affichées sur l’écran LCD. Il s’agit du dernier bloc en bas du code :

#include <LiquidCrystal.h> //On inclue les différentes librairies
#include <Wire.h>
#include <Adafruit_BMP085.h>
#include "DHT.h"
#include "RTClib.h"
#include <SD.h>
#include <SPI.h>

#define DHTPIN 2 //on définit le pin du DHT
#define DHTTYPE DHT22 //on définit le type du DHT peut aussi etre DHT11 ou DHT21
File myOutputFile; // Instanciate output file
char myData[100]; // Contain current data
Adafruit_BMP085 myBMP;//on démarre les variables de libraries
DHT myDHT(DHTPIN, DHTTYPE);
RTC_DS1307 myRTC;

LiquidCrystal lcd(7, 8, 9, 3, 4, 5); //On définie les Pins pour l'écran LCD

void setup() { //On attaque le void setup
// Start SD card connection : wait for port to open
pinMode(10, OUTPUT);
SD.begin(10);
analogReference(INTERNAL);
Serial.begin(19200); //on demarre une communication serial
myDHT.begin();//On démarre le DHT
Wire.begin();//On démarre la librairie Wire
if (!myBMP.begin()) {
Serial.println("BMP085 ERREUR !!!");//on vérifie si le bmp085 fonctionne
while (1) {}
}

Serial.println("DHT21 TEST");//on vérifie si le DHT fonctionne

myRTC.begin();
if (! myRTC.isrunning()) {
Serial.println("RTC ERREUR !!!");//On vérifie si le RTC fonctionne
myRTC.adjust(DateTime(__DATE__, __TIME__));// la ligne suivante définit l'heure du RTC à celle ou le code a été compilé
}

lcd.begin(20, 4); //On définit le nombre de caractères par ligne et le nombre de lignes du LCD

}

void loop() { //On attaque le void loop

int alti = myBMP.readAltitude(101500);//on ne garde que la partie entière de la valeur pour l'altittude sa gagne toujours deux caracteres sur le lcd...

int humi = myDHT.readHumidity(); //on definit humi pour stocker la valeur d'humidité
float tempDHT = myDHT.readTemperature();//on definit tempDHT pour stocker la valeur de temperature du DHT
float tempBMP = myBMP.readTemperature();//on definit tempBMP pour stocker la valeur de temperature du BMP
float tmoy = ((tempBMP + tempDHT)/2);//On fait la moyenne des deux valeurs de température : deux mesures valent mieux qu'une...

delay(300);//On laisse le temps à l'arduino pour qu'il agisse en conséquence

if (isnan(tempDHT) || isnan(humi))
{
Serial.println("DHT ERREUR !!!");//on revérifie le dht
} else {
Serial.print("Humidite: ");//on imprime les valeurs dans le serial si le lcd ne marche pas cela permet de débeguer...
Serial.print(humi);
Serial.print(" %\t");
Serial.print("Temperature DHT: ");
Serial.print(tempDHT);
Serial.println(" *C");
}
Serial.print("Temperature BMP = ");// a partir d'ici ce sont les données du bmp085
Serial.print(myBMP.readTemperature());
Serial.println(" *C");
Serial.print("Pression = ");
Serial.print(myBMP.readPressure());
Serial.println(" Pa");
Serial.print("Altittude = ");
Serial.print(myBMP.readAltitude());
Serial.println(" metres");
Serial.print("Real altitude = ");
Serial.print(myBMP.readAltitude(101500));
Serial.println(" metres");
Serial.print("Temperature Moyenne = ");
Serial.print(tmoy);
Serial.println(" *C");
Serial.println();

Serial.print("Nous Sommes Le = ");
DateTime now = myRTC.now();// a partir d'ici ce sont les données du DS1307
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
Serial.print("Depuis Minuit 1/1/1970 = ");
Serial.print(now.unixtime());
Serial.print("s = ");
Serial.print(now.unixtime() / 86400L);
Serial.println("d");
// calcul d'une date dans 7jours
DateTime future (now.unixtime() + 7 * 86400L + 30);
Serial.print("Maintenant + 7 Jours + 30 Secondes: ");
Serial.print(future.year(), DEC);
Serial.print('/');
Serial.print(future.month(), DEC);
Serial.print('/');
Serial.print(future.day(), DEC);
Serial.print(' ');
Serial.print(future.hour(), DEC);
Serial.print(':');
Serial.print(future.minute(), DEC);
Serial.print(':');
Serial.print(future.second(), DEC);
Serial.println();
Serial.println();  

// on passe à l'affichage sur le lcd
lcd.clear();
lcd.print(now.day(), DEC); //On affiche le jour
lcd.print('/');
lcd.print(now.month(), DEC); //On affiche le mois
lcd.print('/');
lcd.print(now.year(), DEC); //On affiche l'annee
lcd.print("     "); //espace
lcd.print(now.hour(), DEC); //On affiche l'heure
lcd.print(':');
lcd.print(now.minute(), DEC); //On affiche les minutes
lcd.setCursor(0, 1); //On passe à la seconde ligne
lcd.print(tmoy); //On affiche notre moyenne de température
lcd.print("*C"); //On affiche l'unité de température
lcd.print("    "); //espace
lcd.print("%Humi:"); //On affiche le % d'humidité
lcd.print(humi); //On affiche notre moyenne de température
lcd.setCursor(0, 2); //On passe à la troisieme ligne
lcd.print("Pression:  "); //On affiche la pression atmosphérique
lcd.print(myBMP.readPressure()/100); //on lit la valeur de pression du BMP085
lcd.print(" hPa"); //On affiche l'unité de pression : Pascal
lcd.setCursor(0, 3); //On passe à la quatrième ligne
lcd.print("Alti:"); //On affiche l'altitude
lcd.print(alti); //On lit la valeur depuis le BMP085
lcd.print("m"); //On affiche l'unité d'altitude : mètres

sprintf(myData, "%u/%u/%u    %u:%u:%u    %i    %i    %ihPa    %i", now.year(), now.month(), now.day(), now.hour(), now.minute(), now.second(), tmoy, humi, myBMP.readPressure()/100, alti);
myOutputFile = SD.open("Data.txt", FILE_WRITE);
myOutputFile.println(myData);
myOutputFile.close(); 

delay(10000);// on patiente 15 secondes ^^

}

Après avoir fait fonctionner le programme pendant quelques instants voici ce que j’obtiens sur le fichier DATA.txt sur ma carte SD :

Les données pour la date et l’heure sont bonnes, mais concernant le reste il y a plusieurs problèmes :

  • Les valeurs de température et d’humidité ne correspondent pas aux valeurs réelles. J’ai soit 13 107, soit 26 214 pour la température (et tantôt positive, tantôt négative), et pour l’humidité même chose.
  • On remarque cependant que la valeur d’humidité se trouve après, mais avec l’unité hPa, que j’avais ajoutée mais pour la pression, sachant que celle-ci se trouve finalement en dernier.

Donc les valeurs sont dans le désordre sur le fichier de la carte SD, alors qu’elles sont censées correspondre au programme.

Merci à vous si vous avez une petite idée de ce qui ne va pas. :slight_smile:

Pour l'enregistrement erroné dans le fichier SD je pencherai pour un problème de type de variable dans le sprintf : tmoy est un float que tu essaies d'écrire avec %i qui est un entier ...

Dans ta première version de ton programme tu avais compris le truc pour écrire un float dans une chaîne de caractères avec sprintf ..

D'accord donc si j'ai bien comprit il est nécessaire de faire deux variables, l'une avec le nombre correspondant à l'entier et l'autre avec le nombre correspondant aux décimales. Ou bien il y a un autre moyen et changer le %i avec autre chose ?

il y a la fonction dtostrf qui permet de convertir un float en texte

J'ignore vraiment comment me servir de cette fonction et comment l'appliquer sur mon programme ... J'y ai passé la journée entière hier à tenter de résoudre le problème sans succès. :-\

La fonction dtostrf s'applique juste après avoir déterminer les variables pour les différents capteurs au début du void(loop) ? Pourriez-vous me donner un exemple concret ?

Merci à vous. :slight_smile:

tu as fais une recherche ?

dans google la recherche "dtostrf arduino example" me donne environ 6 980 résultats (0,41 secondes) ...

c'est quoi ton souci avec cette fonction ???