Go Down

Topic: erreur dans le code (Read 3004 times) previous topic - next topic

aleqcis

bonjour,
j'ai un problème dans mon code et j'aurai donc besoin de votre aide si possible quand je compile mon programme il me met une erreur dans le mode automatique et je ne comprend pas pourquoi.
je vous remercie par avance
Code: [Select]
#include <OneWire.h>

#define monte    9
#define descente 8
#define vanne    7

#define LEDVvolet 28
#define LEDRvolet 29
#define LEDVvanne 30
#define LEDVauto 31
#define LEDRauto 32
#define LEDV???
#define LEDR???
#define LEDR???

#define selecmod 12
#define bpvanne 9
#define bpfermevolet 11
#define bpouvertvolet 10

#define ET 0
#define al 1
boolean etatvanne=ET ;

OneWire bus_sonde1(4);
OneWire bus_sonde2(5);

int seuilpiscine = 26;
int seuilext = 27;
int seuilldr = 450;

uint8_t adresse_sonde1[8];
uint8_t adresse_sonde2[8];

void ModeAutomatique();
void OuvrirFermerVolet();
void ChauffagePiscine();
void initialiserSonde1()

{
  if (!bus_sonde1.search(adresse_sonde1))
  {
    Serial.println("Sonde 1 absente");
    bus_sonde1.reset_search();
    return;
  }

  bus_sonde1.reset_search();

  if (OneWire::crc8(adresse_sonde1, 7) != adresse_sonde1[7])
  {
    Serial.println("Identifiant sonde 1 invalide");
    return;
  }

  if (adresse_sonde1[0] != 0x28)
  {
    Serial.println("Le composant sonde 1 n'est pas un DS18B20");
    return;
  }

  Serial.println("Sonde 1 trouvee");
}



void initialiserSonde2()
{
  if (!bus_sonde2.search(adresse_sonde2))
  {
    Serial.println("Sonde 2 absente");
    bus_sonde2.reset_search();
    return;
  }

  bus_sonde2.reset_search();

  if (OneWire::crc8(adresse_sonde2, 7) != adresse_sonde2[7])
  {
    Serial.println("Identifiant sonde 2 invalide");
    return;
  }

  if (adresse_sonde2[0] != 0x28)
  {
    Serial.println("Le composant sonde 2 n'est pas un DS18B20");
    return;
  }

  Serial.println("Sonde 2 trouvee");
}

uint16_t lectureSonde1()
{//retourne la température relevée en seizièmes de degrés
  uint8_t data[9];
  uint8_t i;

  bus_sonde1.reset();
  bus_sonde1.select(adresse_sonde1);
  bus_sonde1.write(0x44,1);
  delay(750);

  bus_sonde1.reset();
  bus_sonde1.select(adresse_sonde1);
  bus_sonde1.write(0xBE);

  for (i=0; i<9; i++) data[i] = bus_sonde1.read();
 
  if (OneWire::crc8(data, 8) != data[8])
  {
    return 0;
  }
  else
  {
    return ((uint16_t) data[1] << 8) | data[0];
  }
}

uint16_t lectureSonde2()
{//retourne la température relevée en seizièmes de degrés
  uint8_t data[9];
  uint8_t i;

  bus_sonde2.reset();
  bus_sonde2.select(adresse_sonde2);
  bus_sonde2.write(0x44,1);
  delay(750);

  bus_sonde2.reset();
  bus_sonde2.select(adresse_sonde2);
  bus_sonde2.write(0xBE);

  for (i=0; i<9; i++) data[i] = bus_sonde2.read();
 
  if (OneWire::crc8(data, 8) != data[8])
  {
    return 0;
  }
  else
  {
    return ((uint16_t) data[1] << 8) | data[0];
  }
}



void setup()

