Aiuto su compilazione Sketch con 2 void loop

Ciao a tutti, innanzi tutto vi chiedo subito scusa se sto usando la sezione sbagliata, vi prego di perdonarmi e/o segnalarmi se faccio errori, ho un problemino con uno sketch.
Ne ho uno già compilato e funzionante, ho realizztao un equalizzatore grafico.
Sono riuscito a metterci un messaggio di benvenuto all'avvio.
Ora vorrei collegarci un LM35 e un pulsante e implementare il mio file INO con un void setup e void loop per poter vedere a display la temperatura e switchare dall'equalizzatore alla temp con il pulsante.
Potete darmi una mano o indicarmi dove documentarmi per riuscire a realizzare la cosa?
non capisco come poter unire il contenuto dei due file INO in mio possesso!

grazie infinite

Non puoi avere 2 programmi, devi "fondere" il codice e mettere tutto quello che hai nei due loop in un unico loop.
Stessa cosa per i due setup()
Bisogna vedere se i due programmi non usano gli stessi pin (per fare cose diverse).
Dovresti postare i due sketch, racchiudendoli negli appositi tag code cosi:
[ code] mio codice [/ code]
senza quegli spazi prima di code, li ho messi per farteli vedere.

Una sola funzione void loop() è permessa, una in più ha come conseguenza un errore in fase di compilazione.
Puoi creare funzioni tue, con nome a piacere che possono essere richiamate da dentro la funzione loop.

Prendi come esempio lo sketch button e fai in modo che alla pressione del tasto si accenda il ledA, e con un seconda pressione si accende il ledB, e premendo nuovamente accende ledA ecc.

Crea due funzioni es: accendiLedA(), accendiLedB(), quando il programma fa quello che ho descritto puoi passare ad unire i due programmi Equalizer e showTemp.

Crei due funzioni runEqualizer() e runTemperature() e userai il programma che ti accendeva i led in base alla pressione del pulsante con la differenza che runEqualizer() fa le veci di accendiLedA() e runTemperature() fa le veci di accendiLedB().

Ci sono esempio di button con debounce, studiali e usali, poi se incontri difficoltà allega i sorgenti.
PS: lo so è una rogna, devi smontare tutto dalla breadboard e collegare il pulsante e i led, se avessi un altro
arduino risparmieresti la fatica.

Ciao.

grazie per le risposte.
logicamente i pin utilizzo gli stessi per lcd hitachi (non ci sono led) e poi per ingresso segnale e sonda utilizzo pin differenti...
questo ci sono arrivato, il problema è come fondere i due setup e i due loop e poi aggiungere le stringhe per i pulsanti.
come faccio a postarvi il contenuto dei due sketch senza andare incontro al regolamento? XD

Andare contro il regolamento ? quale ? la dimensione ?

Compattali in zip e allegali al post, se non basta un post creane due.

PseudoCode:
counterPushButton = 0;
pulsante = leggiPulsante() // restituisce lo stato del pulsante
if (pulsante == High) {
counterPushButton = (counterPushButton + 1) % 2
}
// note: ad ogni ciclo di loop counterPushButton passa da 1 a 0 e viceversa ogni volta
// che il pulsante viene premuto
if (counterPushButton == LOW) // se uguale a zero
runEqualizer();
else // se è diverso da zero, nel caso counterPushButton varrà 1
runTemperature();

Ciao.

Un post mi pare accetti qualche migliaio di caratteri. Se il codice è molto più grande, conviene zipparlo ed allegarlo piuttosto che spezzettarlo su più messaggi, eviti così alla gente di fare il copia-e-incolla nonché eviti di allungare esageratamente la discussione stessa.

questo è il contenuto per l'equalizzatore

#include <LiquidCrystal.h>

// The LCD is conected to pins 13,12,11,10,9,8

LiquidCrystal lcd(12, 11, 7, 6, 3, 2);

byte vumetro[8][8];

float vumetros[16];

// The analog pin 0 is used to read value.
int valor_analogico = 0; 
// The 6 & 7 pins are used for control the integrated.
int strobe = 4; 
int reset = 5; 
int valores_frecuencias[7]; 

