]> git.piffa.net Git - sketchbook_andrea/blob - multitasking/millis/loop_array_millis_obj/loop_array_millis_obj.ino
Sequenza con millis
[sketchbook_andrea] / multitasking / millis / loop_array_millis_obj / loop_array_millis_obj.ino
1 /*
2   For Loop with millis()
3
4 Blink di un array di led in sucessione,
5 utilizzando millis() per non blocking.
6 L'array puo' contenere un numero arbitrario di led
7 (l'ordine in cui compaiono e' l'ordine in cui brillano).
8
9 OOP version.
10
11  Schemi:
12  - http://lab.piffa.net/schemi/8_led_single_res_bb.png
13  - http://lab.piffa.net/schemi/8_led_single_res_schem.png
14
15  http://www.arduino.cc/en/Tutorial/ForLoop
16  */
17
18
19 class Sequenza {
20     // Lampeggia LED in sequenza utilizzando millis()
21     unsigned long previousMillis ;
22     byte i = 0;
23     byte *ledPins;
24     byte size;
25     int inc = 1;
26     long interval;
27
28   public:
29     Sequenza (byte passed[], byte dim) {
30       ledPins = passed ;
31       size = dim ;
32       for (int thisPin = 0; thisPin < size; thisPin++) {
33         pinMode(ledPins[thisPin], OUTPUT);
34       }
35       previousMillis = millis();
36       digitalWrite(ledPins[0], HIGH);
37     }
38
39     void Update(long value) {
40       interval = value;
41       if (millis() - previousMillis >= interval) {
42         previousMillis = millis();
43
44         if ( i < size - 1 ) {
45           // Spegni precedente led
46           digitalWrite(ledPins[i], LOW);
47
48           // Accendi successivo led
49           digitalWrite(ledPins[++i], HIGH);
50         }
51
52         else if  (i == size - 1 )   {
53           // Ultimo caso
54           i = 0;
55           previousMillis = millis();
56           digitalWrite(ledPins[i], HIGH);
57           digitalWrite(ledPins[ size - 1 ], LOW);
58         }
59       }
60     }
61
62
63     void Reverse(long value) {
64       interval = value;
65       if (millis() - previousMillis >= interval) {
66         previousMillis = millis();
67
68         if  (i == 0)   { // Entry point, ultimo LED
69           digitalWrite(ledPins[size - 1], HIGH);
70           digitalWrite(ledPins[0], LOW);
71           i = size - 1 ;
72         }
73         else {
74           digitalWrite(ledPins[i], LOW);
75           digitalWrite(ledPins[--i], HIGH);
76         }
77       }
78     }
79
80     void UD(long value) {
81       interval = value;
82       if (millis() - previousMillis >= interval) {
83         previousMillis = millis();
84         // Spegni precedente led
85         digitalWrite(ledPins[i], LOW);
86         i = i + inc ;
87         // Accendi successivo led
88         digitalWrite(ledPins[i], HIGH);
89
90         if (i == 0 || i == size - 1) {
91           inc = -inc ;
92         }
93       }
94     }
95
96 };
97
98
99
100 void setup() {
101 };
102
103 byte pins[] = {
104   2, 3, 4, 5, 6, 7
105 };
106
107 Sequenza seq = Sequenza(pins, sizeof(pins));
108
109
110 void loop() {
111   seq.UD(200);
112 };
113
114
115