Probleme avec des if

bonsoir à tous, gros problème avec des if dans un programme de menu;
en gros, le menu appelle des sous menus en fonction de celui choisi avec un potentiomètre et de si on clique sur un bouton, il y a des sous menus ou je souhaite appeler des fonction mais cela fait bloquer toute la carte, les actions sur les bouton ou potentiomètre ne font plus rien
voici le code:
il est vraiment très long et lourd à lire mais le probleme pour moi vient des if, je n'arrive pas à ecrire autre chose que de l'affichage sur l'ecran, si j'appelle une sous fonction ça marche plus
j'ai mis un long commentaire avec marqué "ici" la ou il y a le probleme.
je vous remercie de votre aide

void setup() {
  Serial.begin(9600);
    if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)){ /// verif si l'ecran marche
    Serial.println(F("SSD1306 allocation raté"));
    for(;;);}
  display.clearDisplay();
  display.display();

  pinMode(ENTER_BUTTON, INPUT);            // Initialise le bouton 1
  pinMode(EXIT_BUTTON, INPUT);            // Initialise le bouton 2
  pinMode(ETAT_POT, INPUT);                    // Initialise le potentiomètre

  // secondes, minutes, heure, jour de la semaine, jour du mois, mois, année
  //RTC.setDS1302Time(0,20,2,3,14,12,2022);
  
  // initialisation des led
  pinMode(ledJaune, OUTPUT);
  pinMode(ledRouge, OUTPUT);
  pinMode(ledVerte, OUTPUT);
  
  pinMode(sensorPin, INPUT);

  // initialise les broches buzzer
  pinMode(10, OUTPUT);
  
  // initialise bouton
  pinMode(bouton, INPUT); // Initialise la broche 4 comme entrée 
  //attachInterrupt(digitalPinToInterrupt(bouton), boutonStop, CHANGE);

  //potentionmetre menu
  pinMode(potentio, OUTPUT);
}

void loop() {
  // ce sont des bouton
  ETAT_ENTER_BUTTON = digitalRead(ENTER_BUTTON);// selection de l'option
  ETAT_EXIT_BUTTON = digitalRead(EXIT_BUTTON); // retour en arriere pour choisir une autre option
  ETAT_POT = analogRead(POT);

  // Affiche le menu principal
  display.clearDisplay();
  display.setTextSize(1);     
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  if (ETAT_POT<512){
     display.drawRect(-10,29,160,15,BLACK);//non afficher 
     display.drawRect(-10,15,160, 11,WHITE);
    }
    if (ETAT_POT>=512){
     display.drawRect(-10,29,160,15,WHITE);//non afficher 
     display.drawRect(-10,15,160, 11,BLACK);
    }
  
  
  if (menu == 1) {
    display.println("Main Menu");
    display.println("");
    if (langue == 1) {
      display.println("1. English");
      display.println("");
      display.println("2. Francais");
    }
    else if (langue == 2) {
      display.println("1. English");
      display.println("");
      display.println("2. Francais");
    }
  }
  
  else if (menu == 2) {
    if (langue == 1) {
      display.println("English Menu");
      display.println("");
      display.println("1. BPM");
      display.println("");
      display.println("2. Memory");  
    }
    else if (langue == 2) {
      display.println("Menu Francais");
      display.println("");
      display.println("1. BPM");
      display.println("");
      display.println("2. Memoire");  
    }
  }
  else if (menu == 3){
    if (langue == 1) {
      display.println("English Menu");
      display.println("");
      display.println("1. Display BPM/PPG");
      display.println("");
      display.println("2. Start measurement"); 
    }
    else if (langue == 2) {
     display.println("Menu Francais");
      display.println("");
      display.println("1. Afficher BPM/PPG");
      display.println("");
      display.println("2. Demarrer mesure"); 
    }
  }
  else if (menu == 4){
    if (langue == 1) {
      display.println("English Menu");
      display.println("");
      display.println("1. See measurement");
      display.println("");
      display.println("2. Delete measurement"); 
    }
    else if (langue == 2) {
      display.println("Menu Francais");
      display.println("");
      display.println("1. Voir mesures ");
      display.println("");
      display.println("2. Effacer mesures"); 
    }
  }
  else if (menu == 5){
    if (langue == 1||langue == 2){
      display.clearDisplay();
      display.println("FCT AFFICHER BPM");
    }
  }
  else if (menu == 6){
    if(langue == 1||langue == 2){
      display.clearDisplay();
      display.print("mesure bpm");
      bouclepourboucle(); //// ici//////// ici ///////////ici //////// ici //////// ici ///////////
  
    }
  }
  else if (menu == 7){
    if(langue == 1||langue == 2){
      display.clearDisplay();
      display.println("FCT AFFICHER MEMOIRE");
    }
  }
  else if (menu == 8){
    if(langue == 1||langue == 2){
      display.clearDisplay();
      display.println("FCT SUPPRIMER MEMOIRE");
    }
  }
    
  display.display();
  
  if (ETAT_ENTER_BUTTON == 0) {  // Bouton1 enfoncé/////////////////////////////////ENTER/////////////////////////////////:
    if (menu == 1) {     // Si le menu principal est affiché
      if (ETAT_POT < 512) { // Potentiomètre tourne à gauche
        langue = 1;       // Selectionne l'anglais
        menu = 2;
      }
      else {               // Potentiomètre tourne à droite
        langue = 2;       // Selectionne le français
        menu = 2;
    }
    }
    else if (menu == 2){// FRANCAIS
      if (ETAT_POT < 512){
        menu = 3;
      }
      else if (ETAT_POT > 512){
        menu = 4;
      }
    } 
     else if (menu == 3){
      if (ETAT_POT < 512){
        menu = 5;
      }
      else if (ETAT_POT > 512){
        menu = 6;
      }
    } 
    else if (menu == 4){
      if (ETAT_POT < 512){
        menu = 7;
      }
      else if (ETAT_POT > 512){
        menu = 8;
      }
    } 
    else if (menu==4){//MEMORY
      menu = 6;
    }
    else if (menu==3){//BPM
      
    }
  }

  else if (ETAT_EXIT_BUTTON==0) { 
    if (menu == 2) {
      menu = 1;
    }
    else if (menu == 3){
        menu = 2;
      }
    else if (menu == 4){
      menu = 2;
   
      }
    else if (menu==5){
      menu = 3;
    }
    else if (menu==6){
      menu = 3;
    }
    else if (menu==7){
      menu = 4;
    }
    else if (menu==8){
      menu = 4;
    }
    }
   
      
  delay(100);

}

