Interrompere funzione IF durante il suo svolgimento

Ciao a tutti,

Avrei un problema che non riesco a risolvere nemmeno ricercando in rete o in vari forum.

Avrei la necessità di interrompere una funzione IF (comandata da un tasto di un telecomando IR) che contiene una serie abbastanza lunga di tone che vanno a creare una canzone: durante lo svolgersi della canzone avrei però necessità di interrompere il comando IF che ha fatto partire la canzone per poter far partire un altro IF (attivato da un tasto diverso del telcomando IR) che mi attivi un noTone sul pin dove stava andando la canzone, oppure attivare semplicemente qualcos'altro.

Grazie a tutti per l'attenzione!

Buona sera,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink:

davideerio97:
Avrei la necessità di interrompere una funzione IF

Siccome il non vedere neppure il più piccolo esempio di quello che hai fatto scoraggia il 99% delle possibili risposte, la risposta breve è: no, non puoi interrompere l'esecuzione di un ramo if, la logica va riprogettata in altro modo per permettere l'esecuzione di più compiti in parallelo (tipicamente macchine a stati, ma per programmi semplicissimi può bastare anche solo aggiungere un controllo continuo per la terminazione all'interno del ramo, dico semplicissimi perché se poi si vuole fare una sola altra modifica si è nelle peste).

Non esiste una funzione "if". if é una struttura di controllo.
Se dopo il if metti codice bloccante non é colpa del if.

Facci vedere lo sketch che hai scritto.
Ciao Uwe

Macchina a stati finiti può sembrare qualcosa di complesso ma in realtà nel tuo caso è una cosa molto semplice :slight_smile:

Una istruzione if viene eseguita se la condizione è vera, tu vuoi che al verificarsi di un if gli altri non vengano più eseguiti! Cosa dovrai fare ? Al verificarsi della condizione del tuo if, renderai false le condizioni degli altri if :slight_smile:

Esempio

 int stato=0;


 void loop(){

     if (stato==0){
  
         suona

     }else if(stato==1){


    }

     if(mioComando==MioCodice){


         stato=1; //La condizione del primo if diventa falsa e non verrà più eseguito


     }else if(mioComando==SecondoCodice){

          stato=0; //il primo if è abilitato.

     }

}// End loop

Tu hai posto un quesito sulla struttura if, e io ti ho postato esempi su if.Ma una macchina a stati può essere implementata in maniera più elegante con uno switch()

Link

Intanto se esegui istruzioni di lunga durata, è difficile che possa interromperle, perchè nel frattempo non sarai in grado di recepire nessun cambiamento di stato.

Per interrompere un blocco if al verificarsi di un evento, l'unica cosa da fare è verificare la condizione di uscita ad ogni istruzione (o almeno ogni qualvolta potrebbe aver senso farla..) tenendo presente che più frequentemente viene effettuato il test più "istantanea" apparirà l'interruzione.

Poi.. "Condizione d'uscita" si fa per dire perchè in realtà sarà una condizione che bypassa le istruzioni dal momento in cui si verifica l'evento il poi. In pratica il codice sarà una cosa del genere:

if (condizione)
{
    if (!uscita)
        faiQualcosa();

    if (!uscita)
        tone();

    if (!uscita)
        tone();

    if (!uscita)
        tone();

    :
    :
}

Si può forse migliorare qualcosa ma il succo è quello..