void setup() {
  // Built the characters for bars.
  for (int j=0; j<=7; j++)  
  {
    for (int i=0; i<=7; i++)
    {
      if (i<=j)
      { vumetro[j][7-i] = B01110;}
//      { vumetro[j][7-i] = B01010;}  Uncomment this lines for getting other variants for bars.
//      { vumetro[j][7-i] = B11111;}      
      else
      { vumetro[j][7-i] = 0;}
    }
  }  
  for (int i=0; i<=7;i++)
  {
    lcd.createChar(i, vumetro[i]);
  }

  lcd.begin(16, 2);      
  for (int j=0; j<=7;j++)
  {
    lcd.setCursor(j, 0);
    lcd.write(j);
    lcd.setCursor(j, 1);
    lcd.write(7);    
    
  pinMode(valor_analogico, INPUT);
  pinMode(strobe, OUTPUT);
  pinMode(reset, OUTPUT);
  analogReference(DEFAULT);

  digitalWrite(reset, LOW);
  digitalWrite(strobe, HIGH);
    
  }  
 
}

void loop() {
  
  digitalWrite(reset, HIGH);
  digitalWrite(reset, LOW);

  // The read of integrated is done by multiplexing.
  for (int i = 0; i < 7; i++)
  {
    digitalWrite(strobe, LOW);
    delayMicroseconds(5); 
    valores_frecuencias[i] = analogRead(valor_analogico);
    digitalWrite(strobe, HIGH);
  }

// It's necesary to interpolate for calculating 16 bars having only 7 values read.
for (int k=0; k<=15; k++)
  {
  switch (k) 
  {
    case 0:
      vumetros[k]= valores_frecuencias[0]/64;
      break;
    
    case 1:
      vumetros[k]= (valores_frecuencias[0]/64 + valores_frecuencias[1]/64)/2;
      break;

    case 2:
      vumetros[k]= valores_frecuencias[1]/64;
      break;
   
    case 3:
      vumetros[k]= (valores_frecuencias[1]/64 + valores_frecuencias[2]/64)/2;
      break;
 
    case 4:
      vumetros[k]= valores_frecuencias[2]/64;
      break;
    
    case 5:
      vumetros[k]= (valores_frecuencias[1]/64 + valores_frecuencias[2]/64 + valores_frecuencias[3]/64)/3;
      break;
        
    case 6:
      vumetros[k]= (valores_frecuencias[2]/64 + valores_frecuencias[3]/64 + valores_frecuencias[4]/64)/3;
      break;

    case 7:
      vumetros[k]= random(2)+valores_frecuencias[3]/64;
      break;
      

    case 8:
      vumetros[k]= random(2)+valores_frecuencias[3]/64;
      break;

    case 9:
      vumetros[k]= (valores_frecuencias[2]/64 + valores_frecuencias[3]/64 + valores_frecuencias[4]/64)/3;
      break;

    case 10:
      vumetros[k]= (valores_frecuencias[3]/64 + valores_frecuencias[4]/64 + valores_frecuencias[5]/64)/3;
      break;

    case 11:
      vumetros[k]= valores_frecuencias[4]/64;
      break;

    case 12:
      vumetros[k]= (valores_frecuencias[4]/64 + valores_frecuencias[5]/64)/2;
      break;

    case 13:
      vumetros[k]= valores_frecuencias[5]/64;
      break;

    case 14:
      vumetros[k]= (valores_frecuencias[5]/64 + valores_frecuencias[6]/64)/2;
      break;

    case 15:
      vumetros[k]= valores_frecuencias[6]/64;
      break;
  }

  Dibuja_vumetro(k, vumetros[k]);
  delay(2);
  }
  
}

void Dibuja_vumetro(int posicion, int altura)
{
  if (altura>7)
  {
    lcd.setCursor(posicion, 1);
    lcd.write(7);
    lcd.setCursor(posicion, 0);
    lcd.write(altura-8);    
  }
  else
  {
    lcd.setCursor(posicion, 1);
    lcd.write(altura);
    lcd.setCursor(posicion, 0);
    lcd.write(32);    
  }
}

questo lo sketch per il termometro

