Uscire forzatamente da un menu.

Buon giorno a tutti,mi sto imbattendo in un problema che concettualmente è facile, ma di difficile realizzazione.
Sto sviluppando un progettino che comprende un menu principale e tanti sottomenu dove vado a regolare diversi parametri;il mio problema è che non essendo arduino real-time, se sono all'interno del menù non posso eseguire il loop principale. Ho guardato un po' in rete ed esistono delle librerie che simulano il real time, praticamente (se non ho letto male) saltano ad intervalli fissi da una "situazione" all'altra, ma lo ritengo un po' troppo difficile per il mio livello.
Pensavo di agire così:quando entro nel menù faccio partire un timer che si incrementa, ogni volta che viene modificato un parametro (quindi è premuto un pulsante) si resetta; se il timer raggiunge i 5minuti fa uscire forzatamente dal menu e si posiziona nel loop qualunque cosa stesse facendo.
E' realizzabile? Come posso fare?
Nel mio sketch già uso il timer2 settato ad 1mS.
Grazie.

ciao manolomao,

un po' poche come informazioni...parli di menu...su che display/interfaccia?...e cosa intendi per:

il mio problema è che non essendo arduino real-time, se sono all'interno del menù non posso eseguire il loop principale

come hai gestito la navigazione tra i menù? usi while()?usi altre condizioni per abilitare/disabilitare parti cospicue di codice?
magari se alleghi lo sketch andiamo meglio...

Non è semplice da spiegare, ma se devi fare dei menu a più livelli li devi gestire implementando una macchina a stati finiti (cerca in rete ci sono varie librerie) e quindi almeno una variabile che indichi quale sia lo stato corrente, e quale evento fa cambiare lo stato.
Per come la vedo io, qualsiasi altra soluzione diventa un pastrocchio di codice che alla fine ti si ingarbuglia fra le dita :slight_smile:

Orso2001 l'interfaccia non è importante, comunque è un LCD 20*4 e sdi la navigazione tra i vari menù è fatta con dei while, altrimenti diventava molto complicato (o per lo meno al mio livello di pogrammazione)
DocDoc molto interessante, ed è quello che immaginavo...pensavo anche di generare un interrupt dopo i 5 minuti, ma certamente mi serve qualcosa che sappia dove sono e dove devo andare a finire...
Puoi darmi qualche link da visionare??
Grazie

Beh ci sono in rete vari esempi e librerie come questi:

http://playground.arduino.cc/Code/FiniteStateMachine
http://www.lucadentella.it/2013/04/30/macchina-a-stati-finiti-e-arduino/

Però a suo tempo per gestire un robot mi feci una mia libreria, te la allego qui, vedi tu se ti può essere utile (spero di aver preso lo ZIP giusto con l’ultima versione, eventualmente se dovessi avere problemi a compilare fammelo sapere, magari poi apriamo un thread apposito).

Ma prima devi definire la tua “macchina a stati finiti”: disegnati sulla carta gli stati come dei cerchi (assegnagli un nome), e le transizioni possibili con delle frecce (su ognuna scrivi la “condizione” ad esempio “rilevato ostacolo a meno di 50cm” oppure “trascorsi 5 minuti”). Quando l’avrai fatta e verificata dal punto di vista logico, prova ad implementarla con la mia libreria, per la quale posso darti una mano ovviamente.

FiniteState.zip (6.62 KB)

ciao manolomao,

bhe l’interfaccia può essere un “problema”…se non opportunamente gestita per il tipo (protocollo) di scambio dati utilizzato…mica esistono solo gli LCD con interfaccia I2c o con i PIN “diretti”…puoi avere interfacce connesse in RS485, TCP…modbus, profibus, devicenet altro…detto questo, come immaginavo, usi dei while()…mentre come detto da docdoc, se la gestisci con concetto “macchina a stati finiti” potresti risolvere…ovvio che molto probabilmente sarà necessaria una grossa rivisitata del tuo sketch…ma meglio farlo adesso e prendere “pratica” con questo concetto che ti tornerà molto utile.

Grazie ragazzi,molto interessante la librearia...
La prendero a mano, per ora finisco il mio progetto così e poi ci guardo; la mia era un opzione al progetto, ma ho fretta di terminarlo...
Docdoc, grazie della disponibilità, ti contatterò sicuramente...
A presto.