From 631831fa763d6133c724343bb16a888909db5f85 Mon Sep 17 00:00:00 2001
From: Andrea Manni <andrea@piffa.net>
Date: Mon, 11 Dec 2017 18:16:37 +0100
Subject: [PATCH] PWM Pulse

---
 libraries/common/common.cpp           | 48 ++++++++++++++++++++++++++-
 libraries/common/common.h             |  4 +++
 libraries/common/examples/pwm/pwm.ino |  3 ++
 3 files changed, 54 insertions(+), 1 deletion(-)

diff --git a/libraries/common/common.cpp b/libraries/common/common.cpp
index 4a886b2..1611ec1 100644
--- a/libraries/common/common.cpp
+++ b/libraries/common/common.cpp
@@ -10,7 +10,7 @@
 #include "Arduino.h"
 #include "common.h"
 
-#define DEBUG_not
+#define DEBUG
 
 //////////////////////
 // RGB LED
@@ -210,6 +210,8 @@ Pwm::Pwm(int pin)
     previousMillis = 0;
     byte brightness = 0 ;
     increment = 1;
+    int step = 0;              // Pulse: stato del loop PWM
+    int interval = 1;
 };
 
 void Pwm::Up(long speed, long drift) {
@@ -279,6 +281,50 @@ void Pwm::Set(byte brightness) {
 }
 
 
+void Pwm::Pulse(int interval, int pausa) {
+    // PWM up/down + un ciclo di pausa
+    // Interval e' la pausa tra uno step di 255 e l'altro
+
+    if ((millis() - previousMillis) >= interval) {
+      previousMillis = millis();
+      if (step < 256) { //UP
+        analogWrite(ledPin, lum(step));
+        step++ ;
+      } else if (step < 512 ) { // Down
+        analogWrite(ledPin, lum(511 - step));
+        step++ ;
+      } else if (step < 512 + pausa ){ // Pausa
+        analogWrite(ledPin, lum(0));
+        step++ ;
+      } else if (step >= 512 + pausa) { // Reset 
+      step = 0 ;
+      }
+    }
+} 
+
+void Pwm::RandomPulse(int min , int max, int pausa ) {
+    // PWM up/down + un ciclo di pausa
+    // L'intervallo e' random a ogni nuovo ciclo, 
+    // compreso tra un min - max passato come argomento
+
+    if ((millis() - previousMillis) >= interval) {
+      previousMillis = millis();
+      if (step < 256) { //UP
+        analogWrite(ledPin, lum(step));
+        step++ ;
+      } else if (step < 512 ) { // Down
+        analogWrite(ledPin, lum(511 - step));
+        step++ ;
+      } else if (step < (512 + pausa )){ // Pausa
+        analogWrite(ledPin, lum(0));
+        step++ ;
+      } else if ((step >= 512 + pausa )) {
+      step = 0 ;
+      interval = random(min,max);
+      }
+    }
+} 
+
 void Pwm::lSet(byte brightness) {
     // Imposta il valore del PWM con correzione luminosita' LED
     analogWrite(ledPin, lum(brightness));
diff --git a/libraries/common/common.h b/libraries/common/common.h
index 440abf4..b74ab45 100644
--- a/libraries/common/common.h
+++ b/libraries/common/common.h
@@ -102,6 +102,8 @@ class Pwm {
     int speed ;            // velocita' del ciclo in ms
     unsigned long previousMillis ;  //precedente cambio di stato
     byte increment ;       // aumenta brighteness nel loop UD
+    int step;              // Pulse: stato del loop PWM
+    int interval ;         // Pulse: Intervallo tra step 
 
     // Constructor: come viene instanziato un oggetto facente parte della classe
 public:
@@ -111,6 +113,8 @@ public:
     void Down(long speed, long drift = 0);
     void lDown(long speed, long drift = 0);
     void UD(long speed, long drift = 0);
+    void Pulse(int interval, int pausa = 255);
+    void RandomPulse(int min = 1, int max = 10, int pausa = 255);
     void Set(byte brighteness);
     void lSet(byte brighteness);
     byte brightness  ;      // luminostia' iniziale
diff --git a/libraries/common/examples/pwm/pwm.ino b/libraries/common/examples/pwm/pwm.ino
index cd69bc5..e847775 100644
--- a/libraries/common/examples/pwm/pwm.ino
+++ b/libraries/common/examples/pwm/pwm.ino
@@ -25,6 +25,9 @@ led.Up(2000);     // Aumenta la luminosita' linearmente in 2 sec
 // led.UD(4000);     // Aumenta e poi diminuisce la luminostia' in 4 sec (coseno)
 // Tutti questi metodi accettano un valore opzionale per il ritardo
 
+// led.Pulse(3,512);     // Una pulsazione e una pausa di 512ms
+// led.RandomPulse(1,3); // Pulsazione con intervallo random tra 1-10, cambia ogni ciclo
+// led.RandomPulse(1,3,382); // "" pausa di 382 step tra un ciclo di 255 up + 255 down
 // led.Set(100);   // Imposta il valore del PWM da 0-255
 // led.lSet(100);   // Imposta il valore del PWM con correzione luminosita' 
 // analogWrite(lum100); // Equivalente a sopra
-- 
2.39.2