#include <LiquidCrystal.h> 
#define pin_temp A2 //Pin di collegamento del piedino Vout del sensore di temperatura
double temp = 0; //Variabile in cui verrà memorizzata la temperatura rilevata
int i = 0; //Variabile contatore per il ciclo for
LiquidCrystal lcd(12, 11, 7, 6, 3, 2); //Inizializzazione della libreria con i pin del display LCD
void setup()
{
  lcd.begin(16, 2); //Impostazione del numero di colonne e righe del display LCD 
  lcd.setCursor(0,0); //Sposto il cursore sulla prima riga (riga 0) e sulla prima colonna
  lcd.print("Temperatura:"); //Stampo il messaggio 'Temperatura:' sulla prima riga
  analogReference(INTERNAL);
}
void loop()
{
    for(i=0; i<5; i++) //Esegue l'istruzione successiva 5 volte
    temp += (analogRead(pin_temp)  / 9.31); //Calcola la temperatura e la somma alla variabile 'temp'
  
  temp = temp/5; //Calcola la media matematica dei  valori di temperatura

  lcd.setCursor(0,1); //Sposto il cursore sulla prima colonna e sulla seconda riga
  lcd.print(temp); //Stampo sul display LCD la temperatura
  lcd.print(" °C"); //Stampo uno spazio e il carattere 'C' sul display  
  delay(1000); //Ritardo di un secondo (può essere modificato)
}

Per la zona variabili globali:

#include <LiquidCrystal.h>

#define pin_temp A2 //Pin di collegamento del piedino Vout del sensore di temperatura

LiquidCrystal lcd(12, 11, 7, 6, 3, 2); //Inizializzazione della libreria con i pin del display LCD

double temp = 0; //Variabile in cui verrà memorizzata la temperatura rilevata
int i = 0; //Variabile contatore per il ciclo for
byte vumetro[8][8];
float vumetros[16];
int valor_analogico = 0;  // The analog pin 0 is used to read value.
int strobe = 4;  // The 6 & 7 pins are used for control the integrated.
int reset = 5; 
int valores_frecuencias[7];

Per la setup(), rinomina la setup() dove c'e' scritto "Built the characters for bars" con un nome proprio, elimini la lcd.begin
e nella setup() al fondo richiami questa nuova funzione:

void setup()
{ lcd.begin(16, 2); //Impostazione del numero di colonne e righe del display LCD 
  lcd.setCursor(0,0); //Sposto il cursore sulla prima riga (riga 0) e sulla prima colonna
  lcd.print("Temperatura:"); //Stampo il messaggio 'Temperatura:' sulla prima riga
  analogReference(INTERNAL);
  BuiltBars();
}

void BuiltBars() {
  // Built the characters for bars.
  for (int j=0; j<=7; j++)  
  { for (int i=0; i<=7; i++)
    { if (i<=j)
      { vumetro[j][7-i] = B01110;
//      { vumetro[j][7-i] = B01010;  Uncomment this lines for getting other variants for bars.
//      { vumetro[j][7-i] = B11111;      
      } else
      { vumetro[j][7-i] = 0;
      }
    }
  }  
  for (int i=0; i<=7;i++)
  { lcd.createChar(i, vumetro[i]);
  }
  for (int j=0; j<=7;j++)
  { lcd.setCursor(j, 0);
    lcd.write(j);
    lcd.setCursor(j, 1);
    lcd.write(7);    
    pinMode(valor_analogico, INPUT);
    pinMode(strobe, OUTPUT);
    pinMode(reset, OUTPUT);
    analogReference(DEFAULT);
    digitalWrite(reset, LOW);
    digitalWrite(strobe, HIGH);
  }  
}

Per le due loop() tutto è più complicato.
Conviene che rinomini le due loop con due nomi scelti da te esempio loopA() e loopB() e ti crei un unico loop che le richiama.

void loop()
{ loopA();
  loopB();
}

Ma una delle due loop(), ha un delay(1000) che è bloccante, subito prima della stampa del "°C".
Quella delay deve essere sostituita con l'uso della millis() ovvero devi togliere quel delay(1000) ed eseguire la loopA (supponiamo che sia in questa) solo ogni 1 secondo usando la tecnica della millis()

void loopA()
{ for(i=0; i<5; i++) //Esegue l'istruzione successiva 5 volte
  { temp = temp + ( analogRead(pin_temp)/ 9.31); //Calcola la temperatura e la somma alla variabile 'temp'
  }
  temp = temp/5; //Calcola la media matematica dei  valori di temperatura
  lcd.setCursor(0,1); //Sposto il cursore sulla prima colonna e sulla seconda riga
  lcd.print(temp); //Stampo sul display LCD la temperatura
  lcd.print(" °C"); //Stampo uno spazio e il carattere 'C' sul display  
  // delay(1000); //Ritardo di un secondo (può essere modificato)
}  

