Macchina a stati con Arduino

Salve a tutti,
avrei bisogno di un aiutino per capire come funziona una macchina a stati e su come strutturare il codice...perchè sia implementato per essere una macchina a stati...ho cercato un pò su intenet ( nelle pagine in ita) ma oltre alla teoria completa :fearful: :fearful: non ho trovato nulla (esempi di codice per capire la struttura) per arduino....
Chi vuol essere così gentile da condividere la propria conoscenza?!
Ciao
A.

--> http://www.lucadentella.it/2013/04/30/macchina-a-stati-finiti-e-arduino/
--> Finite State Machine Using Switch Statement. - Programming Questions - Arduino Forum
--> Arduino Playground - FiniteStateMachine Library
--> Arduino Playground - QP-nano framework

Non c'è una struttura specifica per Arduino, la macchina a stati può essere implementata in modi molto diversi.
Una istruzione switch case con n case può essere già una macchina a stati.
Se consideriamo 2 stati e ci interessano anche le transizioni, in totale abbiamo 3 case per ogni stato quindi 6 case in totale. Le transizioni sono Entra in, è in, esce da, cioè :

#define STATE_ACCOUNT_ENTER   0
#define STATE_ACCOUNT_IN    1
#define STATE_ACCOUNT_EXIT   2
switch (state) {
    case STATE_ACCOUNT_ENTER:
        // qui il tuo codice
        state = STATE_ACCOUNT_IN;
        break;
    case STATE_ACCOUNT_IN:
       // qui il tuo codice
       state = STATE_ACCOUNT_EXIT ;
       break;
    case STATE_ACCOUNT_EXIT
       // qui il tuo codice, if, chiamate a funzione ecc
       // state = ??? al posto dei ??? ci scrivi quello che deve essere il prossimo stato 
       break;
}

Ciao.

MauroTec:
Non c'è una struttura specifica per Arduino, la macchina a stati può essere implementata in modi molto diversi.
Una istruzione switch case con n case può essere già una macchina a stati.
Se consideriamo 2 stati e ci interessano anche le transizioni, in totale abbiamo 3 case per ogni stato quindi 6 case in totale. Le transizioni sono Entra in, è in, esce da, cioè :

Ciao.

Grazie per l'esempio.
Sai dove posso trovare una spiegazione lite per capire come si crea una macchina a stati...voglio dire, per capire la logica che ci sta dietro. Ad esempio non avevo idea che si dovessero tenere in onsiderazione le transizioni. Ho trovato un sacco di teoria in internet...ma la affrontano un pò troppo amplamente...

Grazie ancora
A.

Sai dove posso trovare una spiegazione lite per capire come si crea una macchina a stati...voglio dire, per capire la logica che ci sta dietro.

No, no so, comunque è il metodo peggiore per comprendere le macchine a stati, l'unico modo che conosco per apprenderle e studiare un poco di teoria e poi usare uno switch case e da questo passare ad altri modi per creare gli stati ed eseguirli.

La logica viene dallo studio della teoria, però sono cosciente che c'è teoria e teoria, cioè ho letto libri di teoria dove sembra che l'obbiettivo non sia la macchina a stati ma la matematica, per cui prova qualche altro libro, magari consultando i preview di google book.

Le transizioni non sono obbligatorie e in base allo stato e secondo necessità dell'applicazione e volontà del programmatore si può fare a meno di una o tutte le transizioni. Inoltre considera anche che potresti volere che uno stato venga eseguito solo se la storia degli state è una o più storie. Cioè chiamando lo stato che che verrà eseguito solo in base ad una storia RUN_IF_STORY_STATE, quando viene eseguito il case RUN_IF_STORY_STATE_ENTER valuti con delle if o altri switch case se si è arrivati ad eseguire questo stato di ingresso provenendo da una sequenza di stati precedenti, cioè prima di RUN_IF_STORY_STATE_ENTER lo stato corrente era ACCOUNT_FAILED_EXIT e prima di questo era lo stato era ACCOUNT_LOCKED e prima ancora ecc.

Alle volte è necessario e facilmente implementabile mantenere la storia, altre volte non è necessario, o non è facilmente implementabile e bisogna cercare un altro modo. Quasi sempre serve sapere lo stato precedente a quello che si sta eseguendo quindi la funzione (o macro) che cambia stato prima di cambiarlo memorizza la stato corrente nella variabile oldState e poi imposta la variabile currentState al nuovo valore, in questo modo puoi fare un controllo del tipo if (oldState==ACCOUNT_SUCCESFULL). che vuol dire che si sta eseguendo un stato provenendo da uno stato che ha acconsentito a creare un account con successo.

Credimi non si nasce con la capacità innata di comprendere le macchine a stati, per cui ho affrontato il tuo stesso
problema e il senso di smarrimento nel non riuscire ad immaginare il funzionamento della macchina a stati e ancor di più nel non riuscire a capire quali stati usare e se usare le transizioni ecc.

Già quello switch case di esempio se lo completi con una variabile che mantiene il vecchio stato può essere usata
per la maggior parte delle necessità, non è elegante, non è facilmente leggibile ecc specie quando il numero di stati diventa importante, oddio "importante", anche con solo 20 case il codice appare confuso e poco mantenibile.

Ciao.