3 * Oggetti di uso comune
10 //////////////////////
14 RGBLed::RGBLed(byte pinR, byte pinG, byte pinB) {
15 // Per un common catodo, valore max / min invertiti
21 // Equvalente del Setup() per inizializzare i PIN
22 pinMode(redPin, OUTPUT);
23 pinMode(greenPin, OUTPUT);
24 pinMode(greenPin, OUTPUT);
27 RGBLed::RGBLed(byte pinR, byte pinG, byte pinB, byte com) {
28 // Per un common anode, valore max / min normali
34 // Equvalente del Setup() per inizializzare i PIN
35 pinMode(redPin, OUTPUT);
36 pinMode(greenPin, OUTPUT);
37 pinMode(greenPin, OUTPUT);
40 void RGBLed::SetColor (byte r, byte g, byte b) {
41 // Imposta il colore di un LED RGB
42 analogWrite(redPin, common - r);
43 analogWrite(greenPin, common - g);
44 analogWrite(bluePin, common - b);
48 // Accende il LED di rosso
52 void RGBLed::Green () {
53 // Accende il LED di verde
57 void RGBLed::Blue () {
58 // Accende il LED di blu
62 void RGBLed::Magenta () {
63 // Accende il LED di magenta
67 void RGBLed::Cyano () {
68 // Accende il LED di Cyano
72 void RGBLed::Yellow () {
73 // Accende il LED di giallo
77 void RGBLed::White () {
84 SetColor(255,255,255);
89 /////////////////////////////////////
92 Lampeggiatore::Lampeggiatore(int pin)
95 pinMode(ledPin, OUTPUT);
101 // Una funzione facente parte di una classe prende il nome di "metodo" della stessa:
102 void Lampeggiatore::Invert() {
103 // Inverte il lampeggio
107 void Lampeggiatore::Blink() {
108 // Illumina il led a 500ms
110 if(millis() - previousMillis > interval) {
111 // save the last time you blinked the LED
112 previousMillis = millis();
114 // if the LED is off turn it on and vice-versa:
115 ledState = !ledState ; // Inverti il LED
117 // set the LED with the ledState of the variable:
118 digitalWrite(ledPin, ledState);
121 void Lampeggiatore::Blink(long time) {
122 // Illumina il led secondo un intervallo passato come argomento
124 if(millis() - previousMillis > time) {
125 // save the last time you blinked the LED
126 previousMillis = millis();
128 // if the LED is off turn it on and vice-versa:
129 ledState = !ledState ; // Inverti il LED
131 // set the LED with the ledState of the variable:
132 digitalWrite(ledPin, ledState);
135 void Lampeggiatore::Blink(long up, long down) {
136 // Illumina il ledB precisando ontime e downtime
138 if((ledState == HIGH)&& (millis() - previousMillis > up)) {
139 // save the last time you blinked the LED
140 previousMillis = millis();
143 else if((ledState == LOW)&& (millis() - previousMillis > down)) {
144 previousMillis = millis();
148 // set the LED with the ledState of the variable:
149 digitalWrite(ledPin, ledState);
152 void Lampeggiatore::High() {
155 digitalWrite(ledPin, HIGH);
158 void Lampeggiatore::Low() {
161 digitalWrite(ledPin, LOW);
164 void Lampeggiatore::Swap() {
165 // Inverte lo stato del LED
167 digitalWrite(ledPin, !digitalRead(ledPin));
170 /////////////////////////////////////
174 // Gestione del PWM utilizzando millis
175 // per non bloccare il processore con delay
176 // Warning: serialWrite puo' interferire con i tempi.
179 pinMode(ledPin, OUTPUT);
181 byte brightness = 0 ;
185 void Pwm::Up(long speed) {
186 // Aumenta linearmente la luminosita' usanndo millis()
187 // quindi senza bloccare il processore
188 // Viene usato un float, in alternativa un coseno
190 if (millis() != previousMillis) { // si potrebbe togliere
191 brightness = 255.0 /(float)speed * millis() ;
192 analogWrite(ledPin, brightness);
194 previousMillis = millis();
198 void Pwm::lUp(long speed) {
199 // Aumenta usanndo millis() con correzione luminosita' LED
200 // quindi senza bloccare il processore
201 // Viene usato un float, in alternativa un coseno
203 if (millis() != previousMillis) { // si potrebbe togliere
204 brightness = 255.0 /(float)speed * millis() ;
205 analogWrite(ledPin, lum(brightness));
207 previousMillis = millis();
211 void Pwm::Down(long speed ) {
212 // Riduce linearmente la luminosita' usanndo millis()
213 // quindi senza bloccare il processore
215 if (millis() != previousMillis) {
216 brightness = 255 - 255.0 /(float)speed * millis() ;
217 analogWrite(ledPin, brightness);
219 previousMillis = millis();
223 void Pwm::lDown(long speed ) {
224 // Riduce usanndo millis() con correzione della luminosita'
225 // quindi senza bloccare il processore
227 if (millis() != previousMillis) {
228 brightness = 255 - 255.0 /(float)speed * millis() ;
229 analogWrite(ledPin, lum(brightness));
231 previousMillis = millis();
235 void Pwm::UD(long speed ) {
236 // Aumenta e riduce in sequenza la luminosita' usanndo millis()
237 brightness = 128 + 127 * cos(2 * PI / speed * millis());
238 analogWrite(ledPin, brightness);
241 void Pwm::Set(byte brightness) {
242 // Imposta il valore del PWM
243 analogWrite(ledPin, brightness);
247 void Pwm::lSet(byte brightness) {
248 // Imposta il valore del PWM
249 analogWrite(ledPin, lum(brightness));
253 /////////////////////////////////////
256 Sequenza::Sequenza (byte passed[], byte dim) {
259 for (int thisPin = 0; thisPin < size; thisPin++) {
260 pinMode(ledPins[thisPin], OUTPUT);
262 previousMillis = millis();
263 digitalWrite(ledPins[0], HIGH);
266 void Sequenza::Update(long value) {
267 // Incrementa dal primo all'ultimo valore dell'array
269 if (millis() - previousMillis >= interval) {
270 previousMillis = millis();
272 if ( i < size - 1 ) {
273 // Spegni precedente led
274 digitalWrite(ledPins[i], LOW);
276 // Accendi successivo led
277 digitalWrite(ledPins[++i], HIGH);
280 else if (i == size - 1 ) {
283 previousMillis = millis();
284 digitalWrite(ledPins[i], HIGH);
285 digitalWrite(ledPins[ size - 1 ], LOW);
291 void Sequenza::Reverse(long value) {
293 if (millis() - previousMillis >= interval) {
294 previousMillis = millis();
296 if (i == 0) { // Entry point, ultimo LED
297 digitalWrite(ledPins[size -1],HIGH);
298 digitalWrite(ledPins[0],LOW);
302 digitalWrite(ledPins[i],LOW);
303 digitalWrite(ledPins[--i],HIGH);
308 void Sequenza::UD(long value) {
310 if (millis() - previousMillis >= interval) {
311 previousMillis = millis();
312 // Spegni precedente led
313 digitalWrite(ledPins[i], LOW);
315 // Accendi successivo led
316 digitalWrite(ledPins[i], HIGH);
318 if (i == 0 || i == size -1) {
329 void brilla(byte pin, int velocita ) { // Defalt value di velocita' solo nell'Header
330 // Accende e spegne il LED accetando un argomento
331 // per impostare la velocita'.
333 pinMode(pin, OUTPUT);
334 // sequenze di istruzione: accendere e spegnere il LED
335 digitalWrite(pin, HIGH); // turn the LED on (HIGH is the voltage level)
336 delay(velocita); // wait for a second
337 digitalWrite(pin, LOW); // turn the LED off by making the voltage LOW
338 delay(velocita); // wait for a second
343 // Mappatura dell'intervallo 0-255 con correzione di luminosita.
345 return pgm_read_byte_near(BCORRECT + val);