{
  Serial.begin(9600);
 
  initialiserSonde1();
  initialiserSonde2();
 
pinMode(LEDVvanne, OUTPUT);
pinMode(LEDVvolet, OUTPUT);
pinMode(LEDRvolet, OUTPUT);
pinMode(LEDVauto, OUTPUT);
pinMode(LEDRauto, OUTPUT);

pinMode(vanne,OUTPUT);
pinMode(monte, OUTPUT);
pinMode(descente, OUTPUT);

pinMode(selecmod, INPUT);
pinMode(bpvanne,INPUT);
pinMode(bpfermevolet,INPUT);
pinMode(bpouvertvolet,INPUT);

digitalWrite(bpfermevolet, HIGH);
digitalWrite(bpouvertvolet, HIGH);


}


void loop()

{
  if(digitalRead(selecmod)==1)
  {
  Serial.print("temp piscine: ");
  Serial.print((float) 0.0625 * lectureSonde1());
  Serial.write('C');
   Serial.write(0x03);
  Serial.print("temp ext : ");
  Serial.print((float) 0.0625 * lectureSonde2());
  Serial.write('C');

delay(5000);
Serial.write (0x1B);
Serial.write (0x43);
Serial.write(0x01);

if(!digitalRead(bpvanne))
    {
      delay(10);
      ChauffagePiscine();
    }
if(!digitalRead(bpfermevolet))
    {
      delay(10);
      OuvrirFermerVolet();
    }
if(!digitalRead(bpouvertvolet))
    {
      delay(10);
      OuvrirFermerVolet();
    }
if(!digitalRead(selecmod))
    {
      delay(10);
      ModeAutomatique();
    }

  }
}



void ChauffagePiscine()
{
 
  if(digitalRead(bpvanne)==LOW)
  {
   if(etatvanne==ET)
   {
     digitalWrite(vanne,al);
     etatvanne=al;
  }
 
      else
    {
      digitalWrite(vanne,ET);
    etatvanne=ET;
  }
  do{} while (digitalRead(bpvanne)==LOW);
  delay(1000);

}



void OuvrirFermerVolet()
{
if(!digitalRead(bpouvertvolet))
{
    digitalWrite(monte,HIGH);
    delay(13000);
   
    digitalWrite(monte,LOW);
}
if(!digitalRead(bpfermevolet))
{
    digitalWrite(descente,HIGH);
    delay(13000);
   
    digitalWrite(descente,LOW);
}
}
void ModeAutomatique()
{
  if (0.0625 * lectureSonde1()> seuilpiscine)
   {
  digitalWrite(LEDVvanne, HIGH);
  digitalWrite(vanne,HIGH);
}
else
{
  digitalWrite(LEDVvanne, LOW);
  digitalWrite(vanne,LOW);
}
if (0.0625 * lectureSonde2()< seuilext)
   {
     if (analogRead(A0)>seuilldr)
     {
  digitalWrite(LEDRvolet, HIGH);
  digitalWrite(LEDVvolet, LOW);
  digitalWrite(descente,HIGH);
  delay(500); // temps de descente ou d'ouverture du volet
  digitalWrite(descente,LOW);
}
  }

else
{
  if (analogRead(A0)<seuilldr)
  {
  digitalWrite(LEDVvolet, HIGH);
  digitalWrite(LEDRvolet, LOW);
  digitalWrite(monte,HIGH);
  delay(500);// temps de descente ou d'ouverture du volet
  digitalWrite(monte,LOW);
  }
  else
  {
    digitalWrite(LEDVvolet, LOW);
  digitalWrite(LEDRvolet, HIGH);
  digitalWrite(descente,HIGH);
  delay(500);// temps de descente ou d'ouverture du volet
  digitalWrite(descente,LOW);
}
}
}}


else
{
   Serial.print("temp piscine: ");
  Serial.print((float) 0.0625 * lectureSonde1());
  Serial.write('C');
   Serial.write(0x03);
  Serial.print("temp ext : ");
  Serial.print((float) 0.0625 * lectureSonde2());
  Serial.write('C');

delay(5000);
Serial.write (0x1B);
Serial.write (0x43);
Serial.write(0x01);
 
 
  if(digitalRead(bpvanne)==LOW)
  {
   if(etatvanne==ET)
   {
     digitalWrite(vanne,al);
     etatvanne=al;
  }
      else
    {
      digitalWrite(vanne,ET);
    etatvanne=ET;
  }
  do{} while (digitalRead(bpvanne)==LOW);
  delay(1000);
}


if(!digitalRead(bpouvertvolet))
{
    digitalWrite(monte,HIGH);
    delay(13000);
   
    digitalWrite(monte,LOW);
}
if(!digitalRead(bpfermevolet))
{
    digitalWrite(descente,HIGH);
    delay(13000);
   
    digitalWrite(descente,LOW);
}


}
}
 


