--- /dev/null
+/*
+ Blink FSM
+
+ Accensione e spegnimanto di un LED utilizzando
+ una FSM 2 stati statici.
+
+Costrutto switch basato su uno struct.
+
+ */
+
+// Dichiarazione variabili
+int led = 13;
+int pausa = 500; // Variabile richiambile nel corso dell'esecuzione
+
+void setup() {
+ // Inizializziamo il PIN 13 come OUTPUT
+ pinMode(led, OUTPUT);
+}
+
+enum fsm_stati { // Stati della FMS
+ on,
+ off
+};
+
+fsm_stati stato;
+
+void loop() {
+ switch (stato){
+ case on :
+ // Machine: operazioni svolte
+ digitalWrite(led, HIGH); // Mette il PIN del LED in stato acceso
+ delay(pausa); // Aspetta un secondo (mille millisecondi)
+
+ // State: gestione degli stati
+ stato = off ; // Setta il prossimo state
+ break;
+
+ case off:
+ digitalWrite(led, LOW); // Mette il PIN del LED in stato spento
+ delay(pausa); // Aspetta mezzo secondo
+
+ stato = on ;
+ break;
+ }
+}
--- /dev/null
+/*
+ Blink FSM
+
+ Accensione e spegnimanto di un LED utilizzando
+ una FSM con 4 stati, statici e di transizione.
+
+Costrutto switch basato su uno struct.
+
+ */
+
+// Dichiarazione variabili
+int led = 11; // PWM
+int pausa = 1000; // Variabile richiambile nel corso dell'esecuzione
+byte lum = 0 ;
+
+void setup() {
+ // Inizializziamo il PIN 13 come OUTPUT
+ pinMode(led, OUTPUT);
+}
+
+enum fsm_stati { // Stati della FMS
+ on, // Statico
+ to_off, // Transizione
+ off,
+ to_on
+};
+
+fsm_stati stato ;
+
+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;
+ }
+}
+
+/* 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
+*/
// loop: Le istruzioni vengono eseguite all'infinito
void loop() {
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
- delay(breve +40); // wait for a second
+ delay(breve ); // wait for a second
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
- delay(breve +40); // wait for a second
+ delay(breve ); // wait for a second
- digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
- delay(breve); // wait for a second
- digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
- delay(breve); // wait for a second
-
- digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
- delay(breve -40)
- ; // wait for a second
- digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
- delay(breve -40); // wait for a second
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
delay(lunga); // wait for a second
Serial.println(middle / 10 + 10);
Serial.flush() ;
#endif
- return(middle / 10 + 10) ;
+ return(middle / 10 ) ;
// END calibrazione
};