LED WS2812 e Arduino – La dissolvenza tra i pattern

Arduino ws2812 LED

Come eseguire più schemi con i LED WS2812 e Arduino, modificarli utilizzando un timer o premendo un pulsante, e creare una dissolvenza incrociata.

In questo nuovo articolo relativo alla programmazione della libreria FastLED, esaminiamo come eseguire più schemi e modificarli utilizzando un timer o premendo un pulsante. Quindi esamineremo la dissolvenza incrociata tra i modelli per garantire un aspetto più professionale. I

Articoli precedenti:

  1. LED WS2812 per Arduino – Cosa sono e come si usano
  2. LED WS2812 – Attività di configurazone con Arduino
  3. LED WS2812 e Arduino – Ora giochiamo con i colori
  4. LED WS2812 e Arduino – Altre animazioni sui colori
  5. LED WS2812 con Arduino – Gestire pattern variabili
  6. LED WS2812 e Arduino – Onde e sfumature variopinte

Modificare un pattern con un timer o un tasto

Immaginiamo dunque di voler mostrare diversi pattern: il sorgente di qseguito ci mostra in che modo gestirne la programmazione.

Ci troviamo di fronte ad un programma mediamente complesso (ma che occupa solo il 17% della memoria di Arduino, 4576 bytes!). Analizziamolo con calma.

Definiamo una variabile di stato, patternCounter: ci consentirà di scegliere tra figure grafiche differenti; quindi eseguiamo il solito setup della libreria FastLED.

All’interno del loop() eseguiamo un controllo del valore del patternCounter, e a seconda del valore da esso posseduto lanciamo una funzione predefinita. Ogni 5 secondi il paternCounter viene aggiornato dall’apposita funzione, che somma 1 al valore precedente ed estrae il modulo del numero, ottenendo quindi  la sequenza 0-1-2-0-1-2… che rappresenta appunto la sequenza di lancio di ciascun pattern.

Dalla riga #43 vengono definite le funzioni che rappresentano in che modo “accendere” i LED. Alla riga #54 e #55 vediamo come utilizzare le interferenze tra le onde per definire le posizioni del LED da accendere, mentre il valore calcolato alla riga #52 determina la “rotazione” dei colori.

Per cambiare il pattern ci siamo affidati al timer definito a riga #32. Ma se invece avessimo voluto eseguire il cambio del pattern attraverso un pulsante?

Nulla di più facile: prima di tutto includiamo la libreria OneButton.h, che si occupa di gestire al meglio i pulsanti; poi definiamo a 3 la costante BTN_PIN (il pin al quale colleghiamo il pulsante) e inizializziamo la libreria con il comando

A questo punto eliminiamo il timer a riga #32, e dopo la funzione FastLED.show() aggiungiamo il comando

per tenere sotto controllo la pressione del pulsante. Il pulsante andrà collegato tra il BTN_PIN e GND, senza alcun resistore.

Per i più pigri, o per coloro che, alle prime armi, si sono persi per strada, aggiungiamo il codice sorgente:

Lanciamo il programma, e potremo modificare il nostro pattern al tocco di un pulsante. O magari simulando il tasto via software su di uno smartphone

Dissolvenza incrociata tra pattern

In video editing (ma anche in audio), una dissolvenza è il passaggio da una sorgente di segnale all’altra in modo morbido.

Immaginiamo di avere due sorgenti luminose con due pattern differenti: possiamo passare dalla prima alla seconda spostando un cursore, come nelle immagini di seguito:

Per ottenere un effetto simile occorre però modificare leggermente il programma:

Analizziamolo assieme.

Righe 8-10: creiamo i due pattern di ingresso ed un pattern ch rappresenta i valori di uscita.

RIghe 12-16: variabili che useremo per mixare i pattern.

Righe 18-21 il “solito” setup().

Righe 23-43: il loop() suddiviso in 3 sezioni: nella prima (Righe 25-33) viene chiamata la funzione blend() ogni 10 millisecondi, modificando il valore del missaggio (ultimo parametro) tra 0 e 255. La variabile booleana useOrigine1 determina se siamo in fase di incremento (il “potenziometro” si sposta da sinistra a destra, ed il valore cresce) o di decremento (nel qual caso il valore diminuisce). Ogni 5 secondi, invece, viene modificato il pattern sul quale si lavora, attraverso la funzione nextPattern(). Infine,ad ogni ciclo viene chiamata la funzione runPattern(), che si occupa di determinare quale dei 3 pattern dev’essere eseguito su ciascuno degli stream originali.

Righe 45-52: La funzione nextPattern().

Righe 54-66: la funzione runPattern().

Righe 68-108: Troviamo le definizioni dei pattern che avevamo già visto nei sorgenti precedenti. In questo programma, il passaggio da un pattern ad un altro non avverrà in modo temporizzato e brusco, bensì attraverso una dissolvenza incrociata tra i pattern.

Riflessioni

E anche per questa settimana abbiamo terminato. La prossima volta tenteremo di applicare quanto abbiamo appreso in teoria ad un progetto pratico vero e proprio.

Troverete i file sorgente con gli esempi proposti su GitHub come al solito.

A risentirci tra sette giorni!

Link utili

Parte dell’articolo si basa sulle lezioni online di Scott Marley.

Definire ciò che si è non risulta mai semplice o intuitivo, in specie quando nella vita si cerca costantemente di migliorarsi, di crescere tanto professionalmente quanto emotivamente. Lavoro per contribuire al mutamento dei settori cardine della computer science e per offrire sintesi ragionate e consulenza ad aziende e pubblicazioni ICT, ma anche perche’ ciò che riesco a portare a termine mi dà soddisfazione, piacere. Così come mi piace suonare (sax, tastiere, chitarra), cantare, scrivere (ho pubblicato 350 articoli scientfici e 3 libri sinora, ma non ho concluso ciò che ho da dire), leggere, Adoro la matematica, la logica, la filosofia, la scienza e la tecnologia, ed inseguo quel concetto di homo novus rinascimentale, cercando di completare quelle sezioni della mia vita che ancora appaiono poco ricche.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.