infobarquee

#1
Apr 11, 2014, 08:29 pm Last Edit: Apr 11, 2014, 08:30 pm by infobarquee Reason: 1
bonjour,
ca serait bien de mettre l'erreur ;)
mais ca c'est quoi?
Code: [Select]
#define LEDV???
#define LEDR???
#define LEDR???
AUCUNE AIDE PAR MP

aleqcis

a oui désoler
Code: [Select]
#define LEDV???
#define LEDR???
#define LEDR???

enfaite c'est juste que j'ai prévue c'est led pour une autre partie du programe que j'ai pas encore fais

aleqcis

j'ai aussi supprimer sa car il me semble que sa ne sert a rien (premiere ligne du void loop)
Code: [Select]
if(digitalRead(selecmod)==1)

infobarquee

deja commente les lignes qui servent pas ou avec ces ???
mais mets les erreurs, sinon on pourra jamais t'aider
AUCUNE AIDE PAR MP

aleqcis

voici  l'erreur programme_finale_avec_void:304: error: expected declaration before '}' token
le compilateur me met une erreur sur l'accolade mais des que je la supprime il me met une erreur sur le else d'aprés

infobarquee

normal, belles erreurs dans les { }
en plus 2 else a suivre

t'as repiqué le code ou?
AUCUNE AIDE PAR MP

aleqcis

non je l'ai fais cette partie et si le programme fonctionnais mais depuis que j'ai rajouter le volet et la pompe il ne marche plus
voici le code juste en mode automatique :
Code: [Select]
#include <OneWire.h>

#define monte    9
#define descente 8
#define vanne    7

#define LEDVvolet 28
#define LEDRvolet 29
#define LEDVvanne 30
#define LEDVauto 31
#define LEDRauto 32
#define LEDV???
#define LEDR???
#define LEDR???

#define selecmod 12
#define bpvanne 9
#define bpfermevolet 11
#define bpouvertvolet 10

#define ET 0
#define al 1
boolean etatvanne=ET ;

OneWire bus_sonde1(4);
OneWire bus_sonde2(5);

int seuilpiscine = 26;
int seuilext = 27;
int seuilldr = 450;

uint8_t adresse_sonde1[8];
uint8_t adresse_sonde2[8];


void initialiserSonde1()
{
  if (!bus_sonde1.search(adresse_sonde1))
  {
    Serial.println("Sonde 1 absente");
    bus_sonde1.reset_search();
    return;
  }

  bus_sonde1.reset_search();

  if (OneWire::crc8(adresse_sonde1, 7) != adresse_sonde1[7])
  {
    Serial.println("Identifiant sonde 1 invalide");
    return;
  }

  if (adresse_sonde1[0] != 0x28)
  {
    Serial.println("Le composant sonde 1 n'est pas un DS18B20");
    return;
  }

  Serial.println("Sonde 1 trouvee");
}



void initialiserSonde2()
{
  if (!bus_sonde2.search(adresse_sonde2))
  {
    Serial.println("Sonde 2 absente");
    bus_sonde2.reset_search();
    return;
  }

  bus_sonde2.reset_search();

  if (OneWire::crc8(adresse_sonde2, 7) != adresse_sonde2[7])
  {
    Serial.println("Identifiant sonde 2 invalide");
    return;
  }

  if (adresse_sonde2[0] != 0x28)
  {
    Serial.println("Le composant sonde 2 n'est pas un DS18B20");
    return;
  }

  Serial.println("Sonde 2 trouvee");
}

