3 * Oggetti di uso comune
6 * Link: http://git.andreamanni.com/
14 //////////////////////
18 RGBLed::RGBLed(byte pinR, byte pinG, byte pinB) {
19 // Per un common catodo, valore max / min invertiti
25 // Equvalente del Setup() per inizializzare i PIN
26 pinMode(redPin, OUTPUT);
27 pinMode(greenPin, OUTPUT);
28 pinMode(greenPin, OUTPUT);
31 RGBLed::RGBLed(byte pinR, byte pinG, byte pinB, byte com) {
32 // Per un common anode, valore max / min normali
38 // Equvalente del Setup() per inizializzare i PIN
39 pinMode(redPin, OUTPUT);
40 pinMode(greenPin, OUTPUT);
41 pinMode(greenPin, OUTPUT);
44 void RGBLed::SetColor (byte r, byte g, byte b) {
45 // Imposta il colore di un LED RGB
46 analogWrite(redPin, common - r);
47 analogWrite(greenPin, common - g);
48 analogWrite(bluePin, common - b);
51 // Serial.print(common - r);
53 // Serial.print(common - g);
55 // Serial.print(common - b);
60 void RGBLed::Rand () {
61 // Imposta il colore di un LED RGB
62 analogWrite(redPin, random(0,256));
63 analogWrite(greenPin, random(0,256));
64 analogWrite(bluePin, random(0,256));
68 // Accende il LED di rosso
72 void RGBLed::Green () {
73 // Accende il LED di verde
77 void RGBLed::Blue () {
78 // Accende il LED di blu
82 void RGBLed::Magenta () {
83 // Accende il LED di magenta
87 void RGBLed::Cyano () {
88 // Accende il LED di Cyano
92 void RGBLed::Yellow () {
93 // Accende il LED di giallo
97 void RGBLed::White () {
99 SetColor(255,255,255);
102 void RGBLed::Off () {
109 /////////////////////////////////////
112 Lampeggiatore::Lampeggiatore(int pin)
115 pinMode(ledPin, OUTPUT);
121 // Una funzione facente parte di una classe prende il nome di "metodo" della stessa:
122 void Lampeggiatore::Invert() {
123 // Inverte il lampeggio
127 void Lampeggiatore::Blink() {
128 // Illumina il led a 500ms
130 if(millis() + shift - previousMillis > interval) {
132 // if the LED is off turn it on and vice-versa:
133 ledState = !ledState ; // Inverti il LED
134 // set the LED with the ledState of the variable:
135 digitalWrite(ledPin, ledState);
136 // save the last time you blinked the LED
137 previousMillis += interval;
141 void Lampeggiatore::Blink(long time, long drift ) {
142 // Illumina il led secondo un intervallo passato come argomento
145 if(millis() + shift - previousMillis > time) {
146 // if the LED is off turn it on and vice-versa:
147 ledState = !ledState ; // Inverti il LED
148 // set the LED with the ledState of the variable:
149 digitalWrite(ledPin, ledState);
150 // save the last time you blinked the LED
151 previousMillis += time;
155 void Lampeggiatore::Blink(long up, long down, long drift ) {
156 // Illumina il ledB precisando ontime e downtime
159 if((ledState == HIGH)&& (millis() + shift - previousMillis > up)) {
160 // save the last time you blinked the LED
161 previousMillis += up;
164 else if((ledState == LOW)&& (millis() + shift - previousMillis > down)) {
165 previousMillis += down;
169 // set the LED with the ledState of the variable:
170 digitalWrite(ledPin, ledState);
173 void Lampeggiatore::High() {
176 digitalWrite(ledPin, HIGH);
179 void Lampeggiatore::Low() {
182 digitalWrite(ledPin, LOW);
185 void Lampeggiatore::Swap() {
186 // Inverte lo stato del LED
188 digitalWrite(ledPin, !digitalRead(ledPin));
191 /////////////////////////////////////
195 // Gestione del PWM utilizzando millis
196 // per non bloccare il processore con delay
197 // Warning: serialWrite puo' interferire con i tempi.
200 pinMode(ledPin, OUTPUT);
202 byte brightness = 0 ;
206 void Pwm::Up(long speed, long drift) {
207 // Aumenta linearmente la luminosita' usanndo millis()
208 // quindi senza bloccare il processore
209 // Viene usato un float, in alternativa un coseno
211 if (millis() != previousMillis) { // si potrebbe togliere
213 brightness = 255.0 /(float)speed * (millis() + shift);
214 analogWrite(ledPin, brightness);
216 previousMillis = millis();
220 void Pwm::lUp(long speed, long drift) {
221 // Aumenta usanndo millis() con correzione luminosita' LED
222 // quindi senza bloccare il processore
223 // Viene usato un float, in alternativa un coseno
225 if (millis() != previousMillis) { // si potrebbe togliere
227 brightness = 255.0 /(float)speed * (millis() + shift);
228 analogWrite(ledPin, lum(brightness));
230 previousMillis = millis();
234 void Pwm::Down(long speed, long drift) {
235 // Riduce linearmente la luminosita' usanndo millis()
236 // quindi senza bloccare il processore
238 if (millis() != previousMillis) {
240 brightness = 255 - 255.0 /(float)speed * (millis() + shift) ;
241 analogWrite(ledPin, brightness);
243 previousMillis = millis();
247 void Pwm::lDown(long speed, long drift) {
248 // Riduce usanndo millis() con correzione della luminosita'
249 // quindi senza bloccare il processore
251 if (millis() != previousMillis) {
253 brightness = 255 - 255.0 /(float)speed * (millis() + shift) ;
254 analogWrite(ledPin, lum(brightness));
256 previousMillis = millis();
260 void Pwm::UD(long speed, long drift ) {
261 // Aumenta e riduce in sequenza la luminosita' usanndo millis()
263 brightness = 128 + 127 * cos(2 * PI / speed * (millis() + shift));
264 analogWrite(ledPin, brightness);
267 void Pwm::Set(byte brightness) {
268 // Imposta il valore del PWM
269 analogWrite(ledPin, brightness);
273 void Pwm::lSet(byte brightness) {
274 // Imposta il valore del PWM con correzione luminosita' LED
275 analogWrite(ledPin, lum(brightness));
279 /////////////////////////////////////
282 Sequenza::Sequenza (byte passed[], byte dim) {
285 for (int thisPin = 0; thisPin < size; thisPin++) {
286 pinMode(ledPins[thisPin], OUTPUT);
288 previousMillis = millis();
289 digitalWrite(ledPins[0], HIGH);
292 void Sequenza::Update(long value) {
293 // Incrementa dal primo all'ultimo valore dell'array
295 if (millis() - previousMillis >= interval) {
296 previousMillis = millis();
298 if ( i < size - 1 ) {
299 // Spegni precedente led
300 digitalWrite(ledPins[i], LOW);
302 // Accendi successivo led
303 digitalWrite(ledPins[++i], HIGH);
306 else if (i == size - 1 ) {
309 previousMillis = millis();
310 digitalWrite(ledPins[i], HIGH);
311 digitalWrite(ledPins[ size - 1 ], LOW);
317 void Sequenza::Reverse(long value) {
319 if (millis() - previousMillis >= interval) {
320 previousMillis = millis();
322 if (i == 0) { // Entry point, ultimo LED
323 digitalWrite(ledPins[size -1],HIGH);
324 digitalWrite(ledPins[0],LOW);
328 digitalWrite(ledPins[i],LOW);
329 digitalWrite(ledPins[--i],HIGH);
334 void Sequenza::UD(long value) {
336 if (millis() - previousMillis >= interval) {
337 previousMillis = millis();
338 // Spegni precedente led
339 digitalWrite(ledPins[i], LOW);
341 // Accendi successivo led
342 digitalWrite(ledPins[i], HIGH);
344 if (i == 0 || i == size -1) {
355 void brilla(byte pin, int velocita ) { // Defalt value di velocita' solo nell'Header
356 // Accende e spegne il LED accetando un argomento
357 // per impostare la velocita'.
359 pinMode(pin, OUTPUT);
360 // sequenze di istruzione: accendere e spegnere il LED
361 digitalWrite(pin, HIGH); // turn the LED on (HIGH is the voltage level)
362 delay(velocita); // wait for a second
363 digitalWrite(pin, LOW); // turn the LED off by making the voltage LOW
364 delay(velocita); // wait for a second
369 // Mappatura dell'intervallo 0-255 con correzione di luminosita.
371 return pgm_read_byte_near(BCORRECT + val);
375 int calibraTrim(int pin, byte ledPin) {
376 /* START Calibrazione TRIM canale:
378 calcolo del valore medio esclusi gli 0
380 I canali come alettoni / elevatore possono avere un TRIM
381 (generalmente il throttle non ha un TRIM impostato),
382 questa funzione nel setup serve per trovare il punto medio
383 all'avvio dello sketch.
388 Serial.println(">> Calibrazione: ");
390 if (millis() > 10000) {
391 Serial.println(">> Calibrazione annullata a causa di assenza di seganle. \nAssicurarsi di accendere radio e ricevente \ne ripetere la procedura.");
392 ail = 15000; // Return value is divided by 10
395 ailIn = pulseIn(pin, HIGH, 25000);
396 if (ailIn != 0 && ailIn > 1000 && ailIn <2000) {
402 digitalWrite(ledPin, !digitalRead(ledPin));
406 Serial.print(">> Fine Calibrazione, media: ");
407 Serial.println(ail / 10);