void loopB() {
  digitalWrite(reset, HIGH);
  digitalWrite(reset, LOW);
  // The read of integrated is done by multiplexing.
  for (int i = 0; i < 7; i++)
  { 
    digitalWrite(strobe, LOW);
    delayMicroseconds(5); 
    valores_frecuencias[i] = analogRead(valor_analogico);
    digitalWrite(strobe, HIGH);
  }
  // It's necesary to interpolate for calculating 16 bars having only 7 values read.
  for (int k=0; k<=15; k++)
  { switch (k) 
    { case 0: 
        vumetros[k]= valores_frecuencias[0]/64; 
        break;  
      case 1: 
        vumetros[k]= (valores_frecuencias[0]/64 + valores_frecuencias[1]/64)/2;
        break;
      case 2: 
        vumetros[k]= valores_frecuencias[1]/64;
        break;
      case 3:
        vumetros[k]= (valores_frecuencias[1]/64 + valores_frecuencias[2]/64)/2;
        break;
      case 4:
        vumetros[k]= valores_frecuencias[2]/64;
        break;
      case 5:
        vumetros[k]= (valores_frecuencias[1]/64 + valores_frecuencias[2]/64 + valores_frecuencias[3]/64)/3;
        break;
      case 6:
        vumetros[k]= (valores_frecuencias[2]/64 + valores_frecuencias[3]/64 + valores_frecuencias[4]/64)/3;
        break;
      case 7:
        vumetros[k]= random(2)+valores_frecuencias[3]/64;
        break;
      case 8:
        vumetros[k]= random(2)+valores_frecuencias[3]/64;
        break;
      case 9:
        vumetros[k]= (valores_frecuencias[2]/64 + valores_frecuencias[3]/64 + valores_frecuencias[4]/64)/3;
        break;
      case 10:
        vumetros[k]= (valores_frecuencias[3]/64 + valores_frecuencias[4]/64 + valores_frecuencias[5]/64)/3;
        break;
      case 11:
        vumetros[k]= valores_frecuencias[4]/64;
        break;
      case 12:
        vumetros[k]= (valores_frecuencias[4]/64 + valores_frecuencias[5]/64)/2;
        break;
      case 13:
        vumetros[k]= valores_frecuencias[5]/64;
        break;
      case 14:
        vumetros[k]= (valores_frecuencias[5]/64 + valores_frecuencias[6]/64)/2;
        break;
      case 15:
        vumetros[k]= valores_frecuencias[6]/64;
        break;
    }
    Dibuja_vumetro(k, vumetros[k]);
    delay(2);
  }
}

void Dibuja_vumetro(int posicion, int altura)
{ if (altura>7)
  { lcd.setCursor(posicion, 1);
    lcd.write(7);
    lcd.setCursor(posicion, 0);
    lcd.write(altura-8);    
  }
  else
  { lcd.setCursor(posicion, 1);
    lcd.write(altura);
    lcd.setCursor(posicion, 0);
    lcd.write(32);    
  }
}

Per il loop perciò integriamo esempio da BlinkWithoutDelay() che usa la millis:

unsigned long precMillis = 0;  // aggiungerle tra le variabili globali
const long intervallo = 1000;          // ogni secondo = 1000 millesimi

void loop()
{ unsigned long currMillis = millis();            // 
  if( currMillis - precMillis > intervallo )  
  { precMillis = currMillis;        // save the last time 
    loopA();         // eseguita ogni intervallo di tempo
  }
  loopB();
}

P.S. Non ho provato nulla, tutto da verificare !!!

Voleva fare lo switch fra i due loop con un pulsante, quindi credo sia necessario mettere una variabile di stato e poi richiamare loopA o loopB secondo il valore della variabile, che cambia premendo il pulsante.

Ok, @Paulus ha ragione. Non avevo letto bene del pulsante.

@smemail dovresti fare uno sketch che quando premi un tasto varia una variabile di stato (tra due soli stati) ed a seconda dello stato accende un led oppure un altro. Fatto questo allora puoi mettere tutto insieme ed invece di accendere tra due led, richiami loopA oppure loopB

