probleme utilisation des fonctions

bonjour j'ai un problème avec mes definitions:
a function-definition is not allowed here before '{' token,
ce code vise à lire une entrée analogique(a0,a1) interpréter la donnée,
en fonction de la valeur interprétrée activiter ou non un pin, à cet arduino est associé un shield relais utilisant les pin (4,5,6,7)
sachant que les différents programmes sont activer/choisie par des pins qui sont eux même mis à la valeur 1 par un autre arduino qui lui utilise un shield lcd pour selectioner les menus et ainsi activer les pin(0,1,2,3,8)
j'espere avoir été assez claire ^-^ si vous avez des questions n'hesitez pas !

#define tinput0 A0 /*sonde buse*/
#define tinput1 A1 /*sonde préchauffage*/

float tvoltage1;
float tvoltage2;
float temperature1;
float temperature2;

const int consigne1 = 210; /* consigne PLA*/
const int consigne2 = 200;
const int consigne3 = 190; /*consigne abs*/
const int consigne4 = 180;
const int MOTEURBR = 7;
const int MOTEUREX = 6;
const int RESISTANCE2 = 5 ;
const int RESISTANCE1 =  4 ;

void setup() {

  Serial.begin(9600); // Demarrer la liaison serie avec le PC b
  pinMode(A0, INPUT);
  pinMode(A1,INPUT);
  pinMode(MOTEURBR,OUTPUT);
  pinMode(MOTEUREX,OUTPUT);
  pinMode(RESISTANCE1,OUTPUT);
  pinMode(RESISTANCE2,OUTPUT);
  pinMode(0,INPUT); /*pin relié à l'arduino méga */
  pinMode(1,INPUT);
  pinMode(2,INPUT);
  pinMode(3,INPUT);
  pinMode(8,INPUT);
  }

void LectureTemp()
{

/* lecture temperature */

 tvoltage1=analogRead(tinput0);
 temperature1=((5/400)*tvoltage1);

 tvoltage2=analogRead(tinput1);
 temperature2=((5/400)*tvoltage2);
 return (temperature2);
 return (temperature1);
}

