codice da eseguire una sola volta in loop

buongiorno, vi spiego brevemente il mio progetto: sostanzialmente uno schermo da mettere in una piccola console in macchina per tenere sotto controllo alcuni valori: pressione turbo, volt batteria, temperatura gas di scarico etc etc. vi allego il codice in divenire, ora mi è sorto un problema… vorrei che il buzzer passivo emettesse un tono ogni qual volta si prema il tasto per cambiare schermata. Per ora ho ovviato per un ciclo while che lo fa suonare mentre viene premuto, io invece avrei preferito che in ogni sezione vi fosse un tono personalizzato. Includendo il codice in ogni sezione il tono viene ovviamente eseguito per tutto il tempo di visualizzazione della schermata. Come potrei ovviare a questo problema? cioè far eseguire parte del codice loop una sola volta?

#include <LiquidCrystal.h>
 
int buttonpin= 52; //pin del pulsante
int stato=0; // stato iniziale del pin
int p=0; //numeratore che inizia da 0
int buzzer = 9; //pin del cicalino
int n= 6; // numero di funzioni dopo il quale azzera il contatore
String intestazione1 =("NISSAN");
String intestazione2 =("Patrol  GR");
String primafunzione =("P  TURBO");
String secondafunzione =("T. Gas Scarico");
String terzafunzione= ("Volt Batteria");
String quartafunzione= ("T. raffreddamento");
String quintafunzione= ("BLOCCO ANT");
String sestafunzione= ("BLOCCO POST");
int t = 200; // ritardo di lettura dati

LiquidCrystal lcd(12,11,5,4,3,2); 

void setup() {
pinMode(buttonpin, INPUT);
pinMode(buzzer, INPUT);
Serial.begin (9600);
lcd.begin (16,2);
}

void loop() {
stato= digitalRead (buttonpin);
while (digitalRead (buttonpin)== HIGH){
   tone(buzzer, 8000,30);
   delay(100);
    noTone(buzzer);
   
  }
if (stato==HIGH)
{p++;
}

Serial.print("p");
Serial.println(p);
Serial.print("stato");
Serial.println (stato);

if(p >n){
  p=0;}
 
if (p==0){
  
    lcd.clear();
    lcd.setCursor(5,0);
    lcd.print(intestazione1);
    lcd.setCursor(3,1);
    lcd.print(intestazione2);
    delay(t);  
    
   
    ;
  };
  if (p==1){
    lcd.clear();
    lcd.setCursor(4,0);
    lcd.print(primafunzione);
    delay(t);
  ;};
  if (p==2) {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print(secondafunzione);
    delay(t);
  ;};
  if (p==3) {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print(terzafunzione);
    delay(t);
  ;};if (p==4) {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print(quartafunzione);
    delay(t);
  ;};if (p==5) {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print(quintafunzione);
    delay(t);
  ;};if (p==6) {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print(sestafunzione);
    delay(t);
  ;};


}

Ciao! Premetto che il tuo codice è un po confuso, dovresti utilizzare "else if()" o uno "switch()".

Comunque penso che nel tuo caso specifico potresti risolvere con una variabile flag, una variabile che assume due valori.

1)Alla pressione del pulsante per selezionare la schermata, la variabile flag diviene true o 1
2)Entro nell'if della mia schermata e faccio un controllo, se flag==1 suono e poi metto flag=0

In questo modo il suono viene ripetuto un unica volta all'entrata della schermata.

ESEMPIO:

byte flag=0; // Variabile globale dichiarata fuori da tutte le funzioni
void loop() {
    stato= digitalRead (buttonpin);

    if (stato==HIGH) // Se è stato premuto il pulsante
    {    p++;
          flag=1; // Attivo il suono
    }

    Serial.print("p");
    Serial.println(p);
    Serial.print("stato");
    Serial.println (stato);

    if(p >n){
       p=0;}
 
     if (p==0){
    
          if(flag==1){
     
             flag=0; // In questo modo if() viene eseguito un unica volta alla pressione del pulsante
             tone(buzzer, 8000,1000); // Emetto suono per un unica volta per un secondo
         }
         lcd.clear();
         lcd.setCursor(5,0);
         lcd.print(intestazione1);
         lcd.setCursor(3,1);
         lcd.print(intestazione2);
         delay(t); 
   
   
    
      };

Appena posso provo, non mi era venuta pensata una tale soluzione.
Il codice è moolto confuso, ho cominciato a programmare da 3 giorni!

Perché non provi a scrivere in I.D.L.(*) cosa deve fare il programma PRIMA di scrivere la prima istruzione in C++?

Ad esempio una cosa così (se ho capito che vuoi fare E NON HO FATTO ERRORI GROSSOLANI)

Nel setup
PONI p = 0
PONI giafatto = false
PONI ancorapremuto = false
PONI durata = ???

Nel loop
SE pulsante premuto E ancorapremuto = false
  MEMORIZZA tempo    //DEVI USARE millis()
  INIZIA beep
  P = P+1
  SE P+1 = 6
    P = 0
  giafatto = false
  ancorapremuto = true
ELSE
  ancorapremuto = false
SE tempo trascorso    //DEVI USARE millis()
  FERMA beep
SE P = 0 E giafatto = false
  AZZERA LCD
  LCD50 = intestazione1
  LCD31 = intestazione2
  giafatto = true
SE P = 1 E giafatto = false
  AZZERA LCD
  LCD40 = primafunzione
  giafatto = true
SE P = 2 E giafatto = false
  AZZERA LCD
  LCD00 = secondafunzione
  giafatto = true
SE P = 3 E giafatto = false
  AZZERA LCD
  LCD00 = terzafunzione
  giafatto = true
SE P = 4 E giafatto = false
  AZZERA LCD
  LCD00 = quartafunzione
  giafatto = true
SE P = 5 E giafatto = false
  AZZERA LCD
  LCD00 = quintafunzione
  giafatto = true
SE P = 6 E giafatto = false
  AZZERA LCD
  LCD00 = sestafunzione
  giafatto = true

Ciao,
P.

(*) I.D.L. = Italian Description Language