Scusate se mi introduco, ma penso di a vere un problema simile (avrei bisogno di 2 loop)
mi spiego: avrei bisogno di un ciclo "lento" che venga eseguito ogni 10 minuti (datalogger)
un ciclo che azioni dei relè a seconda dello stato di alcuni ingressi(ciclo veloce circa 3 secondi)
lo sketch è praticamente fatto, ma il ciclo lento mi rallenta quello veloce, cioè al variare degli ingressi, i relè si attivano con un ritardo eccessivo. Come potrei risolvere il problema?
Grazie a chi vorrà aiutarmi

Se pubblichi il codice, potremo analizzarlo e darti i giusti consigli.

Ecco il codice

int time2_ore= 22;
int time2_min = 30;
int buttonState = 0;         // variable for reading the pushbutton status
int regdicaricaState = 1;         // variable for reading the reg di carica status
int button2State = 2;  
int pin=6;

#include <DHT11.h>
#include <Wire.h>
#include "RTClib.h"
#include <SD.h>
DHT11 dht11(pin); 

#define readButton 5
#define CS 10
#define oninverter 8
#define outinverter 9
#define regdicarica 3 
#define buttonOn 2
#define buttonOff 4

RTC_DS1307 RTC;
char buffer[42];
 
File myFile;
 
void setup () {
    Serial.begin(57600);
    Serial.print("Initializing SD card...");
    pinMode(CS, OUTPUT);
    pinMode(readButton, INPUT);
    pinMode(outinverter, OUTPUT);
    pinMode(buttonOn, INPUT);
    pinMode(regdicarica, INPUT);
    pinMode(buttonOff, INPUT);
    
    if (!SD.begin(CS)) {
      Serial.println("initialization failed!");
      return;
    }
    Serial.println("initialization done.");
 
    Wire.begin();
    RTC.begin();
    RTC.sqw(1);     //0 Led off - 1 Freq 1Hz - 2 Freq 4096kHz - 3 Freq 8192kHz - 4 Freq 32768kHz
    if (! RTC.isrunning()) {
      Serial.println("RTC is NOT running!");
      // following line sets the RTC to the date & time this sketch was compiled
      RTC.adjust(DateTime(__DATE__, __TIME__));
    }
}
 
void loop () {
    { 
    DateTime now = RTC.now();
    int err;
    float temp, humi;
    if((err=dht11.read(humi, temp))==0)
    {    
      
      Serial.print(temp);
      Serial.print(" ");
      Serial.print(humi);
      Serial.println();
    }
  else
   {
     Serial.println();
     Serial.print("Error No :");
     Serial.print(err);
     Serial.println();    
   }
    sprintf(buffer,  "%02d/%02d/%d %02d:%02d:%02d %d %d ", now.day(), now.month(), now.year(), now.hour(), now.minute(), now.second(), analogRead( A0 ), analogRead( A1 ));
    Serial.print( buffer );
 
    myFile = SD.open("dati.log", FILE_WRITE);
    if (myFile) {
      myFile.println(buffer);
      myFile.close();
    } else {
      Serial.println("error opening dati.log");
    }
 
    if ( digitalRead( readButton ) == HIGH ) {
        Serial.println(" ");
        Serial.println("Lettura Log Salvato ----------- ");
        Serial.println(" ");
        myFile = SD.open("dati.log");
        if (myFile) {
          Serial.write(myFile.read());
          }
          myFile.close();
        }
        delay( 5000 );
    }   
          
    delay(20000);
  }
  { DateTime now = RTC.now();
    // read the state of the pushbutton value:
    buttonState = digitalRead(buttonOn);
    button2State = digitalRead(buttonOff);
    // read the state of the reg di carica value:
    regdicaricaState = digitalRead(regdicarica);
          
    if((buttonState == LOW || regdicaricaState == LOW)&&(button2State == HIGH)){
        digitalWrite(oninverter, HIGH);
        delay(1500);  
        digitalWrite(outinverter, HIGH); 
    }    
    if(((now.hour()>= time2_ore && now.minute()>= time2_min)||(button2State == LOW)|| regdicaricaState == HIGH)&&(buttonState == HIGH)){
        digitalWrite(outinverter, LOW);
        delay(1000);  
        digitalWrite(oninverter, LOW);
    } 
    
    delay(500);
    }
}

il delay 20000 è provvisorio perché deve essere aumentato a circa 10 minuti

Devi studiarti lo sketch di esempio blink without delay dove viene mostrato come eseguire del codice
ad intervalli di tempo senza blocca l'esecuzione dell'intero programma.