j'utilise à peu près 50% de la ram et 65% de la mémoire flash

En même temps, comme tu ne donnes pas la sous-fonction on ne peut pas trop t'aider.

Comme le dis @fdufnews tu ne donne pas le corps de ta sous-fonction.
Sais tu si tu es entrée dans la fonction bouclepourboucle.
Si oui, vu son nom, es tu sur que tu ressort de celle-ci?

Ta fonction loop réaffiche tout ton écran même si tu n'a rien changé, peut être que tu devrais effectué des actions d'affichages uniquement si les conditions change ?

Bonjour arduino-hater-ah-ah

Pourrais tu mettre ton programme en entier.

Cordialement
jpbbricole

le code consistait à programmer un cardio frequence-mètre, on mesure le battements cardiaque avec un capteur et on traite le signal pour ensuite pouvoir calculer un bpm.
il y a un horloge ( ds1302 ) pour afficher l'heure
un buzzer et un bouton pour l'arrêter.
une fonction pour dessiner une courbe sur l'ecran à partir du capteur mais elle marche bof.
un fonction pour écrire bpm et heure sur l'écran.

le menu est censé fonctionner comme cela:
on à 2 boutons, un potentiomètre, un bouton pour entrer dans une option un autre pour retourner en arrière, le potentiomètre permet de choisir l'option

voici le code en entier, il est assez bordelique et fait 450 lignes désolé :

//Les bibliothèques
#include <SPI.h>
#include <Wire.h>
#include <virtuabotixRTC.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

virtuabotixRTC RTC(6,7,8); // resistance 1k sur la D7 ( DAT )

//Initialisation de l'écran
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET 4
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

//Les Pins
int ENTER_BUTTON = 11;  // Bouton1 connecté à la pin 2
int EXIT_BUTTON = 9;  // Bouton2 connecté à la pin 3
int POT = A2; // Potentiomètre connecté à la pin A0

//Les états
int ETAT_ENTER_BUTTON = 0; // Etat initial des boutons
int ETAT_EXIT_BUTTON = 0;
int ETAT_POT = 0; 

