/* Blink FSM Accensione e spegnimanto di un LED utilizzando una FSM con 4 stati, statici e di transizione. Costrutto switch basato su un enum: */ // Dichiarazione variabili int led = 11; // PWM int pausa = 1000; // Variabile richiambile nel corso dell'esecuzione byte lum = 255 ; void setup() { // Inizializziamo il PIN 13 come OUTPUT pinMode(led, OUTPUT); } enum fsm_stati: byte { // Stati della FMS, explicit type cast on, // Statico to_off, // Transizione off, to_on } stato ; // denominazione di una variabile void loop() { switch (stato) { case on : // Operativa: Machine digitalWrite(led, HIGH); // Mette il PIN del LED in stato acceso delay(pausa); // Stati stato = to_off ; // Setta il prossimo state // lum = 255; break; case to_off : while (lum > 0) { lum-- ; analogWrite(led, lum); // Mette il PIN del LED in stato acceso delay(1); } stato = off ; // Setta il prossimo state break; case off: digitalWrite(led, LOW); // Mette il PIN del LED in stato spento delay(pausa); stato = to_on ; // lum = 0; break; case to_on : while (lum < 255) { lum++ ; analogWrite(led, lum); // Mette il PIN del LED in stato acceso delay(1); } stato = on ; // Setta il prossimo state break; default: // Opzionale, quando non si verificano altre condizioni break; } } /* Domande: 1.Cosa comporta l'uso della funzione delay? 2.Come si puo' modificare lo sketch per poter eseguire piu' conpiti contemporaneamente? Esercizi successivi: - Creare una FSM con un LED RGB avente due stati Red e Green, una transizione yellow tra i due. - Creare una FSM in cui il passaggio di stato e' causato da un evento esterno, es la pressione di un bottone. - Creare una FSM per la gestione di un semaforo (esempio disponibile in sketchbook_andrea/advanced_projects/state_machine ) . . . . . . . . . . . . . . . . . . . . Soluzioni: 1.Delay rende il codice blocking, null'altro puo' essere eseguito durante i delay 2.Si potrebbe utilizzare millis(), vedi esercizi multitasking oppure: https://www.sparkfun.com/news/1801 */