]> git.piffa.net Git - sketchbook_andrea/commitdiff
Sequenza con millis
authoreaman <andrea@piffa.net>
Wed, 25 Jan 2017 21:06:17 +0000 (22:06 +0100)
committereaman <andrea@piffa.net>
Wed, 25 Jan 2017 21:06:17 +0000 (22:06 +0100)
libraries/common/common.cpp
libraries/common/common.h
libraries/common/examples/sequenza/sequenza.ino [new file with mode: 0644]
multitasking/millis/loop_array_millis_obj/loop_array_millis_obj.ino

index 3fd82db3cb2c0a1a418e2469e8fa2ffaa87c40fb..cbf8fdd569db6eed18eb9971f5835a56020891f9 100644 (file)
@@ -83,9 +83,6 @@ Lampeggiatore::Lampeggiatore(int pin)
     interval = 500;
 };
 
-
-
-
 // Una funzione facente parte di una classe prende il nome di "metodo" della stessa:
 void Lampeggiatore::Invert() {
     // Inverte il lampeggio
@@ -184,6 +181,77 @@ void Pwm::UD(long speed ) {
 }
 
 
+/////////////////////////////////////
+// Sequenza
+// Constructor
+Sequenza::Sequenza (byte passed[], byte dim) {
+    ledPins = passed ;
+    size = dim ;
+    for (int thisPin = 0; thisPin < size; thisPin++) {
+        pinMode(ledPins[thisPin], OUTPUT);
+    }
+    previousMillis = millis();
+    digitalWrite(ledPins[0], HIGH);
+}
+
+void Sequenza::Update(long value) {
+    // Incrementa dal primo all'ultimo valore dell'array
+    interval = value;
+    if (millis() - previousMillis >= interval) {
+        previousMillis = millis();
+
+        if ( i < size - 1 ) {
+            // Spegni precedente led
+            digitalWrite(ledPins[i], LOW);
+
+            // Accendi successivo led
+            digitalWrite(ledPins[++i], HIGH);
+        }
+
+        else if  (i == size - 1 )   {
+            // Ultimo caso
+            i = 0;
+            previousMillis = millis();
+            digitalWrite(ledPins[i], HIGH);
+            digitalWrite(ledPins[ size - 1 ], LOW);
+        }
+    }
+}
+
+
+void Sequenza::Reverse(long value) {
+    interval = value;
+    if (millis() - previousMillis >= interval) {
+        previousMillis = millis();
+
+        if  (i == 0)   { // Entry point, ultimo LED
+            digitalWrite(ledPins[size -1],HIGH);
+            digitalWrite(ledPins[0],LOW);
+            i = size -1 ;
+        }
+        else {
+            digitalWrite(ledPins[i],LOW);
+            digitalWrite(ledPins[--i],HIGH);
+        }
+    }
+}
+
+void Sequenza::UD(long value) {
+    interval = value;
+    if (millis() - previousMillis >= interval) {
+        previousMillis = millis();
+        // Spegni precedente led
+        digitalWrite(ledPins[i], LOW);
+        i = i + inc ;
+        // Accendi successivo led
+        digitalWrite(ledPins[i], HIGH);
+
+        if (i == 0 || i == size -1) {
+            inc = -inc ;
+        }
+    }
+}
+
 
 //////////////////
 // Funzioni
index c5ad5d567c7301082c6b374721bcea1313c49dc0..f5a763c715938b7d87c870729009d3780b81fcbf 100644 (file)
@@ -100,6 +100,40 @@ public:
     byte brightness  ;      // luminostia' iniziale
 };
 
+
+
+////////////////////////////
+class Sequenza {
+    // Lampeggia LED in sequenza utilizzando millis()
+    unsigned long previousMillis ;
+    byte i = 0;
+    byte *ledPins;
+    byte size;
+    int inc = 1;
+    long interval;
+    
+  public:
+    Sequenza (byte passed[], byte dim) ; // Array contentente i PINS, dimensioni array
+    void Update(long value) ;  // Accende in sequenza
+    void Reverse(long value) ; // Invertita
+    void UD(long value) ; // Up & Down
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
 //////////////////////
 // Funzioni
 
diff --git a/libraries/common/examples/sequenza/sequenza.ino b/libraries/common/examples/sequenza/sequenza.ino
new file mode 100644 (file)
index 0000000..bb9b46b
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+  For Loop with millis()
+
+Blink di un array di led in sucessione,
+utilizzando millis() per non blocking.
+L'array puo' contenere un numero arbitrario di led
+(l'ordine in cui compaiono e' l'ordine in cui brillano).
+
+OOP version.
+
+ Schemi:
+ - http://lab.piffa.net/schemi/8_led_single_res_bb.png
+ - http://lab.piffa.net/schemi/8_led_single_res_schem.png
+
+ http://www.arduino.cc/en/Tutorial/ForLoop
+ */
+#include <common.h>
+void setup() {
+};
+
+byte pins[] = {  // PIN dei LED che compongono la sequenza
+  2, 3, 4, 5, 6, 7
+}; 
+Sequenza seq = Sequenza(pins,sizeof(pins)); // Array dei PINs, quanti elementi compongono l'array
+
+void loop() {
+  seq.Update(200); // Passa al segmento suciessivo ogni 200ms
+};
+
+
+
index 10301ca801d276363c824382051144f870a83bd3..a103c1b14d3651dd6dbf9e27a0ef422facfbc76f 100644 (file)
@@ -22,12 +22,13 @@ class Sequenza {
     byte i = 0;
     byte *ledPins;
     byte size;
+    int inc = 1;
     long interval;
-    
+
   public:
     Sequenza (byte passed[], byte dim) {
-       ledPins = passed ;
-       size = dim ;
+      ledPins = passed ;
+      size = dim ;
       for (int thisPin = 0; thisPin < size; thisPin++) {
         pinMode(ledPins[thisPin], OUTPUT);
       }
@@ -57,24 +58,57 @@ class Sequenza {
         }
       }
     }
+
+
+    void Reverse(long value) {
+      interval = value;
+      if (millis() - previousMillis >= interval) {
+        previousMillis = millis();
+
+        if  (i == 0)   { // Entry point, ultimo LED
+          digitalWrite(ledPins[size - 1], HIGH);
+          digitalWrite(ledPins[0], LOW);
+          i = size - 1 ;
+        }
+        else {
+          digitalWrite(ledPins[i], LOW);
+          digitalWrite(ledPins[--i], HIGH);
+        }
+      }
+    }
+
+    void UD(long value) {
+      interval = value;
+      if (millis() - previousMillis >= interval) {
+        previousMillis = millis();
+        // Spegni precedente led
+        digitalWrite(ledPins[i], LOW);
+        i = i + inc ;
+        // Accendi successivo led
+        digitalWrite(ledPins[i], HIGH);
+
+        if (i == 0 || i == size - 1) {
+          inc = -inc ;
+        }
+      }
+    }
+
 };
 
 
 
 void setup() {
-  Serial.begin(9600);
-  //Serial.print(seq.ledPins);
 };
 
-byte pins[] = {  
+byte pins[] = {
   2, 3, 4, 5, 6, 7
-}; 
+};
 
-Sequenza seq = Sequenza(pins,sizeof(pins));
+Sequenza seq = Sequenza(pins, sizeof(pins));
 
 
 void loop() {
-  seq.Update(200);
+  seq.UD(200);
 };