int menu = 1;      // Selectionne le menu
int langue = 1;  // Selectionne le langage


#define samp_siz 4
#define rise_threshold 4

// Pulse Monitor Test Script
const int sensorPin = A0;
float reads[samp_siz], sum;
    long int now, ptr;
    float last, reader, start;
    float first, second, third, before, print_value;
    bool rising;
    int rise_count;
    int n;
    long int last_beat;
    float print_value_2;
    int r;
    int signalCourbe;
    
// ordonnee courbe
int Y = 0;
int X =0;
//utiliser pour tracer courbe avec x précédent et y précédent
int xp =0;
int yp =0;

// declaration des pin
int capteur = 0;
int ledRouge = 5;
int ledJaune = 4;
int ledVerte = 3;
int bouton = 2;
int potentio = A2;
int valPot;
int valPotMap;

volatile byte state = LOW;
 
int pic;
int hz;

void ecrireBPM(float print_value){// bpm et heure
  // affichage du bpm
  display.fillRect(0, 0, 120,10, BLACK); // effaçage bpm sans effacer courbe
  display.setTextSize(1);
  display.setTextColor (WHITE);
  display.setCursor(0, 0);
  display.print("bpm:");
  //if( print_Value >35 && print_Value <100){display.print(print_Value);} // eviter d'afficher des valeurs aberrantes, on est cense mesurer le bpm au repos donc pas de valeur au dessus de 100
  display.print(print_value);
  RTC.updateTime();
  display.setCursor(70,0);
  display.print(RTC.hours);
  display.print(";");
  display.print(RTC.minutes);
  display.print(";");
  display.print(RTC.seconds);

}

void allumerLed(int print_value){
  digitalWrite(ledVerte, LOW);
  digitalWrite(ledRouge, LOW);
  digitalWrite(ledJaune, LOW);
  //if ( print_value > 35 && print_value <100){
  if(print_value < 55){ /// allumage des led en fonction du BPM
            digitalWrite(ledJaune, HIGH);
            digitalWrite(ledRouge, LOW);
            digitalWrite(ledVerte, LOW);
          }
          else if (print_value > 50 && print_value <75){
            digitalWrite(ledVerte, HIGH);
            digitalWrite(ledRouge, LOW);
            digitalWrite(ledJaune, LOW);
          }
          else if (print_value > 75){
            digitalWrite(ledVerte, LOW);
            digitalWrite(ledRouge, HIGH);
            digitalWrite(ledJaune, LOW);
          }
  //}
}

void dessinerCourbe(float print_Value, int x, int signal){// pour dessiner le PPG et afficher le BPM en haut
  ecrireBPM(print_Value);
  // affichage du graphique PPG
  display.drawLine(3,10,3,62, WHITE); // dessin axe ordonne
  display.drawLine(3,62,120,62,WHITE); // dessin axe abscisse
  Y = map(signal, 0, 1023, 0, 10)*5; // pour avoir une valeur affichable à l'ecran
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.drawLine(xp, yp, x, Y, WHITE);
  display.display(); // mets a jour les changements
  xp= x;
  yp= Y;
  
  delay(10);
}
/*
void boutonStop(){
  state = !state;
  delay(20);
}
*/

void buzzer(int print_value){ //activation du buzzer grave aigu modéré selon la fréquence cardiaque
if (digitalRead(bouton) == HIGH && !state){
  if ( print_value > 35 && print_value <100){
    if(print_value < 55){
      tone (10, 100); // allume le buzzer actif arduino grave
    }
   else if (print_value > 50 && print_value <75){
    tone(10, 600); // allume le buzzer actif arduino modéré
   }
   else if (print_value > 75){
     tone(10, 1200); // allume le buzzer actif arduino aigu
   }
   state = !state;
   delay(50);
  }
}
  if (digitalRead(bouton) == HIGH && state){
   // teste si le bouton a une valeur de 0
    noTone(10); // allume le buzzer actif arduino aigu
    state = !state;
    delay(50);
   }
}

