Programmare con Arduino – led in dissolvenza

In questo secondo esempio proverai lo sketch per gestire un led in dissolvenza presente tra gli sketch forniti con l’IDE Arduino: Fade.
Per trovare questo esempio basta andare nel menu File -> Examples -> Basics -> Fade.

Fonte: arduino.cc - led in dissolvenza

led in dissolvenza

Questo articolo si inserisce a metà circa di una serie di articoli che ho scritto sulla programmazione con arduino:

Programmare con Arduino – le basi

Programmare con Arduino – Pin Digitali e Analogici

si tratta di sketch semplici, forniti con l’IDE Arduino stesso, con la spiegazione passo dopo passo di tutti i comandi.

Questa serie di articoli ti permette di comprendere la programmazione di arduino partendo da esempi semplici.

Lo sketch è il seguente:

/*
 Fade

 This example shows how to fade an LED on pin 9
 using the analogWrite() function.

 This example code is in the public domain.

 */
int brightness = 0;    // how bright the LED is
int fadeAmount = 5;    // how many points to fade the LED by

void setup()  {
  // declare pin 9 to be an output:
  pinMode(9, OUTPUT);
} 

void loop()  {
  // set the brightness of pin 9:
  analogWrite(9, brightness);    

  // change the brightness for next time through the loop:
  brightness = brightness + fadeAmount;

  // reverse the direction of the fading at the ends of the fade:
  if (brightness == 0 || brightness == 255) {
    fadeAmount = -fadeAmount ;
  }
  // wait for 30 milliseconds to see the dimming effect
  delay(30);
}

Come al solito lo analizzeremo riga per riga per comprendere come sia composto questo algoritmo, iniziamo:

linee 1-9: commento multi linea, indica lo scopo del programma e definisce, sempre in ultima riga, la possibilità di utilizzare liberamente questo codice, ossia i termini di licenza;

linea 10: imposta una variabile di tipo intero ( integer ) in cui memorizzerà il valore di luminosità raggiunto dal led nel corso del ciclo di loop, la definizione di una variabile di questo tipo (integer) dovrebbe esserti chiara, utilizza int nome_variabile = valore;

linea 11: imposta una variabile di tipo intero ( integer ) preimpostata al valore 5 che rappresenta l’incremento di luminosità che il led raggiungerà ad ogni ciclo ( loop );

linee 13-16: definizione della funzione setup() in cui alla linea 14 trovi il commento alla linea successiva la 15, in cui imposta il pin 9 come pin di tipo OUTPUT: pinMode(9, OUTPUT); la linea 16 chiude la funzione setup();

linea 18: definizione della funzione loop() che sarà terminata alla linea 31;

linea 20: utilizzando il comando analogWrite imposta il duty-cycle 0 al piedino 9, il duty-cycle è 0 in quanto brightness non è stato ancora variato dalla sua inizializzazione alla linea 11;

linea 23: incrementa il valore della variabile brightness sommando il valore di fadeAmount ad ogni ciclo di loop, la variabile brightness, in questo modo, si incrementa di 5 fino a raggiungere il valore 255, come vedrai alla linea 26;

linea 26: esegue un doppio test sulla variabile brightness confrontandola sia con il valore 0 che con il valore massimo che possiamo passare al comando analogWrite: 255;

al raggiungimento del valore 0 o del valore 255 esegue quanto scritto alla linea successiva.

linea 27: inverte il segno della variabile fadeAmount ! Un piccolo trucco che avrà effetto sui successivi cicli di loop, quando eseguirà i comandi alla linea 23:

brightness = brightness + fadeAmount;

in realtà eseguirà un’operazione simile brightness = brightness + ( -fadeAmount );

decrementando, di fatto, il valore di luminosità (brightness) fino al raggiungimento del valore 0. A questo punto il valore di fadeAmount viene nuovamente invertito dalla linea 27 ed il calcolo alla linea 23 incrementa nuovamente il valore di brightness;

linea 30: introduce un tempo di attesa di 30 millisecondi prima di ripetere il ciclo.

Il circuito che ho realizzato è molto semplice, ho collegato il terminale positivo di un led al pin 9 della scheda Arduino, ed il terminale negativo del led alla massa ( GND ) della scheda Arduino interponendo una resistenza da 470 ohm per proteggere il led.

Eseguendo il codice il risultato che otterrai è il seguente:

  • Questo sito ed i suoi contenuti è fornito "così com'è" e Mauro Alfieri non rilascia alcuna dichiarazione o garanzia di alcun tipo, esplicita o implicita, riguardo alla completezza, accuratezza, affidabilità, idoneità o disponibilità del sito o delle informazioni, prodotti, servizi o grafiche correlate contenute sul sito per qualsiasi scopo.
  • Ti chiedo di leggere e rispettare il regolamento del sito prima di utilizzarlo
  • Ti chiedo di leggere i Termini e Condizioni d'uso del sito prima di utilizzarlo
  • In qualità di Affiliato Amazon io ricevo un guadagno dagli acquisti idonei qualora siano presenti link al suddetto sito.

