3 * Oggetti di uso comune
6 * Link: http://git.andreamanni.com/
15 //////////////////////
19 RGBLed::RGBLed(byte pinR, byte pinG, byte pinB) {
20 // Per un common catodo, valore max / min invertiti
26 // Equvalente del Setup() per inizializzare i PIN
27 pinMode(redPin, OUTPUT);
28 pinMode(greenPin, OUTPUT);
29 pinMode(greenPin, OUTPUT);
32 RGBLed::RGBLed(byte pinR, byte pinG, byte pinB, byte com) {
33 // Per un common anode, valore max / min normali
39 // Equvalente del Setup() per inizializzare i PIN
40 pinMode(redPin, OUTPUT);
41 pinMode(greenPin, OUTPUT);
42 pinMode(greenPin, OUTPUT);
45 void RGBLed::SetColor (byte r, byte g, byte b) {
46 // Imposta il colore di un LED RGB
47 analogWrite(redPin, common - r);
48 analogWrite(greenPin, common - g);
49 analogWrite(bluePin, common - b);
53 Serial.print(common - r);
55 Serial.print(common - g);
57 Serial.print(common - b);
63 void RGBLed::Rand () {
64 // Imposta il colore di un LED RGB
65 analogWrite(redPin, random(0,256));
66 analogWrite(greenPin, random(0,256));
67 analogWrite(bluePin, random(0,256));
71 // Accende il LED di rosso
75 void RGBLed::Green () {
76 // Accende il LED di verde
80 void RGBLed::Blue () {
81 // Accende il LED di blu
85 void RGBLed::Magenta () {
86 // Accende il LED di magenta
90 void RGBLed::Cyano () {
91 // Accende il LED di Cyano
95 void RGBLed::Yellow () {
96 // Accende il LED di giallo
100 void RGBLed::White () {
102 SetColor(255,255,255);
105 void RGBLed::Off () {
112 /////////////////////////////////////
115 Lampeggiatore::Lampeggiatore(int pin)
118 pinMode(ledPin, OUTPUT);
124 // Una funzione facente parte di una classe prende il nome di "metodo" della stessa:
125 void Lampeggiatore::Invert() {
126 // Inverte il lampeggio
130 void Lampeggiatore::Blink() {
131 // Illumina il led a 500ms
133 if(millis() + shift - previousMillis > interval) {
135 // if the LED is off turn it on and vice-versa:
136 ledState = !ledState ; // Inverti il LED
137 // set the LED with the ledState of the variable:
138 digitalWrite(ledPin, ledState);
139 // save the last time you blinked the LED
140 previousMillis += interval;
144 void Lampeggiatore::Blink(long time, long drift ) {
145 // Illumina il led secondo un intervallo passato come argomento
148 if(millis() + shift - previousMillis > time) {
149 // if the LED is off turn it on and vice-versa:
150 ledState = !ledState ; // Inverti il LED
151 // set the LED with the ledState of the variable:
152 digitalWrite(ledPin, ledState);
153 // save the last time you blinked the LED
154 previousMillis += time;
158 void Lampeggiatore::Blink(long up, long down, long drift ) {
159 // Illumina il ledB precisando ontime e downtime
162 if((ledState == HIGH)&& (millis() + shift - previousMillis > up)) {
163 // save the last time you blinked the LED
164 previousMillis += up;
167 else if((ledState == LOW)&& (millis() + shift - previousMillis > down)) {
168 previousMillis += down;
172 // set the LED with the ledState of the variable:
173 digitalWrite(ledPin, ledState);
176 void Lampeggiatore::High() {
179 digitalWrite(ledPin, HIGH);
182 void Lampeggiatore::Low() {
185 digitalWrite(ledPin, LOW);
188 void Lampeggiatore::Swap() {
189 // Inverte lo stato del LED
191 digitalWrite(ledPin, !digitalRead(ledPin));
194 /////////////////////////////////////
198 // Gestione del PWM utilizzando millis
199 // per non bloccare il processore con delay
200 // Warning: serialWrite puo' interferire con i tempi.
203 pinMode(ledPin, OUTPUT);
205 byte brightness = 0 ;
209 void Pwm::Up(long speed, long drift) {
210 // Aumenta linearmente la luminosita' usanndo millis()
211 // quindi senza bloccare il processore
212 // Viene usato un float, in alternativa un coseno
214 if (millis() != previousMillis) { // si potrebbe togliere
216 brightness = 255.0 /(float)speed * (millis() + shift);
217 analogWrite(ledPin, brightness);
219 previousMillis = millis();
223 void Pwm::lUp(long speed, long drift) {
224 // Aumenta usanndo millis() con correzione luminosita' LED
225 // quindi senza bloccare il processore
226 // Viene usato un float, in alternativa un coseno
228 if (millis() != previousMillis) { // si potrebbe togliere
230 brightness = 255.0 /(float)speed * (millis() + shift);
231 analogWrite(ledPin, lum(brightness));
233 previousMillis = millis();
237 void Pwm::Down(long speed, long drift) {
238 // Riduce linearmente la luminosita' usanndo millis()
239 // quindi senza bloccare il processore
241 if (millis() != previousMillis) {
243 brightness = 255 - 255.0 /(float)speed * (millis() + shift) ;
244 analogWrite(ledPin, brightness);
246 previousMillis = millis();
250 void Pwm::lDown(long speed, long drift) {
251 // Riduce usanndo millis() con correzione della luminosita'
252 // quindi senza bloccare il processore
254 if (millis() != previousMillis) {
256 brightness = 255 - 255.0 /(float)speed * (millis() + shift) ;
257 analogWrite(ledPin, lum(brightness));
259 previousMillis = millis();
263 void Pwm::UD(long speed, long drift ) {
264 // Aumenta e riduce in sequenza la luminosita' usanndo millis()
266 brightness = 128 + 127 * cos(2 * PI / speed * (millis() + shift));
267 analogWrite(ledPin, brightness);
270 void Pwm::Set(byte brightness) {
271 // Imposta il valore del PWM
272 analogWrite(ledPin, brightness);
276 void Pwm::lSet(byte brightness) {
277 // Imposta il valore del PWM con correzione luminosita' LED
278 analogWrite(ledPin, lum(brightness));
282 /////////////////////////////////////
285 Sequenza::Sequenza (byte passed[], byte dim) {
288 for (int thisPin = 0; thisPin < size; thisPin++) {
289 pinMode(ledPins[thisPin], OUTPUT);
291 previousMillis = millis();
292 digitalWrite(ledPins[0], HIGH);
295 void Sequenza::Update(long value) {
296 // Incrementa dal primo all'ultimo valore dell'array
298 if (millis() - previousMillis >= interval) {
299 previousMillis = millis();
301 if ( i < size - 1 ) {
302 // Spegni precedente led
303 digitalWrite(ledPins[i], LOW);
305 // Accendi successivo led
306 digitalWrite(ledPins[++i], HIGH);
309 else if (i == size - 1 ) {
312 previousMillis = millis();
313 digitalWrite(ledPins[i], HIGH);
314 digitalWrite(ledPins[ size - 1 ], LOW);
320 void Sequenza::Reverse(long value) {
322 if (millis() - previousMillis >= interval) {
323 previousMillis = millis();
325 if (i == 0) { // Entry point, ultimo LED
326 digitalWrite(ledPins[size -1],HIGH);
327 digitalWrite(ledPins[0],LOW);
331 digitalWrite(ledPins[i],LOW);
332 digitalWrite(ledPins[--i],HIGH);
337 void Sequenza::UD(long value) {
339 if (millis() - previousMillis >= interval) {
340 previousMillis = millis();
341 // Spegni precedente led
342 digitalWrite(ledPins[i], LOW);
344 // Accendi successivo led
345 digitalWrite(ledPins[i], HIGH);
347 if (i == 0 || i == size -1) {
358 void brilla(byte pin, int velocita ) { // Defalt value di velocita' solo nell'Header
359 // Accende e spegne il LED accetando un argomento
360 // per impostare la velocita'.
362 pinMode(pin, OUTPUT);
363 // sequenze di istruzione: accendere e spegnere il LED
364 digitalWrite(pin, HIGH); // turn the LED on (HIGH is the voltage level)
365 delay(velocita); // wait for a second
366 digitalWrite(pin, LOW); // turn the LED off by making the voltage LOW
367 delay(velocita); // wait for a second
372 // Mappatura dell'intervallo 0-255 con correzione di luminosita.
374 return pgm_read_byte_near(BCORRECT + val);
378 int calibraTrim(int pin, const byte ledPin) {
379 /* START Calibrazione TRIM canale:
381 calcolo del valore medio esclusi gli 0
383 I canali come alettoni / elevatore possono avere un TRIM
384 (generalmente il throttle non ha un TRIM impostato),
385 questa funzione nel setup serve per trovare il punto medio
386 all'avvio dello sketch.
388 pinMode(ledPin,OUTPUT);
393 Serial.println(">> Calibrazione: ");
396 if (millis() > 10000) {
398 Serial.println(">> Calibrazione annullata a causa di assenza di seganle. \nAssicurarsi di accendere radio e ricevente \ne ripetere la procedura.");
400 middle = 15000; // Return value is divided by 10
403 servoValue = pulseIn(pin, HIGH, 25000);
404 if (servoValue != 0 && servoValue > 950 && servoValue <2000) {
405 middle = middle + servoValue ;
408 Serial.print(servoValue);
410 Serial.println(middle / a);
412 digitalWrite(ledPin, !digitalRead(ledPin));
417 Serial.print(">> Fine Calibrazione, media: ");
418 Serial.println(middle / 10 + 10);
421 return(middle / 10 + 10) ;