void boucleBPM(){
  //RTC.updateTime();
   if(X > 120){X=3;display.clearDisplay();} // depassement ecran
      for (int i = 0; i < samp_siz; i++){reads[i] = 0;}
    sum = 0;
    ptr = 0;

      // calculate an average of the sensor
      // during a 20 ms period (this will eliminate
      // the 50 Hz noise caused by electric light
      n = 0;
      start = millis();
      reader = 0;
      signalCourbe = analogRead(sensorPin);
      do
      {
        reader = reader + analogRead (sensorPin);
        n++;
        now = millis();
        //RTC.updateTime();
      }
      while (now < start + 20);  
      reader = reader/n;  // we got an average
      
      // Add the newest measurement to an array
      // and subtract the oldest measurement from the array
      // to maintain a sum of last measurements
      sum -= reads[ptr];
      sum += reader;
      reads[ptr] = reader;
      last = sum / samp_siz;
      // now last holds the average of the values in the array

      // check for a rising curve (= a heart beat)
      if (last > before)
      {
        rise_count++;
        if (!rising && rise_count > rise_threshold)
        {
          // Ok, we have detected a rising curve, which implies a heartbeat.
          // Record the time since last beat, keep track of the two previous
          // times (first, second, third) to get a weighed average.
          // The rising flag prevents us from detecting the same rise more than once.
          rising = true;
          first = millis() - last_beat;
          last_beat = millis();

          // Calculate the weighed average of heartbeat rate
          // according to the three last beat 
          print_value = 60000. / (0.4 * first + 0.3 * second + 0.3 * third);
          
        /*if( abs(print_value_2) - abs(print_value) > abs(10) || print_value > 80 ) // eviter valeurs aberrantes
        {
          Serial.println(print_value_2);
          print_value_2 = print_value_2;
        }*/
        //RTC.updateTime();
        
        dessinerCourbe(print_value, X, signalCourbe);
        allumerLed(print_value);
        buzzer(print_value);
        //Serial.print(print_value);
        //Serial.print('\n');
        X++;
       
        /*else{
          Serial.print(print_value);
          Serial.print('\n');
          print_value_2 = print_value;
        }*/
          
          third = second;
          second = first;
          
        }
      }
      else
      {
        // Ok, the curve is falling
        rising = false;
        rise_count = 0;
        //RTC.updateTime();
      }
      before = last;
      ptr++;
      ptr %= samp_siz;
}
/*
void bouclepourboucle(){
  while ((1))
  {
    boucleBPM();
  }
  
}
*/

void setup() {
  Serial.begin(9600);
    if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)){ /// verif si l'ecran marche
    Serial.println(F("SSD1306 allocation raté"));
    for(;;);}
  display.clearDisplay();
  display.display();

  pinMode(ENTER_BUTTON, INPUT);            // Initialise le bouton 1
  pinMode(EXIT_BUTTON, INPUT);            // Initialise le bouton 2
  pinMode(ETAT_POT, INPUT);                    // Initialise le potentiomètre

  // secondes, minutes, heure, jour de la semaine, jour du mois, mois, année
  //RTC.setDS1302Time(0,20,2,3,14,12,2022);
  
  // initialisation des led
  pinMode(ledJaune, OUTPUT);
  pinMode(ledRouge, OUTPUT);
  pinMode(ledVerte, OUTPUT);
  
  pinMode(sensorPin, INPUT);

  // initialise les broches buzzer
  pinMode(10, OUTPUT);
  
  // initialise bouton
  pinMode(bouton, INPUT); // Initialise la broche 4 comme entrée 
  //attachInterrupt(digitalPinToInterrupt(bouton), boutonStop, CHANGE);

  //potentionmetre menu
  pinMode(potentio, OUTPUT);
}

