Nella seconda parte del progetto natalizio dotiamo il dispositivo di un modulo lettore MP3, un amplificatore e due mini altoparlanti. Viene inoltre aggiunto un display LED WS2812B per visualizzare i messaggi di congratulazioni. Se lo si desidera è anche possibile aggiungere immagini. Per fare ciò, lo schizzo deve essere modificato. Infine, aggiungiamo quattro ventole per creare l'effetto di una tempesta di neve. Per fare questo bisogna aggiungere dei pezzetti di piume provenienti da un piumino, poiché pesano poco e si muovono con una leggera corrente d'aria all'interno dell'urna.
Se lo si desidera, è possibile omettere l'urna trasparente, dando così un aspetto diverso all'intero progetto anche quando i ventilatori non sono in uso. Iniziamo a sviluppare questa seconda parte del progetto.
I materiali necessari per l’intero progetto sono:
-
1x PAM8403 Mini amplificatore audio digitale Scheda 2x 3 Watt DC 5V con potenziometro
-
1x Modulo relè a 4 canali 5 V con trigger di basso livello fotoaccoppiatore
-
2x Interfaccia di isolamento del dissipatore di calore della ventola DC brushless 3,3 V 5 V
-
1x Potenziometro da 5 Kohm
Il software richiesto è:
● IDE di Arduino
● Libreria Adafruit GFX (Arduino Adafruit_GFX.h)
● Libreria Adafruit NeoPixel (Arduino Adafruit_NeoPixel.h)
● Libreria SoftwareSerial (SoftwareSerial.h)
● Libreria Adafruit_NeoMatrix (Adrafruit_NeoMatrix.h)
● Libreria DFPlayer Mini di DFRobot (DFRobotDFPlayerMini.h)
● Libreria SPI.h (inclusa nell'IDE di Arduino)
● 001.mp3
● 002.mp3
● 003.mp3
● snow_cube_animated_part_2.ino
I disegni dei personaggi sono:
● Zug.jpg
Schema elettrico e descrizione dei moduli utilizzati nella seconda parte del progetto

Disegno 2 – Disegno del cubo di neve, parte 2
Assemblaggio del progetto
Per completare la struttura del progetto, è stato aggiunto un pannello posteriore per installare la matrice da 256 LED WS2812B e tutta l'elettronica su questo retro del pannello. Per installare il pannello LED e un pannello traslucido (in questo caso un foglio di carta bianco), sono state fissate delle guide nelle quali si inseriscono i bordi del pannello LED e del pannello traslucido. Le dimensioni della piastra appena aggiunta sono mostrate nell'immagine seguente. Aggiunto anche il disegno della parte inferiore della piattaforma delle ventole e degli alberi.

Figura 1 – Dimensioni del pannello WS2812B

Immagine 2 - Pannello WS2812B
Descrizione dello schizzo
Dopo aver fissato la staffa per l'installazione della matrice LED WS2812B e dei componenti elettronici, iniziamo ad analizzare lo schizzo. All'inizio di ogni sketch occorre prima inserire le librerie necessarie all'utilizzo dei moduli. In questo caso, sono necessarie tre librerie per utilizzare il pannello LED in questo progetto. Per visualizzare il testo sono necessarie le tre librerie seguenti. La biblioteca Adafruit_GFX.h è necessaria per visualizzare elementi grafici primitivi come linee, cerchi, ecc. Poiché il nostro pannello LED è una griglia LED, abbiamo bisogno anche della libreria Adafruit_NeoMatrix.h poter controllare un gruppo di LED sul pannello. L'ultima libreria che includiamo è Adafruit_NeoPixel.h, necessario per controllare i tre LED interni di ciascun LED.
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
Il seguente È necessario aggiungere le librerie: <SoftwareSerial.h>, che consente al microcontrollore di abilitare ciascun pin digitale per la comunicazione seriale. Ciò è necessario per utilizzare il modulo di riproduzione MP3 e la console seriale per visualizzare i messaggi all'avvio. <DFRobotDFPlayerMini.h> è la libreria che abilita le funzioni necessarie all'utilizzo del modulo lettore MP3.
#include <SoftwareSerial.h>
#include <DFRobotDFPlayerMini.h>
Successivamente è necessario implementare un oggetto per utilizzare il modulo di riproduzione MP3. Questo è l'oggetto mySoftwareSerial dalla biblioteca <SoftwareSerial.h> implementato per indicare al microcontrollore i pin digitali da utilizzare per la comunicazione seriale con il modulo. In questo progetto, il pin digitale 15 del microcontrollore viene utilizzato per ricevere dati dal modulo MP3 e il pin digitale 14 viene utilizzato per inviare dati al modulo MP3. Per utilizzare i metodi e i comandi di controllo del modulo MP3, come ad esempio: B. regolare il volume o avviare la riproduzione di un file MP3, l'oggetto mioDFPlayer dalla biblioteca <DFRobotDFPlayerMini.h> creato.
SoftwareSerial mySoftwareSerial(15, 14);
DFRobotDFPlayerMini mioDFPlayer;
La riga successiva crea una prima costante con il numero di LED (256) della matrice LED WS2812B ed una seconda per indicare che la linea dati della matrice è collegata alla porta 16 del microcontrollore. Abbiamo bisogno di queste due costanti per poter lavorare con la matrice LED.
#define NUM_LED 256
#define PIN16
Per poter controllare il modulo con 4 relè, il microcontrollore deve sapere a quali porte sono collegate le singole linee di controllo del modulo relè. Per fare ciò vengono create 3 costanti i cui valori devono corrispondere ai numeri delle porte a cui sono collegate le linee di controllo del modulo relè.
#define VENTOLA_1 17
#define VENTOLA_2 18
#define VENTOLA_3 19
Viene quindi creato un oggetto con il nome matrice dalla biblioteca Adafruit_NeoMatrix.h implementato per visualizzare il testo sul pannello LED. Gli argomenti o parametri da specificare sono:
● Numero di LED in larghezza e altezza del pannello (16 LED in larghezza e 16 LED in altezza) e il PIN del microcontrollore a cui è collegata la linea dati del pannello.
● Posizione del LED numero 0 sul pannello di controllo (il numero di LED è 256, ma la numerazione inizia da 0 e termina con 255). Il LED 0 si trova in basso a destra sul pannello di controllo.
● Disposizione dei LED nella matrice e numerazione consecutiva: I LED sono disposti in colonne in modo che quando il LED numero 0 si trova nell'angolo in basso a destra, il LED numero 1 è quello in alto. Quando viene raggiunto il LED numero 15 (prima colonna e ultimo LED), il LED successivo (numero 16) si trova alla sua sinistra, cioè h. la numerazione corre a zigzag come un serpente.
● La disposizione e il cablaggio dei tre LED interni, la disposizione interna è verde, rosso e blu (NEO_GRB). L'ultimo parametro è la frequenza di lavoro (800 KHz).
Matrice Adafruit_NeoMatrix = Adafruit_NeoMatrix(16, 16, PIN,
NEO_MATRIX_BOTTOM + NEO_MATRIX_RIGHT +
NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,
NEO_GRB + NEO_KHZ800);
Quindi la variabile deve x può essere creato in cui viene prima salvato il numero di led che il pannello ha in larghezza. Questo valore viene impostato con il comando matrice.larghezza() determinato. Questi dati sono stati creati in precedenza al momento della creazione dell'oggetto matrice inserito. Questa variabile è in una condizione se utilizzato per contare il numero di colonne che devono essere spostate a sinistra per visualizzare un messaggio sul pannello. Questa condizione è all'interno di un ciclo fai-mentre. La modalità di presentazione del testo verrà spiegata più avanti.
int x = matrice.larghezza();
Dopo aver implementato l'oggetto immagine della libreria Adafruit_NeoPixel.h con il numero dei led del pannello, il pin di collegamento al microcontrollore, la disposizione e il cavo dei tre led interni, la disposizione interna dei led è verde, rosso e blu (NEO_GRB). Il valore ultimo degli argomenti è la frequenza di lavoro (800 KHz). Questi oggetti e le definizioni dei colori posteriori sono necessari se rappresentano le immagini nel pannello LED, ma non è necessario che siano rappresentati da soli tramite testo.
Adafruit_NeoPixel immagine (NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);
Viene definita una gamma di colori, anche se non tutti vengono utilizzati.
uint32_t p_red = immagine.Colore(150,0,0);
uint32_t p_green = immagine.Colore(0,150,0);
uint32_t p_blu = immagine.Colore(0,0,150);
uint32_t p_giallo = immagine.Colore(150,150,0);
uint32_t p_viola = immagine.Colore(150,0,150);
uint32_t p_light_blue = immagine.Colore(0,150,150);
uint32_t p_bianco = immagine.Colore(150,150,150);
uint32_t p_marrone = immagine.Colore(150,51,0);
uint32_t p_nero = immagine.Colore(0,0,0);
Rimangono invariate le linee realizzate nella prima parte del progetto, che rappresentano la definizione dei pin del microcontrollore a cui saranno collegati i contatti del modulo L298N che controlla ciascun motore.
#define abilita_Santa_motore 7
#define connessione_1_Santa_motore 5
#define connessione_2_Santa_motore 6
#define abilita_treno_motore 2
#define connessione_1_treno_motore 3
#define connessione_2_treno_motore 4
Vengono mantenute anche le costanti dei sei LED, ai quali è assegnato il numero della porta del microcontrollore a cui sono collegati.
#define casa_led_1 8
#define casa_led_2 9
#define led_house_3 10
#define led_house_4 11
#define led_house_5 12
#define led_house_6 13
Dopo aver aggiunto le librerie e definito le variabili necessarie per questa seconda parte del progetto, è necessario inizializzare e impostare le condizioni iniziali dei moduli aggiunti. Questo viene fatto nel metodo impostazione(), che inizia la descrizione del codice in esso contenuto.
Innanzitutto, i parametri del pannello LED devono essere inizializzati e configurati in modo che possa visualizzare il testo. Il pannello deve essere inizializzato dall'oggetto matrice con la matrice deve essere inizializzata. iniziare(); Il testo deve iniziare la sua visualizzazione sul lato destro del pannello e terminare a sinistra utilizzando il comando matrice utilizzare. setTextWrap(false.false) impedisce che il testo visualizzato a sinistra appaia nuovamente a destra. La luminosità dei led si regola con il comando matrice.setLuminosità(7) impostare su un valore pari a 7 per visualizzare il testo. Questa è una luminosità bassa. Il colore iniziale del testo si imposta con il comando matrice.setTextColor(matrice.Colore(Rosso, Verde, Blu)) , poiché sia il LED rosso che quello verde visualizzano i valori 0 sono completamente spenti ed il led blu con il valore 254 è acceso.
matrice.iniziare();
matrice.setTextWrap(false.false);
matrice.setLuminosità(7);
matrice.setTextColor(matrice.Colore(0, 0, 254));
Se si desidera visualizzare la grafica sul pannello LED, inizializzare l'oggetto immagine con immagine. iniziare()per visualizzare le immagini sul pannello LED, se lo si desidera. In questo progetto questo non è stato scelto ma è inizializzato in questo metodo e se vuoi visualizzare le immagini devi solo aggiungere il codice richiesto affinché l'immagine venga visualizzata nel metodo ciclo() aggiungere. Termina con una pausa di 2 secondi.
immagine.iniziare();
ritardo(2000);
Successivamente, il modulo di riproduzione MP3 deve essere inizializzato e comunicato con il microcontrollore mySoftwareSerial.iniziare(9600), dove 9600 è la velocità di trasferimento dati in baud. Inoltre, la comunicazione con il monitor seriale avviene tramite Seriale.iniziare (115200) ad una velocità di 115200 baud (la velocità va selezionata in basso a destra sul Monitor Seriale all'apertura della console) per poter visualizzare i messaggi riguardanti lo stato di inizializzazione o errori del modulo MP3. Con la linea Serial.println („Natale 2025: Palla di neve”) viene inviato un messaggio alla console seriale. Per visualizzare questo messaggio è molto importante modificare il valore della velocità nella console seriale.
mySoftwareSerial.iniziare(9600);
Seriale.iniziare(115200);
Seriale.println ("Natale 2025: Palla di neve");
La prossima cosa da controllare nel codice è l'inizializzazione del modulo MP3. Questo viene fatto utilizzando un'istruzione condizionale se usato. Nelle istruzioni se Il codice tra parentesi graffe verrà eseguito se la condizione del suo parametro è vera. In questo caso controlla se il modulo MP3 non è stato inizializzato per qualche motivo. L'inizializzazione negata era con il simbolo ! scritto. Questo simbolo viene utilizzato come metodo di negazione in modo che se il modulo non viene inizializzato, la condizione è vera e viene eseguito il codice all'interno delle parentesi graffe e la console seriale segnala di verificare le connessioni e l'inserimento della scheda microSD. Se il modulo di riproduzione MP3 è inizializzato correttamente, la condizione non è soddisfatta e il codice sopra descritto non verrà eseguito. Il metodo impostazione () ha continuato a funzionare tramite la console seriale con la linea Seriale.println(F("Corretta inizializzazione di DFPlayer.")) per segnalare che il modulo di riproduzione MP3 è stato inizializzato correttamente.
mySoftwareSerial.iniziare(9600);
Seriale.iniziare(115200);
Seriale.println ("Natale 2025: Palla di neve");
se (!mioDFPlayer.iniziare(mySoftwareSerial)) {
Seriale.println(F("Errore durante l'inizializzazione del modulo mp3:"));
Seriale.println(F("1. Controlla i collegamenti!"));
Seriale.println(F("2. Inserisci la memoria microSD!"));
mentre(vero){
ritardo(0);
}
}
Seriale.println(F("Inizializzazione DFPlayer corretta."));
Dopo il codice di inizializzazione del modulo MP3, vengono configurati i pin del microcontrollore utilizzati per controllare i motori. Devono essere utilizzati come pin del segnale di uscita pinMode(numero_pin, USCITA) configurati perché devono inviare segnali ai pin del modulo di controllo L298N.
pinMode(abilita_Santa_motor,USCITA);
pinMode(connessione_1_Santa_motor,USCITA);
pinMode(connessione_2_Santa_motor,USCITA);
pinMode(abilita_treno_motore,USCITA);
pinMode(connessione_1_treno_motore,USCITA);
pinMode(connessione_2_treno_motore,USCITA);
Anche i pin del microcontrollore a cui sono collegati i led per l'illuminazione interna delle case devono essere configurati come pin di segnale in uscita, poiché devono fornire tensione affinché i led si accendano.
pinMode(casa_led_1,USCITA);
pinMode(casa_led_2,USCITA);
pinMode(casa_led_3,USCITA);
pinMode(casa_led_4,USCITA);
pinMode(casa_led_5,USCITA);
pinMode(casa_led_6,USCITA);
Per programmare il metodo impostazione() Per completare non resta che configurare le porte del microcontrollore a cui è collegato il modulo relè che comanda l'accensione e lo spegnimento delle ventole. Queste devono essere uscite e lo stato iniziale deve essere alto, inviando 5 V CC al modulo relè.
pinMode(VENTOLA_1, USCITA);
digitalWrite(VENTOLA_1, ALTO);
pinMode(VENTOLA_2, USCITA);
digitalWrite(VENTOLA_2, ALTO);
pinMode(VENTOLA_3, USCITA);
digitalWrite(VENTOLA_3, ALTO);
Dopo aver configurato le condizioni iniziali di tutti i moduli e componenti del progetto, è ora necessario configurare il metodo ciclo() essere programmato affinché l'intero sistema esegua i movimenti, i suoni ed i messaggi luminosi desiderati. La prima riga mostra il volume della riproduzione audio mioDFPlayer.volume(20) impostato su un valore di 20 su 30, ottenendo il file denominato 001.mp3 mioDFPlayer.giocare (001) giocato. Questo file dovrà essere memorizzato sulla scheda microSD inserita nel modulo di riproduzione MP3 e riprodurrà il fischio del treno esattamente quando il treno inizierà a muoversi. Con la linea ritardo(1700) imposta il tempo che intercorre tra la preparazione del file audio e la sua riproduzione.
mioDFPlayer.volume(20);
mioDFPlayer.giocare(001);
ritardo(1700);
Successivamente, viene programmato il movimento del treno, utilizzando la linea analogWrite(numero_pin, valore) la velocità del motore è impostata con un valore analogico il cui valore massimo è 244. I due servono per il senso di rotazione del motore digitalWrite(numero_pin, stato) vengono utilizzate linee definite. Se il motore ruota nella direzione opposta a quella desiderata, è possibile correggere il problema modificando lo stato di queste due linee o scambiando i cavi tra il modulo L298N e il motore.
analogWrite(abilita_treno_motore,128);
digitalWrite(connessione_1_treno_motore,ALTO);
digitalWrite(connessione_2_treno_motore,BASSO);
Per accendere il LED, è possibile modificare la posizione del pin sulla connessione. Normalmente, ha una tensione su una scheda del microcontrollore o è reinicia, lo stato iniziale delle porte è basso (LOW), diminuisce, non c'è tensione inferiore, ma è necessario cambiare lo stato in alto (HIGH) per ottenere una tensione di 5 Vcc. Si realizza con il comando digitalWrite(pin_number, STATE). Dopo l'accensione di ogni LED, vengono realizzati in una pausa di 1 secondo.
digitalWrite(casa_led_1, ALTO);
ritardo(1000);
digitalWrite(casa_led_2, ALTO);
ritardo(1000);
digitalWrite(casa_led_3, ALTO);
ritardo(1000);
digitalWrite(casa_led_4, ALTO);
ritardo(1000);
digitalWrite(casa_led_5, ALTO);
ritardo(1000);
digitalWrite(casa_led_6, ALTO);
ritardo(1000);
Quando tutte le case saranno illuminate, Babbo Natale dovrebbe iniziare a passeggiare per il villaggio, ma prima si dovrebbe sentire il suono dei campanelli delle renne, per il quale il volume del suono dovrebbe essere regolato myDFPlayer è impostato su un valore di 25 su 30. volume(25), viene incluso il file con il nome 002.mp3 mioDFPlayer. giocare(002). Questo file deve essere salvato sulla scheda microSD inserita nel modulo di riproduzione MP3 e riproduce il suono delle campane. Con la linea ritardo(800) imposta il tempo che intercorre tra la preparazione del file audio e la sua riproduzione.
mioDFPlayer.volume(25);
mioDFPlayer.giocare(002);
ritardo(800);
Quindi Babbo Natale inizia a ruotare intorno al villaggio quando si forma la fila analogWrite(numero_pin, valore) viene eseguito. La velocità del motore viene impostata con un valore analogico, il cui valore massimo è 244, come già accennato nella prima parte. La velocità era troppo elevata, ma se il valore di questa variabile è inferiore a 128 il motore non ruoterà, motivo per cui si è deciso di installare un potenziometro da 5 Kohm. Nella linea di polarità positiva che porta dal modulo L298N al motore, la velocità desiderata viene impostata regolando il valore di questo potenziometro. Entrambi vengono utilizzati per il senso di rotazione del motore digitalWrite(numero_pin, stato) vengono utilizzate linee definite. Se il motore di Babbo Natale gira nella direzione opposta, è possibile correggere il problema modificando lo stato di questi due fili o scambiando i cavi dal modulo L298N al motore. Con la linea ritardo(2000) C'è una pausa di 2 secondi prima dell'esecuzione della riga di codice successiva.
analogWrite(abilita_Santa_motor,128);
digitalWrite(connessione_1_Santa_motor,ALTO);
digitalWrite(connessione_2_Santa_motor,BASSO);
ritardo(2000);
Successivamente viene regolato il volume della riproduzione audio mioDFPlayer.volume(15) impostato su un valore di 15 su 30 per includere il file audio denominato 003.mp3 mioDFPlayer. giocare(003) impostare. Questo file deve essere salvato sulla scheda microSD inserita nel modulo lettore MP3 e riproduce una melodia natalizia.
mioDFPlayer.volume(15);
mioDFPlayer.giocare(003);
Le tre righe seguenti cambiano lo stato delle porte a cui è collegato il modulo relè da "alto" a "basso", il che fa sì che il modulo relè attivi i tre relè e le ventole vengano energizzate e inizino a girare, introducendo aria nell'urna, che dovrebbe far muovere i fiocchi in tutte le direzioni.
digitalWrite(VENTOLA_1,BASSO);
digitalWrite(VENTOLA_2,BASSO);
digitalWrite(VENTOLA_3,BASSO);
Quindi la riga di codice successiva mostra_messaggio_az() eseguito. Questa riga è una chiamata per eseguire il metodo con quel nome, che esegue il codice contenuto in quel metodo. Al termine dell'esecuzione, il programma ritorna alla riga ritardo (3000) eseguito per fare una pausa di 3 secondi prima della riga di codice successiva ciclo() viene eseguito.
mostra_messaggio_az();
Se il metodo mostra_messaggio_az() viene chiamato, verrà eseguito e sarà presente un ciclo tra le parentesi graffe fai-mentreche verrà eseguito finché la condizione sarà soddisfatta mentre è vero. Come ricordiamo, la variabile era x inizialmente inizializzato con il numero di led che il pannello ha in larghezza, cioè 16. Questo ciclo viene eseguito finché non si verifica la condizione mentre il valore x raggiunto da -109, che è l'ultima esecuzione, poiché -109 è maggiore di -110 (sono numeri negativi), il blocco comandi fare eseguito.
vuoto mostra_messaggio_az() {
fare {
…
…
…
} mentre (x > -110);
}
All'interno del circuito fare La prima istruzione da eseguire è spegnere tutti i LED sul pannello con l'istruzione matrice.fillScreen(0). La seconda istruzione imposta il colore del testo matrice.setTextColor(matrice.Colore(254, 0, 0)) impostato su rosso, con matrice. setCursor(x, 5) il cursore viene posizionato nella colonna 16 (ovvero la prima colonna viene spostata di 16 posizioni a sinistra) e nella riga 5, quindi viene incluso il testo che deve essere visualizzato nel pannello matrice. stampa(F(" Da AZ-Delivery ")). La seguente condizione se è un contatore che inizia da 16 e arriva a -110. Viene utilizzato per impostare il valore del cursore x (le colonne) per mostrare il testo e dare l'impressione di movimento. Diminuisce di un'unità ed esegue l'istruzione successiva, vale a dire matrice.spettacolo(), che accende i LED corrispondenti a quella posizione. Con ritardo(35) Ci sarà una pausa di 35 millisecondi poiché questa è la fine del ciclo. Successivamente verrà effettuata la revisione mentre eseguito che dice che il ciclo ricomincia dall'inizio purché il valore di x è maggiore di -110. Per riassumere, configura il colore del testo, sposta le colonne e accendi i led corrispondenti per visualizzare ogni parte delle lettere del testo e con il ritardo di 35 millisecondi dà l'impressione di movimento nel testo.
matrice.setTextColor(matrice.Colore(254, 0, 0));
matrice.setCursor(x, 5);
matrice.stampa(F("Da AZ-Delivery "));
se(--x < -110) {
x = matrice.larghezza();
}
matrice.spettacolo();
ritardo(35);
Una volta completato, questo metodo ritorna all'istruzione successiva da cui è stata effettuata la chiamata, eseguendo quindi un'attesa di 3 secondi.
ritardo(3000);
Con i richiami ai metodi mostra_messaggio_germania() e show_message_spanish() Questi metodi vengono eseguiti secondo il metodo precedentemente spiegato mostra_messaggio_az() assomigliare.
Se vuoi immagini oltre al testo nel tuo post sul blog di Natale 2022 “3° Avvento: decorazioni natalizie animate a LED – AGGIORNAMENTO" ecco le istruzioni su come visualizzare le immagini sia sulla scheda AZ-MEGA2560 che sulla scheda AZ-ATmega328.
Questo progetto può essere realizzato anche senza ventilatori e senza l'urna trasparente. L'aspetto è diverso, ma crea comunque una sensazione unica.
Noi da AZ-Delivery Vertriebs GmbH vi augura un buon Natale, un anno nuovo di successo e tanto divertimento con la vostra famiglia.






