]> git.piffa.net Git - sketchbook_andrea/commitdiff
FSM blinks
authorAndrea Manni <andrea@piffa.net>
Wed, 1 Mar 2017 09:42:30 +0000 (10:42 +0100)
committerAndrea Manni <andrea@piffa.net>
Wed, 1 Mar 2017 09:42:30 +0000 (10:42 +0100)
advanced_projects/state_machine/blink_1/blink_1.ino [new file with mode: 0644]
advanced_projects/state_machine/blink_2_trans/blink_2_trans.ino [new file with mode: 0644]
basic/blinks/blink_1_variabili/blink_1_variabili.ino
libraries/common/common.cpp

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 (file)
index 0000000..8f1f3be
--- /dev/null
@@ -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 (file)
index 0000000..9a4fa75
--- /dev/null
@@ -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
+*/
index 9a4ed5bf17d8ea6ba18415453a039d2322f2a6b6..4da85f6a43bd3aef8ec9e4fc1d76aa0ca3cfdef5 100644 (file)
@@ -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
index e696ff4321e279a9cfd7bc98e632980c78e7c21b..e99f202804a45134155d354388719b26f8b1d0de 100644 (file)
@@ -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
 };