From ae89c245050fa3a4ced19f8e7ea2aa5c1ba2a4a2 Mon Sep 17 00:00:00 2001 From: Andrea Manni Date: Wed, 1 Mar 2017 10:42:30 +0100 Subject: [PATCH] FSM blinks --- .../state_machine/blink_1/blink_1.ino | 45 ++++++++ .../blink_2_trans/blink_2_trans.ino | 106 ++++++++++++++++++ .../blink_1_variabili/blink_1_variabili.ino | 14 +-- libraries/common/common.cpp | 2 +- 4 files changed, 154 insertions(+), 13 deletions(-) create mode 100644 advanced_projects/state_machine/blink_1/blink_1.ino create mode 100644 advanced_projects/state_machine/blink_2_trans/blink_2_trans.ino diff --git a/advanced_projects/state_machine/blink_1/blink_1.ino b/advanced_projects/state_machine/blink_1/blink_1.ino new file mode 100644 index 0000000..8f1f3be --- /dev/null +++ b/advanced_projects/state_machine/blink_1/blink_1.ino @@ -0,0 +1,45 @@ +/* + 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; + } +} diff --git a/advanced_projects/state_machine/blink_2_trans/blink_2_trans.ino b/advanced_projects/state_machine/blink_2_trans/blink_2_trans.ino new file mode 100644 index 0000000..9a4fa75 --- /dev/null +++ b/advanced_projects/state_machine/blink_2_trans/blink_2_trans.ino @@ -0,0 +1,106 @@ +/* + 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 +*/ diff --git a/basic/blinks/blink_1_variabili/blink_1_variabili.ino b/basic/blinks/blink_1_variabili/blink_1_variabili.ino index 9a4ed5b..4da85f6 100644 --- a/basic/blinks/blink_1_variabili/blink_1_variabili.ino +++ b/basic/blinks/blink_1_variabili/blink_1_variabili.ino @@ -27,20 +27,10 @@ void setup() { // 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 diff --git a/libraries/common/common.cpp b/libraries/common/common.cpp index e696ff4..e99f202 100644 --- a/libraries/common/common.cpp +++ b/libraries/common/common.cpp @@ -417,7 +417,7 @@ int calibraTrim(int pin, const byte ledPin) { Serial.println(middle / 10 + 10); Serial.flush() ; #endif - return(middle / 10 + 10) ; + return(middle / 10 ) ; // END calibrazione }; -- 2.39.2