Fai degli esperimenti con quell'esempio fino a capirlo, poi ti verrà semplice applicarlo a qualunque tuo programma e non farai più uso di delay() se non per introdurre piccoli ritardi di pochi millesimi di secondo.

Ciao.

ragazzi buondi!!!!
ieri pomeriggio ho letto i messaggi al volo, questa mattina ho impacchetto questo sketch e provero!
SI ho bisogno di un pulsante che switchi tra i due loop a questo punto?? ad ogni pressione dovrebbe cambiare lo stato stato da spectrum a termometro.
per il pulsante i codici non li avevo inseriti perche era un altra di quelle cose che non sapevo in quale punto inserire.... il pin di ingresso del pulsante deve essere su porta digitale o su porta analogica?
ad occhio ho visto il tutto, ora devo scervellarmi su come aggiungere questa cosa del pulsante.....
secondo voi è piu facile che ad ogni pressione passi da loopA a loopB oppure che sia di default loopB e alla pressione del tasto passa a loopA per un tot di secondi??
Il delay(1000) era inserito nello sketch originale ma se da fastidio si puo togliere!

grazie molte comunque gia mi avete un po illuminato... prima ero nel panico

ho provato lo sketch e verificato non mi da errori.... ora mi manca il pulsante, un ultimo aiutino per aggiungere anche questo..... :slight_smile:

I pulsanti lo puoi leggere sia con l'ingresso analogico che digitale, inoltre gli ingressi analogici (A0...A5) li puoi usare anche come digitali. Basta usare, ad esempio, digitalRead(A3).
Per il loro utilizzo puoi guardare gli esempi dell'IDE
--> http://arduino.cc/en/Tutorial/Button
--> http://arduino.cc/en/Tutorial/Debounce
--> http://arduino.cc/en/Tutorial/ButtonStateChange
--> http://arduino.cc/en/Tutorial/InputPullupSerial

Per il pulsante... occorre riflettere su un paio di aspetti.
Devi poter premere il pulsante in qualsiasi momento ed ottenere il cambio della variabile di stato e qualche feedback che ti dice che il sistema ha capito che lo hai premuto ed effettua il cambio visualizzazione subito o quasi subito.
Questo lo puoi ottenere con un interrupt oppure facendo la verifica pressione pulsante almeno 5 volte al secondo.
Però... ci sono i rimbalzi del contatto che fanno sì che quella che a te sembra una pressione venga vista dal sistema come una successione di diverse pressioni, inoltre facendo la verifica pressione 5 volte al secondo (almeno) il sistema vedrà una pressione prolungata come una successione di pressioni.
Come risolvere?
In due modi.
Primo modo: metti due pulsanti, uno per visualizzare una schermata, l'altro per visualizzare l'altra schermata.
Così facendo, alla pressione del pulsante 1 la variabile di stato viene impostata su schermata1 ed il sistema mostrerà la schermata1 anche se la tua singola pressione viene rilevata come una successione di pressioni. La stessa cosa col pulsante2.
Secondo modo: volendo usare un solo pulsante, ti serve un efficace antirimbalzo che può essere sia hardware che software e qualche piccolo accorgimento per dire al sistema che tante pressioni consecutive in realtà rappresentano una sola pressione.
Io risolvo mettendo un buzzer, quando premo il pulsante, il buzzer mi emette un bip accompagnato da un piccolo delay e questo mi dà sia il feedback che ho premuto (appena senti il bip, spontaneamente rilasci il pulsante sicuro che il tuo input sia stato ricevuto, altrimenti tendi a tenerlo premuto fino a vedere un certo risultato ma a quel punto facilmente questo sarà visto come una seconda pressione) e funge anche da antirimbalzo.
Metti quindi queste verifiche pulsante in modo che vengano eseguite almeno 5 volte al secondo, in caso di pressione pulsante setta la variabile di stato della schermata ed un'altra variabile che ti dice di terminare la schermata corrente e tornare al loop principale, rimanda ad una funzione che ti fa beep e piccolo delay ed al rientro torni al loop. A questo punto il loop legge la variabile di stato e ti manda alla funzione corrispondente all'altra schermata. Anche nella funzione dell'altra schermata hai la verifica pressione pulsante e così...
Ovviamente se usi gli interrupt puoi evitare quella verifica 5 volte al secondo (almeno).