]> git.piffa.net Git - sketchbook_andrea/blob - multitasking/BlinkWithoutDelay_5_cleanup/BlinkWithoutDelay_5_cleanup.ino
Clean up multitasking, bottoni con pooling e interrupts
[sketchbook_andrea] / multitasking / BlinkWithoutDelay_5_cleanup / BlinkWithoutDelay_5_cleanup.ino
1 /* Blink without Delay - Pulizia
2
3 Semplificato il ciclo condizionale, la seconda funzione non necessita
4 di una variabile di stato per tracciare il LED.
5
6  */
7
8 // constants won't change. Used here to 
9 // set pin numbers:
10
11 // First LED
12 const int ledA =  13;      // the number of the LED pin
13 // Variables will change:
14 int ledStateA = LOW;             // ledState used to set the LED
15 long previousMillisA = 0;        // will store last time LED was updated
16
17 // Second LED data
18 const int ledB = 12; //Secondo LED
19 // int ledStateB = LOW;             // Possiamo leggere lo stato del registro del LED
20                                     // con digitalRead()
21 unsigned long previousMillisB = 0;  // millis() ritorna sempre un unsigned long
22
23 void setup() {
24   // set the digital pin as output:
25   pinMode(ledA, OUTPUT);      
26   pinMode(ledB, OUTPUT);  
27 }
28
29 void loop()
30 {
31   lightLedA(1000);
32   lightLedB(500);
33 }
34
35 ////////////////
36 // Funzioni
37
38 void lightLedA (int interval) {
39   // Illumina il ledA secondo un intervallo passato come argomento
40
41   if (millis() >= previousMillisA + interval) {
42     // save the last time you blinked the LED 
43     previousMillisA += interval;
44
45     // if the LED is off turn it on and vice-versa:
46     ledStateA = !ledStateA ; // Inverti il LED
47   }
48   digitalWrite(ledA, ledStateA);
49 }
50
51 void lightLedB (int interval) {
52   // Illumina il ledB secondo un intervallo passato come argomento
53
54   if (millis() - previousMillisB >= interval) {   
55     previousMillisB += interval;
56   digitalWrite(ledB, !digitalRead(ledB));
57   // Leggiamo direttamente il registro di ledB e scriviamo il suo opposto,
58   // questo ci permette di non dover avere una variabile per tracciare lo stato.
59   }
60 }
61 /* Domande:
62  1. E' possibile avere una sola funzione che permetta di gestire 
63     qualunque LED io voglia aggiungere?
64
65 .
66 .
67 .
68 .
69 .
70 .
71 .
72 .
73 .
74 .
75 .
76 .
77   Risposte:
78
79   1. Allo stato attuale la funzione lightLed deve avere una variabile univoca
80      previousMillis per ogni LED che gestisce. Servirebbe un costrutto che permetta
81      di raggruppare le proprieta' di ogni LED (es. struct) da associare poi alla
82      unziona che aggiorna il LED.
83
84      Ancora meglio un costrutto (oggetto) che associ sia le proprita' che le azioni
85      in un unico oggetto.
86          
87     
88 /* Ulteriori approfondimenti
89  - integrazione tra funzioni e dati: programmazione a oggetti
90  - Uso di pointers per modificare dati esterni allo scope della funzione, static
91  - Uso di forme di dati strutturate (array, struct) per scambiare dati tra funzioni e programma
92  */
93
94
95
96
97
98
99
100
101
102
103