Calling function

Hi everyone!

I am writing a program to display menus on my LCD screen but I am facing a problem. I want to be able to go to the function SecondaryMenu1 by clicking the setting button and be able to go back to the mainMenu by clicking the select button. for the moment, I can only go to the SecondaryMenu1 function but I can go back to the mainMenu. Here is the portion of my code where I encounter the problem.

PS* I'm a beginner

void loop() {

mainMenu();

}


void mainMenu() {
       

SelectButtonState = digitalRead(SelectButton);       
SettingButtonState = digitalRead(SettingButton);           



switch (Menu) {
  
  case 1:
    
    
    lcd.clear();                                              
    lcd.setCursor(0,0);                                                                          
    lcd.print("humidity:");                                                                                                                                             
    delay(500);  

if(SettingButtonState == LOW)
{SecondaryMenu1();}
      
      break;



void SecondaryMenu1(){

SelectButtonState = digitalRead(SelectButton);
SettingButtonState = digitalRead(SettingButton);


while(1){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("modification");
delay(500);

if(SelectButtonState == LOW) 
{mainMenu();}

}
}

Don't call it, just return to it:

    if(SelectButtonState == LOW)
    {
        return;

    }

ok thanks I'll try that.

This is a recursive call and it will quickly eat up all your SRAM

if(SelectButtonState == LOW) 
{mainMenu();}

Just use return to go back to the calling function

if(SelectButtonState == LOW) {
   return;
}

Note that code is much easier to read if you don’t cram everything on one line and if you indent lines so that, for example, all the lines affected by an IF can be quickly and easily seen. Use the AutoFormat tool

…R

I try what you told me to do but it doesn't work. I wrote return instead of mainMenu but I still can't go back to the mainMenu. Is there something else I should do ?

Thanks for your help.

Elliot_Gareau: I try what you told me to do but it doesn't work. I wrote return instead of mainMenu but I still can't go back to the mainMenu. Is there something else I should do ?

Thanks for your help.

Post your entire code (what you've posted doesn't compile.)

Here is my entire code. The variables are in French. I translate the part of my code below but my entire code is just too long to be translate. I’m sorry about that but it is still understandable. Also, the code is very long and not finish yet. I highlight the important parts of the code.

#include <Wire.h>                                  
#include <LiquidCrystal_I2C.h>                     
LiquidCrystal_I2C lcd(0x27,20,4);                  


const int BoutonSelection = 10;                    
const int BoutonReglage = 11;                      
const int BoutonPlus = 12;                         
const int BoutonMoins = 13;                        

int pageMenu = 1;

const int Relai1 = 8;                               
const int Relai2 = 9;                               

int EtatBoutonPlus = HIGH;                         
int EtatBoutonMoins = HIGH;                        
int EtatBoutonSelection = HIGH;                    
int EtatBoutonReglage = HIGH;                      


int TauxHumidite;                                  
int PourcentageHumidite;                           
int ValeurMaximum = 1023;                          
int ValeurMinimum = 0;                             


int Seconde = 0;
int Minute = 0;
int Heure = 0;
int Jour = 0;
int Semaine = 0;

int TempsLumiere = 12;


void setup() {

lcd.begin();                                      
lcd.backlight();                                  
                  

pinMode (BoutonSelection, INPUT_PULLUP);          
pinMode (BoutonReglage, INPUT_PULLUP);            
pinMode (BoutonPlus, INPUT_PULLUP);               
pinMode (BoutonMoins, INPUT_PULLUP);              
pinMode(A0, INPUT);                               
pinMode(Relai1, OUTPUT);                           
pinMode(Relai2, OUTPUT);                           


}

[color=yellow]void loop() {

MenuPrincipal();

}


void MenuPrincipal() {
[/color]

TauxHumidite = analogRead(A0);                                                        
PourcentageHumidite = map(TauxHumidite, ValeurMaximum, ValeurMinimum, 0, 100);        
EtatBoutonSelection = digitalRead(BoutonSelection);       
EtatBoutonReglage = digitalRead(BoutonReglage);           
EtatBoutonPlus = digitalRead(BoutonPlus);                 
EtatBoutonMoins = digitalRead(BoutonMoins);               


if(EtatBoutonPlus == LOW)
{pageMenu++;}

if(EtatBoutonMoins == LOW)
{pageMenu--;}


if(pageMenu == 0)
{pageMenu = 4;}

if(pageMenu == 5)
{pageMenu = 1;}



[color=yellow]switch (pageMenu) {
 
 case 1:
   
   
   lcd.clear();                                              
   lcd.setCursor(0,0);                                       
   lcd.print("Taux humidite");                                                              
   lcd.setCursor(0,1);                                       
   lcd.print("actuel:");                                     
   lcd.setCursor(7,1);                                       
   lcd.print(PourcentageHumidite);                           
   lcd.setCursor(9,1);                                       
   lcd.print("%");                                           
   delay(500);  

if(EtatBoutonReglage == LOW)
{SousMenu1();}
     
     break;[/color]
 
 
 case 2:
   
   
   lcd.setCursor(0,0);                    
   lcd.print("S:");
   lcd.setCursor(2,0);                    
   lcd.print(Seconde);
   lcd.setCursor(6,0);                    
   lcd.print("M:");
   lcd.setCursor(8,0);                    
   lcd.print(Minute);
   lcd.setCursor(12,0);                   
   lcd.print("H:");
   lcd.setCursor(14,0);                  
   lcd.print(Heure);
   lcd.setCursor(3,1);                  
   lcd.print("J:");
   lcd.setCursor(5,1);                    
   lcd.print(Jour);
   lcd.setCursor(10,1);                    
   lcd.print("Se:");
   lcd.setCursor(13,1);                    
   lcd.print(Semaine);
   delay(1000);
   
   break;
 
 
 case 3:
   
   lcd.clear();
   lcd.setCursor(0,0);
   lcd.print("Heure:");
   lcd.setCursor(6,0);
   lcd.print(Heure);
   lcd.setCursor(0,1);
   lcd.print("Lumiere/24h:");
   lcd.setCursor(13,1);
   lcd.print(TempsLumiere);
   delay(1000);
   
   
   break;




if(TauxHumidite >= 850)                                   
{digitalWrite(Relai1, LOW);}                             

else {digitalWrite(Relai1, HIGH);}                       


if(TempsLumiere <= Heure)
{digitalWrite(Relai2, HIGH);}                               
else {digitalWrite(Relai2, LOW);}                         



Seconde++;

if (Seconde == 60) 

{Seconde = 0;
Minute++;}

if (Minute == 60) 

{Minute = 0;
Heure++;}

if (Heure == 24)

{Heure = 0;
Jour++;}

if (Jour == 7) 
{Jour = 0;
Semaine++;}


lcd.clear();

}


[color=yellow]void SousMenu1(){

EtatBoutonSelection = digitalRead(BoutonSelection);       
EtatBoutonReglage = digitalRead(BoutonReglage);           
EtatBoutonPlus = digitalRead(BoutonPlus);                 
EtatBoutonMoins = digitalRead(BoutonMoins);               


while(1){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("modification");
delay(500);

if(EtatBoutonSelection == LOW) {
 return;
 
}

}
}

[/color]

The code still does not compile. There’s a misalignment of braces. For example, with indenting:

.
.
.
    EtatBoutonReglage = digitalRead(BoutonReglage);          
    EtatBoutonPlus = digitalRead(BoutonPlus);                
    EtatBoutonMoins = digitalRead(BoutonMoins);              


    if(EtatBoutonPlus == LOW)
    {
        pageMenu++;
    }
    }   //<---- extra brace?

    if(EtatBoutonMoins == LOW)
    {
        pageMenu--;
    }


if(pageMenu == 0)
{pageMenu = 4;}
.
.
.

I don't understand. Do you want me to put extra braces or remove braces because I don't see any extra braces in the code that I posted Moreover, for me, the code compiles correctly.

Elliot_Gareau:
I don’t understand. Do you want me to put extra braces or remove braces because I don’t see any extra braces in the code that I posted Moreover, for me, the code compiles correctly.

Well, I don’t see how but okay…

I adjusted a few things and got it to compile here. For your return problem, you need to read the switch each pass to update the variable EtatBoutonSelection before testing it.

#include <Wire.h>                                  
#include <LiquidCrystal_I2C.h>  
                  
LiquidCrystal_I2C lcd(0x27,20,4);                  


const int BoutonSelection = 10;                    
const int BoutonReglage = 11;                      
const int BoutonPlus = 12;                        
const int BoutonMoins = 13;                        

int pageMenu = 1;

const int Relai1 = 8;                              
const int Relai2 = 9;                              

int EtatBoutonPlus = HIGH;                        
int EtatBoutonMoins = HIGH;                        
int EtatBoutonSelection = HIGH;                    
int EtatBoutonReglage = HIGH;                      


int TauxHumidite;                                  
int PourcentageHumidite;                          
int ValeurMaximum = 1023;                          
int ValeurMinimum = 0;                            


int Seconde = 0;
int Minute = 0;
int Heure = 0;
int Jour = 0;
int Semaine = 0;

int TempsLumiere = 12;


void setup() 
{
    //lcd.begin();                                      
    lcd.init();                                      
    lcd.backlight();                                  
                     
    pinMode (BoutonSelection, INPUT_PULLUP);          
    pinMode (BoutonReglage, INPUT_PULLUP);            
    pinMode (BoutonPlus, INPUT_PULLUP);              
    pinMode (BoutonMoins, INPUT_PULLUP);              
    pinMode(A0, INPUT);                              
    pinMode(Relai1, OUTPUT);                          
    pinMode(Relai2, OUTPUT);                          

}//setup

void loop() 
{
    MenuPrincipal();

}//loop


void MenuPrincipal() 
{
    TauxHumidite = analogRead(A0);                                                        
    PourcentageHumidite = map(TauxHumidite, ValeurMaximum, ValeurMinimum, 0, 100);        
    EtatBoutonSelection = digitalRead(BoutonSelection);      
    EtatBoutonReglage = digitalRead(BoutonReglage);          
    EtatBoutonPlus = digitalRead(BoutonPlus);                
    EtatBoutonMoins = digitalRead(BoutonMoins);              


    if(EtatBoutonPlus == LOW)
    {
        pageMenu++;
    }

    if(EtatBoutonMoins == LOW)
    {
        pageMenu--;
    }

    if(pageMenu == 0)
    {
        pageMenu = 4;
    }

    if(pageMenu == 5)
    {
        pageMenu = 1;
    }

    switch (pageMenu) 
    {
        case 1:   
            lcd.clear();                                              
            lcd.setCursor(0,0);                                      
            lcd.print("Taux humidite");                                                             
            lcd.setCursor(0,1);                                      
            lcd.print("actuel:");                                    
            lcd.setCursor(7,1);                                      
            lcd.print(PourcentageHumidite);                          
            lcd.setCursor(9,1);                                      
            lcd.print("%");                                          
            delay(500);  

            if(EtatBoutonReglage == LOW)
            {
                SousMenu1();
            }
     
        break;
 
        case 2:   
            lcd.setCursor(0,0);                    
            lcd.print("S:");
            lcd.setCursor(2,0);                    
            lcd.print(Seconde);
            lcd.setCursor(6,0);                    
            lcd.print("M:");
            lcd.setCursor(8,0);                    
            lcd.print(Minute);
            lcd.setCursor(12,0);                  
            lcd.print("H:");
            lcd.setCursor(14,0);                  
            lcd.print(Heure);
            lcd.setCursor(3,1);                  
            lcd.print("J:");
            lcd.setCursor(5,1);                    
            lcd.print(Jour);
            lcd.setCursor(10,1);                    
            lcd.print("Se:");
            lcd.setCursor(13,1);                    
            lcd.print(Semaine);
            delay(1000);
   
        break;

        case 3:   
            lcd.clear();
            lcd.setCursor(0,0);
            lcd.print("Heure:");
            lcd.setCursor(6,0);
            lcd.print(Heure);
            lcd.setCursor(0,1);
            lcd.print("Lumiere/24h:");
            lcd.setCursor(13,1);
            lcd.print(TempsLumiere);
            delay(1000);   
        break;

    }//switch

    if(TauxHumidite >= 850)                                  
    {
        digitalWrite(Relai1, LOW);
    }                            
    else 
    {
        digitalWrite(Relai1, HIGH);
    }                      

    if(TempsLumiere <= Heure)
    {
        digitalWrite(Relai2, HIGH);
    }                              
    else 
    {
        digitalWrite(Relai2, LOW);
    }                        
    
    Seconde++;
    if (Seconde == 60)
    {
        Seconde = 0;
        Minute++;
    }

    if (Minute == 60)
    {
        Minute = 0;
        Heure++;
    }

    if (Heure == 24)
    {
        Heure = 0;
        Jour++;
    }

    if (Jour == 7)
    {
        Jour = 0;
        Semaine++;
    }

    lcd.clear();

}//MenuPrincipal


void SousMenu1()
{
    EtatBoutonSelection = digitalRead(BoutonSelection);      
    EtatBoutonReglage = digitalRead(BoutonReglage);          
    EtatBoutonPlus = digitalRead(BoutonPlus);                
    EtatBoutonMoins = digitalRead(BoutonMoins);              
    
    while(1)
    {
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print("modification");
        delay(500);
        
        EtatBoutonSelection = digitalRead(BoutonSelection);      
        if(EtatBoutonSelection == LOW) 
        {
            return;
 
        }

    }
}

Ok I now understand my mistakes.

Thank you very much for your help.