Permalink link a questo articolo: https://www.mauroalfieri.it/informatica/programmare-con-arduino-led-in-dissolvenza.html

80 commenti

Vai al modulo dei commenti

  1. quanti led in uscita si possono comandare con arduino , sarebbe interessante questa applicazione per comandare una serie di led multicolori per l’albero di natale

    1. Ciao Maurizio,
      arduino in uscita ha 14 pin di cui i primi 2 è sconsigliato utilizzarli, se guardi il datasheet sul sito ufficiale troverai tutte le sue caratteristiche.
      Nel blog trovi già quello che chiedi cerca “gochi di luce” è un progetto che ho presentato in 9 giochi differenti lo scorso natale 🙂

      Buon divertimento.

    • jcamma il 14 Dicembre 2012 alle 19:31
    • Rispondi

    Ciao e complimentoni per il blog è davvero istruttivo!!

    Ho realizzato una piccola variazione del “fade”. E’ molto semplice non fa altro che accendere e spegnere alcuni pin PWM in sequenza ma col il “fade” e volevo condividerlo con tutti.

    Credo si possa usare per le luci di natale!!

    ENJOY!

    /*
    In questo programma la luce ( la tensione di uscita del PWM ) varia in maniera fluida, fissato il fadeamount, da 0 a 255 e da 255 a 0 senza scatti!!
    Questo viene ripetuto per tutte le uscite PWM con una sequenza di pin in ordine crescente ed un numero di cicli per pin definito dalla variabile f
    */

    //ENJOY!

    int brightness = 0; // dichiarazione della luminosità
    int fadeAmount = 50; // passo della luminosità
    int ghost = 0; // variabile fantasma che serve per evitare che sul led ci sia uno “scatto” di luminosità in su o in giù quando i valori superano 255 o diventano inferiori di 0
    int i = 0; // questa variabile ci servirà per passare da un pin ad un altro; in pratica è il numero del pin
    int f = 0; // gestione dei cicli di illuminazione/deluminazione

    void setup() {
    pinMode(3, OUTPUT);
    pinMode(5, OUTPUT);
    pinMode(6, OUTPUT);
    pinMode(9, OUTPUT);
    pinMode(10, OUTPUT);
    }

    void loop() {
    while ( i = 5 )
    { i–;
    if ( i==5 || i== 6 || i==9 )
    {
    illuminare ();
    }
    }
    i=0;
    }

    void illuminare()
    {f=f+1;
    while (f < 2)
    {
    analogWrite(i, brightness);
    ghost = ghost + fadeAmount;
    if (ghost = 255)
    {
    ghost = 255;
    fadeAmount = – fadeAmount;
    }
    brightness = ghost;
    if (ghost==0)
    {
    f=f+1;
    }
    }
    f=0;
    }

    1. Grazie per la condivisione.
      Se realizzi un video e delle foto al progetto pubblichiamo un articolo per tutti gli appassionati.

      Mauro

        • jcamma il 17 Dicembre 2012 alle 11:43
        • Rispondi

        Ciao a tutti per ora ho simulato il funzionamento solo con il simulatore di arduino appena mi arriva il gioiellino ( spero prima di natale! ) collegherò dei led e farò video e foto !

        Enjoy!

    • daniele il 31 Dicembre 2012 alle 13:34
    • Rispondi

    buona sera. volevo un consiglio, mi stò cimentando con arduino,
    io volevo creare uno sketch dove led1 parte da 0 e sale a 255 ma quando led 1 arriva a 120 mi parta led2 da 0 e mi arriva a 255 tutto in disolvenza +1. io ho provato varie formule ma la mia esperieza non è tale.
    volevo se possibile una formula cosi io me la studio e vedo dove sbaglio. grazie in anticipo..

    1. Ciao Daniele,
      un anno fa esatto ho pubblicato una serie di articoli sui giochi di luce con i led in occasione delle feste natalizie.
      Prova a leggere quegli articoli e troverai sicuramente quello che ti occorre.

      Mauro

    • Paolo il 24 Marzo 2013 alle 13:45
    • Rispondi

    Ciao,
    ottimo lavoro!
    Approfitto per un paio di segnalazioni:

    – la 5 e la 8 sono identiche… si potrebbe sostituire una delle due con qualcosa di utile per chi ha conoscenze di programmazione ma sta iniziando con l’elettronica, qualcosa anche semplice, come l’uso di transistor e mosfet per pilotare dei carichi tanto per citare qualcosa di indubbiamente utile

    – sarebbe molto utile avere un file pdf per consultarlo ovunque, si potrebbe fare?

    1. Ciao Paolo,
      ottima segnalazione, non me ne sono accorto, grazie!!!
      Nessuno me lo ha mai segnato 🙂

      Puoi leggere tutti gli articoli che vuoi nel blog anche oltre il corso, troverai altre cose molto interessanti.

      Per il PDF sto realizzando un libro elettronico che penso sarà in vendita su iTunes, te lo segnalerò appena disponibile.

      Mauro

    • Massimo il 23 Ottobre 2013 alle 22:33
    • Rispondi

    Ciao Mauro, dopo aver letto questo capitolo sono entrato in confusione, e mi spiego:
    Nel programma “Lampeggio” si è definita una variabile di tipo intero assegnata ad un pin (int ledPin = 13;) e quindi “int nome_variabile = n° pin”.
    Nel programma “Fade” si definisce una variabile di tipo intero a cui si assegna un valore (int brightness = 0;) come del resto la successiva (int fadeAmount = 5;) e quindi “int nome_variabile = valore”.
    La mia domanda è: come fa il programma “Fade” a capire che il numero che segue l’uguale di “int brightness” e di “int fadeAmount” è un valore e non un pin? La stessa domanda si pone al contrario per il “Lampeggio”dove il numero che segue l’uguale di “int ledPin” si riferisce ad un pin e non ad un valore?
    Non mi mandare a quel paese, ma sono proprio agli inizi e mano mano che avanzo vorrei dissipare ogni dubbio che mi si presenta.
    Massimo

    1. Ciao Massimo,
      il tuo dubbio è lecito e corretto.
      Probabilmente sono i primi programmi che leggi e non provieni da una formazione tecnica ed ecco perchè ti sembra strano.

      Per semplificarti l’apprendimento delle logiche di programmazione, un mio professore, mi disse: “ricordati sempre che il computer è stupido al massimo conosce 2 numeri 0 ed 1”
      Premesso questo comprendi che il programma non sa distinguere in base al valore, sarai tu che utilizzando una variabile in un comando o in un’altro insegnerai al programma come usarla, lui resta stupido rispetto al valore che contiene una variabile.

      Per tornare all’esempio che citi, quando scrivo int variabile = valore lo sketch non interpreta il valore ma si limita ad assegnare valore a variabile; quando scrivo pinMode( variabile,OUTPUT ) insegni allo sketch di usare il valore contenuto nella variabile nel comando pinMode.
      Se ad esempio scrivi int variabile=300; e poi pinMode( variabile,OUTPUT ) lo sketch non funziona in quanto il pin 300 non esiste.

      Spero di essere stato chiaro.

      Mauro

        • Massimo il 24 Ottobre 2013 alle 17:56
        • Rispondi

        Chiarissimo, grazie e “tiremm innanz” nella speranza di disturbarti meno possibile.
        Massimo

        1. Ciao Massimo,
          se il tuo “disturbo” riguarda dubbi leciti e curiosità che ti impediscono di proseguire nel tuo progetto sono sempre ben disposto a darti risposta.

          Hai valutato l’idea di partecipare ad uno dei miei corsi in aula?

          Mauro

            • Massimo il 27 Ottobre 2013 alle 19:48

            Ti ringrazio sia per la sollecitudine delle tue risposte che per la disponibilità. Ovviamente i miei “disturbi” riguarderanno i dubbi e le curiosità che mano a mano affioreranno durante la lettura di questo corso. Parteciperei più che volentieri ad uno dei tuoi corsi, ma credo che la distanza tra la tua aula e la mia residenza (Roma) sia un po’ eccessiva, e comunque grazie.
            Massimo

          1. Ciao Massimo,
            collaboro con la struttura robot-domestici.it che promuove corsi arduino a Roma, se sei interessato puoi contattare loro.

            Mauro

    • Bruno il 8 Novembre 2013 alle 18:16
    • Rispondi

    scusami mauro io seguo tutto il procedimento che tu indichi ma non si accende il led, non iesco a capire se è la piastra sperimentale che non va ma nel kit che io ho acquistato c’era una bustina con questa all’interno, insieme ad una piastra di metallo ed ha sotto un adesivo, mi aiuti?
    grazie in anticipo

    1. Ciao Bruno,
      puoi provare a collegare il led direttamente ad Arduino mediante una resistenza da 220 o 330 ohm ( dipende da quel hai inel tuo kit ) e verificare che funzioni senza utilizzare la basetta.

      Mauro

    • Fabrizio il 21 Febbraio 2014 alle 23:54
    • Rispondi

    Ciao Mauro,

    Prima di tutto complimenti per i tuoi esperimenti!

    Sono entrato nel mondo di Arduino da poche settimane e devo dire che mi affascina sempre di più!
    Ti scrivo perche ho un problema che non riesco proprio a risolvere.

    In pratica è da un po di tempo che provo a fare il led in dissolvenza come quello del tuo filmato.

    Ho provato a fare il listato per conto mio ma non sono mai riuscito a farlo funzionare, allora ho provato a copiare il tuo ma alla fine mi da lo stesso problema:

    In pratica il led non si accende in dissolvenza ma tutto subito, arriva fino al valore 150 spento ma come imposto 151 si accende!

    Ho provato anche a cambiare sia Arduino che il led ma niente da fare!

    Come posso fare?

    Grazie e complimenti ancora!

    1. Ciao Fabrizio, hai collegato il led ad un pin PWM? Se non lo hai fatto non stai usand Arduino nel modo corretto.
      Oltre al video e a fare copia e incolla dello sketch prova a seguire anche lo schema dei collegamenti e leggere tutto l’articolo c’é scritto tutto.

      Ti consiglio anche di leggere, attentamente, almeno le prime lezioni del mio corso online gratuito arduino se desideri conoscere ed usare questa scheda in modo corretto.

      Mauro

    • Mario il 7 Marzo 2014 alle 10:19
    • Rispondi

    Ciao Mauro volevo sapere se è possibile realizzare l’accensione graduale di lampade al neon tramite arduine.
    Grazie e complimenti

    1. Ciao Mario,
      che io sappia no, per natura stessa delle lampade al neon.

    • Mario il 7 Marzo 2014 alle 11:20
    • Rispondi

    Grazie mille per la risposta immediata. Ti spiego io ho un’acquario e mi piacerebbe riprodurre l’effetto alba-tramonto e leggendo qua e la sul web ho letto che è possibile “dimmerare”le lampade fluorescenti ( neon) con appositi ballast (reattori elettronici) detti dimmerabili essi sono differenti da quelli normali hanno due pin in piu appunto per l’accensione graduale 0-10v pero ce bisogno di un controller che gestisca il tutto e pensavo si potesse fare con arduino
    Grazie

    1. Ciao Mario,
      qua dove?
      Non mi sembra di aver mai scritto di neon dimmerabili.
      Se mi chiarisci dove l’ho scritto posso verificare a cosa mi riferissi e magari aiutarti.

    • Mario il 7 Marzo 2014 alle 12:23
    • Rispondi

    No Mauro sicuramente mi sono espresso male non li ho visti sul tuo sito te ne linko uno a caso cosi se ti va gli dai un’occhiata
    http://alfonsomezzullo.altervista.org/Alba%20tramonto%20con%20luce%20lunare.htm
    grazie

    1. Ciao. Mario ho letto l’articolo del link e ti consiglio di chiedere all’autore del circuito info sui ballast, ignoro cosa siano, e non sono certo che possano essere gestiti da arduino che lavora a 0-5v e non 10v come descritto.

    • Mario il 7 Marzo 2014 alle 14:14
    • Rispondi

    Nel frattempo che aspetto una tua preziosa risposta ho trovato anche questo
    http://forum.arduino.cc/index.php?PHPSESSID=efc3ff825e9bc6c2a9011183058af8ab&topic=34474.msg251213#msg251213
    qui si parla esplicitamente di controllo tramite arduino di ballast dimmerabili
    Ciao

    • Mario il 8 Marzo 2014 alle 10:24
    • Rispondi

    Ok grazie mille per la disponibilta a presto

    • Paola il 4 Settembre 2014 alle 18:46
    • Rispondi

    Ciao Mauro, scusa ma non riesco a capire il valore delle resistenze che ho, c’è un modo per scoprirlo??
    grazie

    1. Ciao Paola,
      si, le resistenze sono catalogate per colori, ogni colore indica un numero e la posizione indica il fattore di moltiplicazione.
      Se cerchi su wikipedia c’è scritto tutto il procedimento per individuarle.
      Esistono anche delle App per riconoscerle.

      Tu che colori hai?

    • Eliseo il 3 Gennaio 2015 alle 15:15
    • Rispondi

    Salve, volevo un’informazione sulla resistenza da utilizzare.
    Leggendo nel playground di arduino ho visto che per i led bastano resistenze con valori che vadano dai 75 ai 165 ohm in base al colore del led.
    Come mai lei ha utilizzato una resistenza da 470 ohm? Non bastava più piccola?
    Quali sono i vantaggi di utilizzare una resistenza da 470 al posto di una da 100 o 200?

    1. Ciao Eliseo,
      la resistenza la devi calcolare con la legge di ohm, trovi numerosi articoli in rete.
      Ho usato una resistenza da 470ohm in questo esperimento perché già a mia disposizione nel collegamento con il led e non ho voluto cambiarla.
      Più alta usi la resistenza e minore apporto di tensione e corrente avrai al led.

        • Eliseo il 4 Gennaio 2015 alle 11:45
        • Rispondi

        Grazie mille per la chiarezza e la velocità di risposta.

    • Marco il 17 Gennaio 2015 alle 11:35
    • Rispondi

    Salve, sto iniziando ora sia con arduino che a leggere questo blog.
    E non mi è chiara una cosa (elettronica non del programma)..
    Noi con questo programma stiamo mandando al pin pwm valori che incrementano di 5 fino a 255 e decrementano fino a 0 in continuazione.
    A questo punto avremo che il pin passa da un impulso tutto 0 a un impulso tutto 1 gradatamente facendo tutti i passaggi intermedi, come si vede nella foto del tuo articolo precedente.
    Ma la tensione del picco è sempre 5V giusto?
    Quindi come fa a variare la luminosità del led? (cioè diciamo come fa a essere mezzo acceso?)

    1. Ciao Marco,
      si tratta di un impulso PWM, ti invito a leggere come funziona un segnale PWM e capirai come sia possibile.

        • Marco il 19 Gennaio 2015 alle 17:11
        • Rispondi

        Ho letto come funziona il segnale PWM, quello che non capivo è come la cambiando la forma dell’onda quadra generata cambi la tensione al led (quindi la luminosità). Credo però, se ora ho capito bene, che ai pin PWM sia collegato un circuito RC direttamente su arduino…

        1. Ciao Marco,
          non ho letto da nessuna parte di un circuito RC presente nel microcontrollore o nel circuito esterno, se trovi qualche link attendibile che ne parla mi farebbe piacere leggerlo.

            • Marco il 21 Gennaio 2015 alle 11:45

            Credo sia l’unico modo per avere una tensione in uscita dal segnale PWM diversa da 5V, perchè se non ci fosse sarebbe comunque 5V esatti che dopo un tot di tempo risaltano a 0, poi di nuovo a 5 ecc in base alla durata del duty alto.
            Perchè invece la tensione sia tra 0 e 5 in base alla percentuale high credo che un RC prima dell’uscita del pin sia d’obbligo.
            Questa immagine penso sia la più chiara http://upload.wikimedia.org/wikipedia/it/f/f6/RC_onda_quadra.PNG
            Più è corta la durata dell’1 meno il condensatore ha tempo per caricarsi, quindi restituisce una tensione inferiore a 5V proporzionata.

            Almeno se ho capito bene, sono un po’ arrugginito essendo trascorsi un po’ di anni dalle scuole superiori..

          1. Ciao Marco,
            comprendo quello che scrivi tuttavia ti invito a fare un test con arduino ed un led controllato in PWM e noterai l’effetto dissolvenza sul led.

    • Marco il 25 Gennaio 2015 alle 00:18
    • Rispondi

    Si si, è ovviamente la prima cosa che ho fatto! 😉
    Per questo penso del circuito RC anche se nei datasheet della scheda non lo vedo…
    Mistero…

      • Paolo il 27 Novembre 2015 alle 22:45
      • Rispondi

      Seguo questo sito del bravissimo Mauro Alfieri per vedere se anch’io imparo a programmare Arduino, in quanto a programmazione sono proprio scarso,
      Se vuoi, Marco, forse posso risolverti il dubbio elettronico a cui hai fatto riferimento nei tuoi post.

      Sui pin analogici è presente un segnale ad onda quadra con frequenza di 488 Hz ( questo sui pin 3-9-10-11) e di 976 Hz sui pin 5 e 6. queste sono frequenze di default e possono essere cambiate agendo sui registri interni ( ma questo non lo so fare).
      Pertanto sul pin 9 ci sarà questo segnale digitale con valore 0 oppure 5 V ( non ci sono valori intermedi ) con frequenza di 488 Hz, perciò il periodo sarà poco più di 2 ms .
      Arduino può dividere questi 2 ms in 256 parti a richiesta con l’ istruzione “analogWrite” .
      allora, possiamo dire che Arduino riesce a gestire circa 8 micro secondi ( 2 ms /256 ),

      Se dai un valore ad analoWrite, ( per esempio 85 ) significa che prendi 85 parti di 8 us, cioè circa 0,68 ms ,
      ( circa un terzo del segnale periodico a 488 Hz) e lo fa valere 5 V, mentre i restanti 2/3 li fa valere 0 V
      Pertanto in un periodo del segnale a 488 Hz, per 0.68 ms c’ è una tensione di 5 V e nei rimanenti 1,36 ms, non c’è tensione.
      Quando il segnale avrà fatto 488 cicli, sarà passato un secondo, ma in questo secondo il led per 2/3 non avrà ricevuto tensione e per 1/3 invece si, Ma anche dopo un ora sarà lo stesso.
      L’occhio vedrà una media o percentuale di luminosità, in quanto non può discriminare 0,68 ms di luminosità e
      1.36 ms di oscurità.
      Questo vale anche per i pin 5 e 6 che anche se la frequenza del segnale è il doppio su quei pin , 976 Hz invece di 488 e perciò il periodo di circa 1 ms, ma questo 1 ms sarà sempre diviso per 256, perciò Arduino gestisce circa 4 micro secondi, pertanto periodi più brevi ( la metà ), ma dopo 1 secondo si saranno succeduti 976 cicli ( il doppio di quelli visti prima ) pertanto il tempo totale di accensione e spengimento led, dopo 1 secondo rimane invariato,( ma anche dopo 8 us si sarà instaurata una parità fra le due frequenze che gestiscono il pwm)

      Spero ti sia stato di aiuto e di aiuto anche ad altri fan di Mauro Alfieri che seguo con molto piacere per imparare a fare qualche sketch interessante, in quanto alle prime armi con Arduino
      Congratulazioni per il sito Mario

      Paolo

      1. Ciao Paolo,
        spiegazione esemplare a me è servita a colmare alcune lacune sull’argomento come il gap tra periodo e frequenza su cui non mi ero mai soffermato con accuratezza come hai descritto tu.
        Se vuoi cambiare i TIMER trovi un mio articolo dedicato a questa possibilità. Sottolineo che si tratta di una operazione delicata e va eseguita solo se sei davvero in una situazione non risolvibile in altro modo.

    • Gabriele il 10 Febbraio 2015 alle 04:03
    • Rispondi

    Cmq devo dare atto a tutti colo che considerano questo sito un ottimo tutorial, concordo a pieno. Bravo Mauro.

    1. Grazie Gabriele

    • Alessio il 24 Aprile 2015 alle 15:22
    • Rispondi

    Salve,
    Vorrei sapere, se possibile, le modifiche che dovrei apportare al programma se i led fossero 8 e la dissolvenza fosse in fase di accensione e spegnimento, non continua come nel suo progetto. Vorrei, tramite un tasto, accendere questi led in dissolvenza fino alla luminosità massima e, di conseguenza, sempre tramite lo stesso tasto, farli spegnere sempre in dissolvenza.

    1. Ciao Alessio,
      se i led devono accendersi fino alla massima luminosità tutti insieme puoi collegarli al medesimo pin pwm arduino con apposito driver di controllo per evitare che la somma delle correnti in gioco bruci il pin di arduino.
      Se vuoi accenderli e spegnerli con il medesimo pulsante puoi leggere i miei articoli sul corso base on-line gratuito e tra i primi esempi è descritto come accendere e spegnere un led con il medesimo pulsante.

    • andrea il 6 Agosto 2015 alle 23:48
    • Rispondi

    ciao volevo sapere come aumentare il tempo del ciclo !!!!!!!!!! grazie

    1. Ciao Andrea,
      non ricordo se ho risposto a te in un altro articolo od ad un altro appassionato.
      Ho scritto degli articoli a corredo di questo che hai commentato in cui ho indicato con precisione come ho calcolato i tempi e come inserirli nello sketch per far durare ciascun ciclo il tempo che preferisci. Li hai già letti?

    • Stefano il 14 Agosto 2015 alle 23:16
    • Rispondi

    Salve, complimenti per il tutorial e per le innumerevoli spiegazioni, ho provato questo esempio e ad esso volevo aggiungere una fotoresistenza per far accendere le luci di sera con una dissolvenza perchè notavo ca cn la semplice fotoresistenza i led si accendono di colpo e/o mi producono uno sfarfallio ho provato ad aggiungere la fotoresistenza a questo sketch ma il risultato è un errore nei riguardi di else
    Grazie dell’attenzione e mi scuso per il (banale) disturbo

    [[ codice rimosso in automatico ]]

    1. Ciao Stefano,
      come hai letto in fondo ad ogni articolo è vietato incollare codice nei commenti, ti chiedo di rispettare le poche regole del blog.
      In merito al tuo quesito non ho compreso cosa vorresti realizzare e/o correggere del mio sketch che non usa una fotoresistenza, forse hai letto qualche altro articolo del blog con le resistenze e la dissolvenza dei led.

    • mario il 15 Novembre 2015 alle 12:28
    • Rispondi

    Ciao Mauro,
    complimenti per il tuo corso online, è fatto benissimo; sono riuscito a scrivere qualche sketch solo leggendo il tuo corso e avendo qualche base di programmazione dei tempi della scuola…10-15 anni fa.
    io sono novizio con arduino. ti spiego cosa voglio fare e quale è il mio dubbio.
    Ho intenzione di dotare il presepe con arduino per pilotare la cascata e vari tipi di luci mettendo anche una fotoresistenza per far accendere le luci quando diventa buio. La programmazione non è un problema, parte del codice già l’ho scritto.
    Il problema è questo: voglio mettere 3 serie di led RGB (circa 10 per ogni serie per un totale di 30 led) che fanno la dissolvenza cambiando colore ma di sicuro assorbono troppa corrente e la scheda non ce la fa a reggere il carico. Se piloto 9 relè, 3 per ogni serie di led, posso accenderli tutti ma posso mandare solo LOW e HIGH sui led non avendo tutte le sfumature.
    Esiste un modo per alimentare i led con i segnali da 0 a 255 ?
    Grazie

    1. Ciao Mario,
      per fare quello che desideri si ricorre alle shield, ossia un circuito che ti permetta il controllo di strisce di led attraverso arduino.
      Ho pubblicato qualche articolo a riguardo nel blog.

    • Mario il 20 Novembre 2015 alle 01:38
    • Rispondi

    Ciao Mauro,
    Ho frugato a lungo sul tuo sito ma non sono riuscito a trovare l’articolo sulla shield che mi hai detto. Ho cercato anche su alcuni siti dove vendono componenti per arduino ma shield per led non ne ho trovate se non integrati già sulle schede. Nel frattempo ho letto anche un altro articolo sul tuo blog sui led, quello dei led con l’effetto notte e giorno. Penso che opterò per quello ma ovviamente con 5-6 led non faccio abbastanza luce. Non sono proprio a digiuno di elettronica e di programmazione ma non so come risolvere.
    Grazie

    1. Ciao Mario,
      non so come tu l’abbia cercata, esistono varie opzioni.
      cerca in google “RGB shield arduino”

    • Salvo il 11 Febbraio 2016 alle 07:59
    • Rispondi

    Ciao Mauro e complimenti per il sito davvero molto interessante e ben fatto.
    Ho una domanda, sicuramente banale, ma a cui non riesco a dare risposta. Se nel programma indico alla variabile FADEAMOUNT di diventare negativa al raggiungimento di 255 o 0, come fa poi questa a tornare positiva per poter poi incrementare BRIGHTNESS anziché diminuirla?

    1. Ciao Salvo,
      si tratta di una semplice operazione matematica, il negativo di un numero negativo è positivo ( – * – = + ) i micro controllori, come arduino/genuino, eseguono con molta facilità le operazioni matematiche.

    • Veronica il 2 Marzo 2016 alle 16:02
    • Rispondi

    Buonasera, ma il led usato per ottenere quest effetto ha un nome particolare oppure è un led normale?

    1. Ciao Veronica,
      un semplice led da 5mm che puoi acquistare in un negozio di elettronica.

  2. Buonasera Mauro, voglio chiderti dei suggerimenti anche banali ,nelle lezioni precedenti si parlato e esperimentato il commando begin.Serial(9600) communicazione seriale monitor,la mia é domanda posso utilizzarli negli studi successsivi?
    la curiosita e di vedere come si comporta la mia scheda.
    in questo caso il valore della luminosita come vederla? nel senso , non mi interessa vedere il numeri dec 0 1 ma bensi il valore che va da 0 a 255 .
    Un ultima domanda c’e un sistema che mi permette di programmare in linguaggio KOP,uasato per la programmazione dei plc in particolare SIMATIC poi codificarlo per Arduino?
    Grazie, le tue lezioni sono molto utili e comprensivi.

    1. Ciao Nicola,
      rispondo alle tue domande:
      1. si puoi usarlo ogni volta che vuoi analizzare dei valori presenti nello sketch;
      2. sostituisci la variabile che contiene quella info nel Serial.print o Serial.println;
      3. purtroppo non conosco i PLC ed il loro ambiente di programmazione

    • Manolo il 26 Ottobre 2016 alle 19:21
    • Rispondi

    Ciao Mauro, essendo novizio di programmazione ripropongo un quesito recente ma che proprio non riesco a capire riguardo la riga 26/27.
    Se la luminosità è 0 oppure 255, allora il valore di dissolvenza sarà negativo. Se raggiungo 255 quindi si andrà verso lo 0 ma, una volta raggiunto, il comando dello sketch è sempre negativo (-fadeAmount) quindi come riesce a salire di nuovo? Studiando lo sketch non lo comprendo. Grazie

    1. Ciao Mandolo,
      si tratta si un operazione matematica: la prima volta fadeAmount vale 5, arrivado a 255 diventa -5;
      quando arriva a 0 il -5 diventa nuovamente 5 ( – * – = + ) e così via.

    • manolo il 4 Novembre 2016 alle 13:22
    • Rispondi

    Grazie per la spiegazione Mauro! Ora mi è tutto chiaro.

    • Maurizio il 14 Novembre 2016 alle 15:30
    • Rispondi

    Ciao Mauro.
    Sto cercando di realizzare un fade che va da 0 a 255 con un tempo variabile (da 1 a 10 minuti), impostato da una parte di programma. Vorrei non utilizzare delay, perchè nel frattempo il codice deve fare altro.
    Ho provato con i millis() ma non funziona regolare, ad ogni valore della variabile fa una cosa diversa (tipo a 1 minuto, fa 1 minuto e 3 secondi, a 4 minuti fa 4 minuti e 17 secondi ecc…).
    Puoi aiutarmi?
    Grazie.

    1. Ciao Maurizio,
      dipende molto dal tipo di comandi che chiedi di eseguire, ogni comando ha necessità di un tempo computazionale per essere eseguito.
      Un esempio puoi verificarlo aggiungendo e rimuovendo dei comandi Serial, vedrai che rallenta o accelera in quanto la comunicazione seriale è onerosa di risorse computazionali.

    • Vale il 7 Dicembre 2016 alle 14:27
    • Rispondi

    Ciao Mauro,
    mi ricollego in parte al precedente utente in quanto vorrei capire se fosse possibile avere una strip led RGB che commuta colore e nello stesso tempo un motore che continui girare (per ora ho solo la strip led per il presepio)

    Se uso un ciclo FOR per la cambiare i valori inviati alla strip (10 sec.), il motore si ferma?

    Quali soluzioni ci potrebbero essere e soprattutto, ci sono?

    Saluti

    Vale

    1. Ciao Vale,
      si è possibile utilizzando il comando millis invece del comando delay ( sul blog ho dedicato molti articoli a questo aspetto ) e non usando cicli annidati come for .. while .. until .. ecc
      Usi il loop proncipale per gestire i giochi di luce e rotazione del motore o altro.

    • Mimmo il 26 Febbraio 2017 alle 18:10
    • Rispondi

    Ciao, Mauro grazie al tuo sito mi sto avvicinando al mondo della programmazione, ma solo per arduino. Bravo. Ti dico del mio problema: in sostanza sempre con il led ed un segnale PWM vorrei che il led raggiungesse il valore di luminosità da me impostato con tastiera, (es 80% o 100%), in un determinato tempo, (es 60 minuti), mediante una rampa che dura quei 60 minuti. In buona sostanza che il fade partendo da 0 raggiunga il valore impostato (80%) nell’arco di un’ora utilizzando tutti gli step intermedi, 1%, 2%, 3%, 4%, 5% etc. fino al 80% impiegando 60 minuti. Ho pensato ad una array ma mi sembra una cosa mastodontica. Ho trovato la funzione map ma non ho trovato uno sketch che possa farmi capire come fare. Credo che la cosa sia banale, ma non trovo quel quid……
    Grazie

    1. Ciao Mimmo,
      l’array è la soluzione migliore se hai degli step per la rampa, es: 1%,2%,5%,8%,… se l’incremento è costante puoi usare semplicemente la divisione: secondi massimi ( es.: 60min = 3600sec = 3600000millisec ) / [numero massimo pwm] da cui ricavi il delay tra uno step ed il successivo.

        • Mimmo il 27 Febbraio 2017 alle 12:57
        • Rispondi

        Ciao Mauro,
        grazie della risposta – MI SA CHE E’ L’UOVO DI COLOMBO – quando dici [numero massimo pwm] intendi la percentuale es. 80% o non il numero massimo di step. L’effetto visivo in questo modo sarebbe uniforme? senza sfarfallio?
        Grazie ancora.

        1. Ciao Mimmo,
          [numero massimo pwm] vuol dire 256 se sei al 100% se vuoi un 80% devi calcolarti il valore massimo a cui arrivare.
          Sull’effetto visivo dipende dal tipo di led che usi, io ti ho consigliato due modi in funzione di quello che desideri ottenere.

            • Mimmo il 27 Febbraio 2017 alle 18:48

            Grazie Mauro,
            smanettando ho trovato un tuo articolo sulla centralina alba e tramonto per il presepe e devo dire che si attaglia alla grande con il mio progetto e……. devo solo studiare un pò ed apportare alcune modifiche.
            Con stima Mimmo

          1. Ottimo Mimmo.

    • Luca75 il 15 Aprile 2017 alle 18:37
    • Rispondi

    Buon Pomeriggio,sono nuovo,
    inanzi tutto Mauro sei molto bravo;
    avrei un problema da porti con Arduino…
    dovrei creare uno sketch che generi un treno di impulsi PWM con frequenza 500 Hz e duty cycle del variabile sul pin 13……con questo treno PWM realizzare una dissolvenza in entrata (Fade-in) in un secondo con la funzione digitalWrite (e non analogWrite)……so che è una gran richiesta ma spero tu possa essermi d’aiuto….ho cercato in altri blog ma nessuno mi convinceva.

    1. Ciao Luca,
      pwerchè non usi un pin PWM ? la frequenza di 500Hz precisa non è presente nei prescaler dei TIMER ma puoi avvicinartici molto usando ad esempio 3,9,10,11 puoi avere una frequenza di 488Hz già generata.
      Prova a cercare nel blog gli articoli che parlano di PWM e TIMER

    • Riccardo il 12 Luglio 2017 alle 19:33
    • Rispondi

    Ciao Mauro,
    prima di tutto complimenti per l’articolo, sei molto bravo!
    Vorrei chiederti se è possibile fare in modo che il led stia spento per un tempo maggiore e minore rispetto a quando è acceso e se si, come?
    Grazie in anticipo.

    1. Ciao Riccardo,
      nella descrizione dello sketch linea per linea è descritto come fare, se non ti fosse chiara qualche linea scrivi un commento e cercherò di rendertela più esplicativa.

    • Gino Sorvillo il 20 Giugno 2021 alle 01:09
    • Rispondi

    Salve , non riesco a trovare una funzione per mettere una pausa quando il led e completamente acceso e una pausa quando il led e completamente spento. Mi puoi aiutare ti ringrazio anticipatamente

    1. Ciao Gino,
      il comando è delay() tra le parentesi dovrai mettere il numero di millisecondi che desideri di pausa, ti consiglio di leggere il manuale arduino sul sito ufficiale o il mio articolo dedicato al delay e millis per capirne di più.

    • Luciano il 23 Ottobre 2022 alle 19:46
    • Rispondi

    Mauro sei bravissimo, però io ho un problema: colgo cioè tutti gli errori grammaticali all’interno di un testo e purtroppo qui ne trovo tantissimi, dovuti sicuramente alla velocità di digitazione del testo… 🙁
    Complimenti comunque per il tuo lavoro!

    1. Ciao Luciano,
      hai ragione, non sul fatto che io sia bravissimo, ma sulla presenza di errori di digitazione, almeno spero siano solo di digitazione 😀 e non orrori grammaticali.
      Cercherò di correggerli, segnalatemeli sempre, quando ne trovate 😀

      Grazie

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.