uint16_t lectureSonde1()
{//retourne la température relevée en seizièmes de degrés
  uint8_t data[9];
  uint8_t i;

  bus_sonde1.reset();
  bus_sonde1.select(adresse_sonde1);
  bus_sonde1.write(0x44,1);
  delay(750);

  bus_sonde1.reset();
  bus_sonde1.select(adresse_sonde1);
  bus_sonde1.write(0xBE);

  for (i=0; i<9; i++) data[i] = bus_sonde1.read();
 
  if (OneWire::crc8(data, 8) != data[8])
  {
    return 0;
  }
  else
  {
    return ((uint16_t) data[1] << 8) | data[0];
  }
}

uint16_t lectureSonde2()
{//retourne la température relevée en seizièmes de degrés
  uint8_t data[9];
  uint8_t i;

  bus_sonde2.reset();
  bus_sonde2.select(adresse_sonde2);
  bus_sonde2.write(0x44,1);
  delay(750);

  bus_sonde2.reset();
  bus_sonde2.select(adresse_sonde2);
  bus_sonde2.write(0xBE);

  for (i=0; i<9; i++) data[i] = bus_sonde2.read();
 
  if (OneWire::crc8(data, 8) != data[8])
  {
    return 0;
  }
  else
  {
    return ((uint16_t) data[1] << 8) | data[0];
  }
}






void setup()

{
  Serial.begin(9600);
 
  initialiserSonde1();
  initialiserSonde2();
 
pinMode(LEDVvanne, OUTPUT);
pinMode(LEDVvolet, OUTPUT);
pinMode(LEDRvolet, OUTPUT);
pinMode(LEDVauto, OUTPUT);
pinMode(LEDRauto, OUTPUT);

pinMode(vanne,OUTPUT);
pinMode(monte, OUTPUT);
pinMode(descente, OUTPUT);

pinMode(selecmod, INPUT);
pinMode(bpvanne,INPUT);
pinMode(bpfermevolet,INPUT);
pinMode(bpouvertvolet,INPUT);

digitalWrite(bpfermevolet, HIGH);
digitalWrite(bpouvertvolet, HIGH);


}




void loop()

{
  if(digitalRead(selecmod)==1)
  {
  Serial.print("temp piscine: ");
  Serial.print((float) 0.0625 * lectureSonde1());
  Serial.write('C');
   Serial.write(0x03);
  Serial.print("temp ext : ");
  Serial.print((float) 0.0625 * lectureSonde2());
  Serial.write('C');

delay(5000);
Serial.write (0x1B);
Serial.write (0x43);
Serial.write(0x01);
{


if (0.0625 * lectureSonde1()> seuilpiscine)
   {
  digitalWrite(LEDVvanne, HIGH);
  digitalWrite(vanne,HIGH);
}
else
{
  digitalWrite(LEDVvanne, LOW);
  digitalWrite(vanne,LOW);
}
if (0.0625 * lectureSonde2()< seuilext)
   {
     if (analogRead(A0)>seuilldr)
     {
  digitalWrite(LEDRvolet, HIGH);
  digitalWrite(LEDVvolet, LOW);
  digitalWrite(descente,HIGH);
  delay(500); // temps de descente ou d'ouverture du volet
  digitalWrite(descente,LOW);
}
  }

else
{
  if (analogRead(A0)<seuilldr)
  {
  digitalWrite(LEDVvolet, HIGH);
  digitalWrite(LEDRvolet, LOW);
  digitalWrite(monte,HIGH);
  delay(500);// temps de descente ou d'ouverture du volet
  digitalWrite(monte,LOW);
  }
  else
  {
    digitalWrite(LEDVvolet, LOW);
  digitalWrite(LEDRvolet, HIGH);
  digitalWrite(descente,HIGH);
  delay(500);// temps de descente ou d'ouverture du volet
  digitalWrite(descente,LOW);
}
}
}}




else
{
   Serial.print("temp piscine: ");
  Serial.print((float) 0.0625 * lectureSonde1());
  Serial.write('C');
   Serial.write(0x03);
  Serial.print("temp ext : ");
  Serial.print((float) 0.0625 * lectureSonde2());
  Serial.write('C');

delay(5000);
Serial.write (0x1B);
Serial.write (0x43);
Serial.write(0x01);
 
 
  if(digitalRead(bpvanne)==LOW)
  {
   if(etatvanne==ET)
   {
     digitalWrite(vanne,al);
     etatvanne=al;
  }
      else
    {
      digitalWrite(vanne,ET);
    etatvanne=ET;
  }
  do{} while (digitalRead(bpvanne)==LOW);
  delay(1000);
}


if(!digitalRead(bpouvertvolet))
{
    digitalWrite(monte,HIGH);
    delay(13000);
   
    digitalWrite(monte,LOW);
}
if(!digitalRead(bpfermevolet))
{
    digitalWrite(descente,HIGH);
    delay(13000);
   
    digitalWrite(descente,LOW);
}


}
}
 