void PilotagePLA()
{
  /* pilotage résistance */ 
  
{
if (temperature1 < consigne1)
  digitalWrite(RESISTANCE1,HIGH);
else (temperature1 > consigne1)
  ;digitalWrite(RESISTANCE1,LOW);
if (temperature2 < consigne2)
  digitalWrite(RESISTANCE2,HIGH);
else (temperature2 > consigne2)
  ;digitalWrite(RESISTANCE2,LOW);
delay(500);
}

void PilotageABS(){
  /* pilotage résistance */
{
if (temperature1 < consigne3)
  digitalWrite(RESISTANCE1,HIGH);
else (temperature1 > consigne3)
  ;digitalWrite(RESISTANCE1,LOW);
if (temperature2 < consigne4)
    digitalWrite(RESISTANCE2,HIGH);
else (temperature2 > consigne4)
   ; digitalWrite(RESISTANCE2,LOW);
delay(500);
}
}
void loop() {
LectureTemp();
{
if (digitalRead(0)=HIGH){
  digitalWrite(MOTEURBR,LOW);
  digitalWrite(RESISTANCE1,LOW);
  digitalWrite(RESISTANCE2,LOW);
  digitalWrite(MOTEUREX,LOW);
}
if (digitalRead(1)=HIGH){
  PilotagePLA();
}
if (digitalRead(2)=HIGH){
  PilotagePLA();
}
if (digitalRead(3)=HIGH){
  PilotageABS();
}
if (digitalRead(8)=HIGH){
  PilotageABS();
}
}
delay(500);
}

je vous remercie de votre attention,
cordialement

Ton code est difficilement lisible
Dans l'IDE utiliswe Ctrl T pour une indentation automatique

Mais il n'y a pas que ça
Dans la fonction

void LectureTemp()
{

/* lecture temperature */

 tvoltage1=analogRead(tinput0);
 temperature1=((5/400)*tvoltage1);

 tvoltage2=analogRead(tinput1);
 temperature2=((5/400)*tvoltage2);
 return (temperature2);
 return (temperature1);
}
  • analogRead renvoie un integer. Si tu veu stocker la valeur retournée dans un float il te faut faire un transtypage
    tvoltage2=(float) abalogRead(tinput1);
  • la fonction est déclarée void, elle ne doit pas renvoyer de valeur
  • si tu veu renvoyer uen valeur tu dois déclarer le type de valeur renvoyée par exemple
float LectureTemp()
  • Dans tous les cas une fonction ne peut renvoyer qu'une seule valeur à la fois
  • la valeur de temperature1 ne sera jamais renvoyée par la fonction
  • Si tu veu renvoyer plusieurs valeurs il faut renvoyer un pointeur sur une structure contenant ces valeurs.

Il y a egalement plusieurs erreurs ici

void PilotagePLA()
{
  /* pilotage résistance */ 
  
{
if (temperature1 < consigne1)
  digitalWrite(RESISTANCE1,HIGH);
else (temperature1 > consigne1)
  ;digitalWrite(RESISTANCE1,LOW);

Ton second { ne sert à rien à part embrouiller le lecteur

else (temperature1 > consigne1)

devrait être (je suppose)

 else if (temperature1>consigne1)
;digitalWrite(RESISTANCE1,LOW);

le ; en debut de ligne ne sert à rien

Plus loin on trouve

if (digitalRead(1)=HIGH){

qui devrait être

if (digitalRead(1)==HIGH){

@Bwon29
Je vous avais répondu quand vous aviez posté dans le;forum en anglais, je ne sais pas ce qui est arrivé à ce post?

@Alain46
Des remarques tout à fait pertinentes sauf celle-ci

analogRead renvoie un integer. Si tu veux stocker la valeur retournée dans un float il te faut faire un transtypage
tvoltage2=(float) analogRead(tinput1);

Aucun typage n’est nécessaire, la promotion implicite (sous forme de conversion) d’un entier en float est tout à fait dans la spécification du C ou C++ puisque un int sur 16 bits tient sans soucis dans un float de 32 bits

Floating–integral conversions
A prvalue of integer or unscoped enumeration type can be converted to a prvalue of any floating-point type. If the value cannot be represented correctly, it is implementation defined whether the closest higher or the closest lower representable value will be selected, although if IEEE arithmetic is supported, rounding defaults to nearest. If the value cannot fit into the destination type, the behavior is undefined. If the source type is bool, the value false is converted to zero, and the value true is converted to one.

Il y a une } de trop juste avant void loop()
Il y aussi plein d'autres erreurs...

Merci beaucoup pour vos réponses j'ai retravaillé le code ce matin,
je suis partie sur l'idée de ne pas faire appels aux fonctions pour piloter les pin(4,5,6,7),ce qui allonge le code , j'ai faits 2 fonction une pour la premiere entrée a0 de temperature 1 et une seconde pour la température 2.
Le logiciel ne me détecte plus d'erreurs cependant je me demande si je ne devrais pas indiqué les tvoltage en tant que paramètre
voici le résultat:

#define tinput0 A0 /*sonde buse*/
#define tinput1 A1 /*sonde préchauffage*/

float tvoltage1;
float tvoltage2;
float temperature1;
float temperature2;

const int consigne1 = 210; /* consigne PLA*/
const int consigne2 = 200;
const int consigne3 = 190; /*consigne abs*/
const int consigne4 = 180;
const int MOTEURBR = 7;
const int MOTEUREX = 6;
const int RESISTANCE2 = 5 ;
const int RESISTANCE1 =  4 ;

void setup() {

  Serial.begin(9600); // Demarrer la liaison serie avec le PC b
  pinMode(A0, INPUT);
  pinMode(A1,INPUT);
  pinMode(MOTEURBR,OUTPUT);
  pinMode(MOTEUREX,OUTPUT);
  pinMode(RESISTANCE1,OUTPUT);
  pinMode(RESISTANCE2,OUTPUT);
  digitalWrite(MOTEURBR,LOW);
  digitalWrite(MOTEUREX,LOW);
  digitalWrite(RESISTANCE1,LOW);
  digitalWrite(RESISTANCE2,LOW);
  pinMode(0,INPUT); /*pin relié à l'arduino méga */
  pinMode(1,INPUT);
  pinMode(2,INPUT);
  pinMode(3,INPUT);
  pinMode(8,INPUT);
  }

void LectureTemp1()
{
/* lecture temperature */
 tvoltage1=analogRead(tinput0);
 temperature1=((5/400)*tvoltage1);
 return (temperature1);
}
void LectureTemp2()
{
 tvoltage2=analogRead(tinput1);
 temperature2=((5/400)*tvoltage2);
 return (temperature2);
}

void loop() {
float LectureTemp1();
float LectureTemp2();
if (digitalRead(0)==HIGH){
  digitalWrite(MOTEURBR,LOW);
  digitalWrite(RESISTANCE1,LOW);
  digitalWrite(RESISTANCE2,LOW);
  digitalWrite(MOTEUREX,LOW);
}
if (digitalRead(1)==HIGH){
  if (temperature1 < consigne1)
    digitalWrite(RESISTANCE1,HIGH);
  else if (temperature1 > consigne1)
    digitalWrite(RESISTANCE1,LOW);
  if (temperature2 < consigne2)
    digitalWrite(RESISTANCE2,HIGH);
  else if(temperature2 > consigne2)
    digitalWrite(RESISTANCE2,LOW);
}
if (digitalRead(2)==HIGH)
{
  if (temperature1 < consigne1)
    digitalWrite(RESISTANCE1,HIGH);
  else if (temperature1 > consigne1)
    digitalWrite(RESISTANCE1,LOW);
  if (temperature2 < consigne2)
    digitalWrite(RESISTANCE2,HIGH);
  else if(temperature2 > consigne2)
    digitalWrite(RESISTANCE2,LOW);
}
if (digitalRead(3)==HIGH)
  {
  if (temperature1 < consigne3)
   digitalWrite(RESISTANCE1,HIGH);
  else if (temperature1 > consigne3)
   digitalWrite(RESISTANCE1,LOW);
  if (temperature2 < consigne4)
    digitalWrite(RESISTANCE2,HIGH);
  else if(temperature2 > consigne4)
  digitalWrite(RESISTANCE2,LOW);
}
if (digitalRead(8)==HIGH){
  if (temperature1 < consigne3)
    digitalWrite(RESISTANCE1,HIGH);
  else if (temperature1 > consigne3)
    digitalWrite(RESISTANCE1,LOW);
  if (temperature2 < consigne4)
    digitalWrite(RESISTANCE2,HIGH);
  else if(temperature2 > consigne4)
    digitalWrite(RESISTANCE2,LOW);
}
delay(500);
}

@J-M-L j'avais en effet poster sur le forum anglais tenant de vos remarques je me suis permis de reposter mon sujet dans la section approprié

tu déclares les températures en variables globales, elles sont donc connues et modifiables par toutes les fonctions de ton code :

float temperature1;
float temperature2;

Tes fonctions LectureTempx sont déclarées 'void' : pas besoin de faire 'return', surtout avec ces variables globales. Tu peux donc enlever les lignes :

 return (temperature1);
 return (temperature2);

Dans ta loop, fais un simple appel à ces fonctions :

LectureTemp1();
LectureTemp2();

Je n'ai pas lu la suite... mais ça a l'air correct

Rebonjour à tous, il me reste un mystere à éclairssir dans ce code, j'ai retravaillé la structure itérative mais je ne comprends pas mon programme enclenche bien les relais en fonction de la variation de température cependant il m'est impossible de sélectionner l'une l'autre des boucles,il reste bloqué à la boucle 1 et je ne peux plus sortir de la boucle dans laquelle je suis entré,
je ne comprends pas pourquoi je ne peux pas entrer dans les boucles 2,3 et 4 et que je ne peux plus sortir de la boucle 1

cordialement

float tvoltage1;
float tvoltage2;
float temperature1;
float temperature2;

const int consigne1 = 210; /* consigne PLA*/
const int consigne2 = 200;
const int consigne3 = 190; /*consigne abs*/
const int consigne4 = 180;
const int MOTEURBR = 7;
const int MOTEUREX = 6;
const int RESISTANCE2 = 5 ;
const int RESISTANCE1 =  4 ;

void setup() {

  Serial.begin(9600); // Demarrer la liaison serie avec le PC b
  pinMode(A0, INPUT);
  pinMode(A1, INPUT);
  pinMode(MOTEURBR, OUTPUT);
  pinMode(MOTEUREX, OUTPUT);
  pinMode(RESISTANCE1, OUTPUT);
  pinMode(RESISTANCE2, OUTPUT);
  digitalWrite(MOTEURBR, LOW);
  digitalWrite(MOTEUREX, LOW);
  digitalWrite(RESISTANCE1, LOW);
  digitalWrite(RESISTANCE2, LOW);
  pinMode(9,INPUT); /*pin relié à l'arduino méga */
  pinMode(1, INPUT);
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  pinMode(8, INPUT);
}

void loop() {
  tvoltage1 = analogRead(A0);
  temperature1 = ((0.390625) * tvoltage1);
  tvoltage2 = analogRead(A1);
  temperature2 = ((0.390625) * tvoltage2);
  Serial.print("la température 1 : ");
  Serial.println(temperature1);
  Serial.print("la température 2 : ");
  Serial.println(temperature2);
  
if (digitalRead(9)!=LOW)
{
    digitalWrite(MOTEURBR, LOW);
    digitalWrite(RESISTANCE1, LOW);
    digitalWrite(RESISTANCE2, LOW);
    digitalWrite(MOTEUREX, LOW);
  }
else if (digitalRead(1)!=LOW)
{
    Serial.print("boucle1");
    if (temperature1 < (consigne1))
    {
      digitalWrite(RESISTANCE1, HIGH);
    }
    else if (temperature1 > (consigne1))
    {
      digitalWrite(RESISTANCE1, LOW);
    }
    if (temperature2 < (consigne2))
    {
      digitalWrite(RESISTANCE2, HIGH);
    }
    else if (temperature2 > (consigne2))
    {
      digitalWrite(RESISTANCE2, LOW);
    }
  }
else if (digitalRead(2) !=LOW)
  {
    Serial.print("boucle2");
    if (temperature1 < consigne1)
    {
      digitalWrite(RESISTANCE1, HIGH);
    }
    else if (temperature1 > consigne1)
    {
      digitalWrite(RESISTANCE1, LOW);
    }
    if (temperature2 < consigne2)
    {
      digitalWrite(RESISTANCE2, HIGH);
    }
    else if (temperature2 > consigne2)
    {
      digitalWrite(RESISTANCE2, LOW);
    }
  }
else if (digitalRead(3) !=LOW)
  {
    Serial.print("boucle3");
    if (temperature1 < (consigne3))
    {
      digitalWrite(RESISTANCE1, HIGH);
    }
    else if (temperature1 > consigne3)
    {
      digitalWrite(RESISTANCE1, LOW);
    }
    if (temperature2 < (consigne4))
    {
      digitalWrite(RESISTANCE2, HIGH);
    }
    else if (temperature2 > consigne4)
    {
      digitalWrite(RESISTANCE2, LOW);
    }
  }
else if (digitalRead(8)!=LOW)
{
    Serial.print("boucle4");
    if (temperature1 < consigne3)
    {
      digitalWrite(RESISTANCE1, HIGH);
    }
    else if (temperature1 > consigne3)
    {
      digitalWrite(RESISTANCE1, LOW);
    }
    if (temperature2 < consigne4)
    {
      digitalWrite(RESISTANCE2, HIGH);
    }
    else if (temperature2 > consigne4)
    {
      digitalWrite(RESISTANCE2, LOW);
    }
else 
{}
  }
  delay(5000);
}

Tu peux simplifier la loop :

void loop() {
  tvoltage1 = analogRead(A0);
  temperature1 = ((0.390625) * tvoltage1);
  tvoltage2 = analogRead(A1);
  temperature2 = ((0.390625) * tvoltage2);
  Serial.print("la température 1 : ");
  Serial.println(temperature1);
  Serial.print("la température 2 : ");
  Serial.println(temperature2);

  if (digitalRead(9) != LOW)
  {
    digitalWrite(MOTEURBR, LOW);
    digitalWrite(RESISTANCE1, LOW);
    digitalWrite(RESISTANCE2, LOW);
    digitalWrite(MOTEUREX, LOW);
  }
  else if (digitalRead(1) != LOW)
  {
    Serial.print("boucle1");
    if (temperature1 < consigne1) digitalWrite(RESISTANCE1, HIGH);
    else if (temperature1 > consigne1) digitalWrite(RESISTANCE1, LOW);
    if (temperature2 < consigne2) digitalWrite(RESISTANCE2, HIGH);
    else if (temperature2 > consigne2) digitalWrite(RESISTANCE2, LOW);
  }
  else if (digitalRead(2) != LOW)
  {
    Serial.print("boucle2");
    if (temperature1 < consigne1) digitalWrite(RESISTANCE1, HIGH);
    else if (temperature1 > consigne1) digitalWrite(RESISTANCE1, LOW);
    if (temperature2 < consigne2) digitalWrite(RESISTANCE2, HIGH);
    else if (temperature2 > consigne2) digitalWrite(RESISTANCE2, LOW);
  }
  else if (digitalRead(3) != LOW)
  {
    Serial.print("boucle3");
    if (temperature1 < consigne3) digitalWrite(RESISTANCE1, HIGH);
    else if (temperature1 > consigne3) digitalWrite(RESISTANCE1, LOW);
    if (temperature2 < consigne4) digitalWrite(RESISTANCE2, HIGH);
    else if (temperature2 > consigne4) digitalWrite(RESISTANCE2, LOW);
  }
  else if (digitalRead(8) != LOW)
  {
    Serial.print("boucle4");
    if (temperature1 < consigne3) digitalWrite(RESISTANCE1, HIGH);
    else if (temperature1 > consigne3) digitalWrite(RESISTANCE1, LOW);
    if (temperature2 < consigne4) digitalWrite(RESISTANCE2, HIGH);
    else if (temperature2 > consigne4) digitalWrite(RESISTANCE2, LOW);
  }
  else
  {}
  delay(5000);
}

Pas besoin de parenthèses dans les tests, et si une seule instruction sur un test pas besoin d'accolades.
Je pense que c'est un problème de timing : à quoi sont reliées les broches 1, 2, 3 et 8 ? Si ce sont des boutons poussoirs, il peut y avoir des effets de rebond.

Essaye d'ajouter des delay (100); (par exemple, peut-être plus que 100) avant la fin de chaque if :

  if (digitalRead(9) != LOW)
  {
    digitalWrite(MOTEURBR, LOW);
    digitalWrite(RESISTANCE1, LOW);
    digitalWrite(RESISTANCE2, LOW);
    digitalWrite(MOTEUREX, LOW);
    delay(100);
  }

Bonjour,

Il y a plusieurs problèmes dans ton programme:

  • Il y a un delay de 5s dans ta loop, donc il faut que tu appuies au moins 5 s pour que ce soit pris en compte
  • tu testes le niveau des entrées pour faire l'action, donc dès que tu relâches le bouton, le traitement n'est plus effectué. Il faut que tu testes le changement d'état du bouton (à moins que tu utilises des interrupteurs à contact maintenu)
  • tu utilises la pin 1 qui entre en conflit avec le tx de la transmission série.