void loop() {
  // ce sont des bouton
  ETAT_ENTER_BUTTON = digitalRead(ENTER_BUTTON);// selection de l'option
  ETAT_EXIT_BUTTON = digitalRead(EXIT_BUTTON); // retour en arriere pour choisir une autre option
  ETAT_POT = analogRead(POT);

  // Affiche le menu principal
  display.clearDisplay();
  display.setTextSize(1);     
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  if (ETAT_POT<512){
     display.drawRect(-10,29,160,15,BLACK);//non afficher 
     display.drawRect(-10,15,160, 11,WHITE);
    }
    if (ETAT_POT>=512){
     display.drawRect(-10,29,160,15,WHITE);//non afficher 
     display.drawRect(-10,15,160, 11,BLACK);
    }
  
  
  if (menu == 1) {
    display.println("Main Menu");
    display.println("");
    if (langue == 1) {
      display.println("1. English");
      display.println("");
      display.println("2. Francais");
    }
    else if (langue == 2) {
      display.println("1. English");
      display.println("");
      display.println("2. Francais");
    }
  }
  
  else if (menu == 2) {
    if (langue == 1) {
      display.println("English Menu");
      display.println("");
      display.println("1. BPM");
      display.println("");
      display.println("2. Memory");  
    }
    else if (langue == 2) {
      display.println("Menu Francais");
      display.println("");
      display.println("1. BPM");
      display.println("");
      display.println("2. Memoire");  
    }
  }
  else if (menu == 3){
    if (langue == 1) {
      display.println("English Menu");
      display.println("");
      display.println("1. Display BPM/PPG");
      display.println("");
      display.println("2. Start measurement"); 
    }
    else if (langue == 2) {
     display.println("Menu Francais");
      display.println("");
      display.println("1. Afficher BPM/PPG");
      display.println("");
      display.println("2. Demarrer mesure"); 
    }
  }
  else if (menu == 4){
    if (langue == 1) {
      display.println("English Menu");
      display.println("");
      display.println("1. See measurement");
      display.println("");
      display.println("2. Delete measurement"); 
    }
    else if (langue == 2) {
      display.println("Menu Francais");
      display.println("");
      display.println("1. Voir mesures ");
      display.println("");
      display.println("2. Effacer mesures"); 
    }
  }
  else if (menu == 5){
    if (langue == 1||langue == 2){
      display.clearDisplay();
      display.println("FCT AFFICHER BPM");
    }
  }
  else if (menu == 6){
    if(langue == 1||langue == 2){
      display.clearDisplay();
      boucleBPM();   
    } 
  }
  else if (menu == 7){
    if(langue == 1||langue == 2){
      display.clearDisplay();
      display.println("FCT AFFICHER MEMOIRE");
    }
  }
  else if (menu == 8){
    if(langue == 1||langue == 2){
      display.clearDisplay();
      display.println("FCT SUPPRIMER MEMOIRE");
    }
  }
    
  display.display();
  
  if (ETAT_ENTER_BUTTON == 0) {  // Bouton1 enfoncé/////////////////////////////////ENTER/////////////////////////////////:
    if (menu == 1) {     // Si le menu principal est affiché
      if (ETAT_POT < 512) { // Potentiomètre tourne à gauche
        langue = 1;       // Selectionne l'anglais
        menu = 2;
      }
      else {               // Potentiomètre tourne à droite
        langue = 2;       // Selectionne le français
        menu = 2;
    }
    }
    else if (menu == 2){// FRANCAIS
      if (ETAT_POT < 512){
        menu = 3;
      }
      else if (ETAT_POT > 512){
        menu = 4;
      }
    } 
     else if (menu == 3){
      if (ETAT_POT < 512){
        menu = 5;
      }
      else if (ETAT_POT > 512){
        menu = 6;
      }
    } 
    else if (menu == 4){
      if (ETAT_POT < 512){
        menu = 7;
      }
      else if (ETAT_POT > 512){
        menu = 8;
      }
    } 
    else if (menu==4){//MEMORY
      menu = 6;
    }
    else if (menu==3){//BPM
      
    }
  }

  else if (ETAT_EXIT_BUTTON==0) { 
    if (menu == 2) {
      menu = 1;
    }
    else if (menu == 3){
        menu = 2;
      }
    else if (menu == 4){
      menu = 2;
   
      }
    else if (menu==5){
      menu = 3;
    }
    else if (menu==6){
      menu = 3;
    }
    else if (menu==7){
      menu = 4;
    }
    else if (menu==8){
      menu = 4;
    }
    }
   
      
  delay(100);

}

le code compile mais dès que je place une sous fonction dans une option du menu, après le téléversement, plus aucunes action ne s'exécute quand on utilise les bouton et potentiomètre, l'écran est bloqué sur ce qui était affiché avant le téléversement.

j'ai même essayé d'effectuer une simple action ( allumer une led ) à la place de la sous fonction boucleBPM dans l'option mais ça donnait le même resultat, écran bloqué

je vous remercie

Il faut débuguer : pour ça, place des Serial.println() pour afficher du texte à des endroits stratégiques et regarde ce qui s'affiche dans la console. Le premier message attendu qui ne s'affiche pas te montre l'endroit vers lequel se trouve le problème.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.