Uzuma

Waouh ça en fait beaucoup de "if" et de "else"  XD

Pour l'erreur, c'est juste une affaire de logique. C'est bien d'utiliser des "if" et des "else" mais il faut les mettre à leur place.

- on peut juste utiliser un "if" tout seul sans problème (pas besoin de mettre forcement un else)
- on ne peut pas utiliser de "else" sans un "if"
- tu peux aussi écrire par exemple (et en fonction de ce que tu veux):
Code: [Select]

if (a==b) //instructions
else if (a != b) // instructions
else(a > b) // instructions

Christian_R

Une erreur indiquée sur une accolade fermante '}' n'est pas située juste là, mais dans le bloc de code qui précède. Ca peut être un oubli de '{' ouvrante, situé bien plus haut.
Christian

fdufnews

Ce programme est un beau fouillis avec sa tonne de if else imbriqué et mal indenté. Mais il compile sans erreur.
Pour le formatage il faut aller dans le menu outils --> formatage automatique après on y voit plus clair.

Maintenant à la lecture on voit qu'il doit manquer quelque chose il y a un accolade ouvrante toute seule à la ligne 196 on peut se demander si un morceau de code ne s'est pas perdu.
Il y a quelques morceaux de code dupliqués. Il serait judicieux d'en faire une fonction. A cela 2 raisons:
  1) programme moins long
  2) lisibilité de loop

Je pense très sincèrement que cette succession de if..else.. est une belle tentative pour faire un programme qui ne fonctionnera pas bien. Certains tests à l'intérieur de if dans des else reprennent des cas exclus précédemment ce qui pourrait conduire à des cas mal traités.
Tu devrais remettre à plat la logique de fonctionnement de ton programme pour éviter d'avoir tous ces tests empilés les uns par dessus les autres.
Déjà le premier test fait apparaître deux modes de fonctionnement distincts. Si c'est le cas dans loop on ne devrait voir qu'un test.
Code: [Select]
void loop()

{
    if(digitalRead(selecmod)==1)
   {
        gestion_mode1();
   } else{
       gestion_mode2();
  }
}

ensuite tu définis les fonctions communes par exemple:
Code: [Select]
void gestion_piscine(){
    Serial.print("temp piscine: ");
    Serial.print((float) 0.0625 * lectureSonde1());
    Serial.write('C');
    Serial.write(0x03);
    Serial.print("temp ext : ");
    Serial.print((float) 0.0625 * lectureSonde2());
    Serial.write('C');

    delay(5000);
    Serial.write (0x1B);
    Serial.write (0x43);
    Serial.write(0x01);

}


puis tu écris les fonctions qui vont correspondre aux deux modes:
Code: [Select]
void gestion_mode1(){
   gestion_piscine();
 
  .... là le reste des fonctions nécessaires à ce mode

}

void gestion_mode1(){
   gestion_piscine();
 
  .... là le reste des fonctions nécessaires à ce mode

}


Ainsi tu gagneras en clarté, tu détecteras plus facilement les erreurs, et tu t'éviteras des heures à chercher une erreur qui ne se produira que de temps en temps parce qu'un test est mal ficelé.

aleqcis

merci beaucoup de de m'avoir aidé

Go Up