Eseguire un programma a seconda di quale pulsante viene premuto

Salve arduiniani, ho un problema con il progetto da portare alla maturità. Non sono un esperto di programmazione, perdonatemi se sto per dire castronerie.
In poche parole ho due programmi separati che fino ad un certo punto fanno le medesime cose, ma uno esegue un paio di funzioni in più rispetto all’altro e ha diciture diverse per i dati da mostrare sul monitor seriale.

L’idea è quella di creare uno sketch principale con un loop che se rileva un segnale in ingresso dal bottone A esegue il programma A, stessa cosa con il bottone B e il relativo programma. Dite che è fattibile? I due programmi collegati ai bottoni dovrebbero essere completi, quindi setup, loop e quant’altro

Tuttavia una volta premuto il pulsante A, dovrebbe continuare ad eseguire il programma A fino alla pressione dell’altro tasto.
Quindi suppongo che dobrebbe comunque eseguire ad ogni ciclo lo sketch principale, ma memorizzando l’ultimo tasto premuto e continuare così ad eseguire il programma associato.

Mi affido a voi, se non è chiaro vi prego di scusarmi

Un solo setup() , un solo loop() e tutti i quant'altro che vuoi

Non sono un programmatore, ma il programma puo essere uno solo ... pero' puoi usare una flag (una qualsiasi variabile di stato), ed un ciclo if ... lo stato della variabile lo cambi con i pulsanti (quando premi uno lo metti TRUE e quando premi l'altro lo metti FALSE, ad esempio), e poi con l'if se e' TRUE fai una cosa e se e' FALSE ne fai un'altra ... detta proprio semplice ...

Ciao, è una cosa perfettamente fattibile con uso di semplici funzioni.

La funzione setup() e loop() sono semplici funzioni, che vengono richiamate quando si avvia arduino.

A seconda di quello che vuoi fare, ti crei una funzione dove inserirai anche il codice che vorresti mettere nel setup() e poi ti crei un loop infinito o finito, a seconda che tu voglia o no terminare il programma in base a qualche condizione.

Vedere è più esplicativo che leggere parole, per cui un esempio...

void setup(){


}


void loop(){

        if(digitalRead(primoPulsante)==HIGH){

               PrimoProgramma();

        }
        else if(digitalRead(secondoPulsante)==HIGH){

               SecondoProgramma();
        }


}


void PrimoProgramma(){

        /* setup nella funzione */
        pinMode(..........);
        pinMode(..........);
        pinMode(..........);
        

        while(1){ // equivale alla funzione loop();

             Tuo programma....

       }

}

void SecondoProgramma(){

        /* setup nella funzione */
        pinMode(..........);
        pinMode(..........);
        pinMode(..........);
        

        while(1){ // equivale alla funzione loop();

             Tuo programma....

       }

}


/* Se hai invece l'intenzione di terminare il while() cioè l'equivalente al loop() function, dovrai mettere
    una condizione al posto di uno, magari la pressione di un tasto, esempio per terminare il programma  while(digitalRead(pulsanteUscita)!=HIGH)

[u]Se[/u] le due setup() però sono uguali, non conviene "risimulare" il concetto di while(1) infinito di Arduino per i due programmi, con dentro ognuno la setup().

torn24:
… per cui un esempio…

Pero’ lui ha anche detto:

… una volta premuto il pulsante A, dovrebbe continuare ad eseguire il programma A fino alla pressione dell’altro tasto. …

il tuo esempio funziona solo se il pulsante viene mantenuto premuto … quindi comunque serve almeno una flag … tipo ad esempio (pseudocodice) :

... //resto del programma
if (digitalRead(pulsante1) == HIGH{
   flag_1 = HIGH;}
else if (digitalRead(pulsante2) == HIGH{
   flag_1 = LOW;}
... 
if (flag_1 == HIGH){
   ...
   ... //blocco di istruzioni
   ... //che compongono
   ... //il programma 1
   ... }
else {
   ...
   ... //blocco di istruzioni
   ... //che compongono
   ... //il programma 2
   ... }
... //resto del programma

Poi il resto dipende da cosa altro dovra’ fare tutto il programma, ovviamente :wink:

l tuo esempio funziona solo se il pulsante viene mantenuto premuto ... quindi comunque serve almeno una flag ... tipo ad esempio (pseudocodice) :

Mi sa che non hai capito il codice :)

while(digitalRead(pulsanteUscita)!=HIGH)

I pulsanti possono essere in pullup o pulldown, io ho pensato che il pulsante è premuto quando ha valore HIGH, di conseguenza esegue fino a quando non viene premuto il pulsante. Se invece si vuole usare la resistenza INPUT_PULLUP, allora la condizione diventa

while(digitalRead(pulsanteUscita)!=LOW)

Se invece si vuole fare terminare quando si preme il pulsante B, allora diventa

while(digitalRead(pulsanteB)!=LOW) //INPUT_PULLUP

Se invece si vuole eseguire prima uno e poi l'altro programma, allora la soluzione di un flap nel loop() ,potrebbe starci, MA IO NON CAPISCO TUTTE QUESTE COSE DAL SUO POST :grin: :grin:

Vi ringrazio per le risposte, alla fine onde evitare rompicapi ho steso un solo programma lavorando con un interruttore e qualche if.

Grazie ancora, le vostre sono comunque informazioni utili. Saluti