En la segunda parte del proyecto navideño, equipamos el dispositivo con un módulo de reproductor MP3, un amplificador y dos minialtavoces. También se agrega una pantalla LED WS2812B para mostrar mensajes de felicitación. También se pueden agregar imágenes si lo desea. Para hacer esto, se debe cambiar el boceto. Por último, añadimos cuatro ventiladores para crear el efecto de una tormenta de nieve. Para ello hay que añadir pequeños trozos de plumas de un plumero, ya que pesan poco y se mueven con una ligera corriente de aire dentro de la urna.
Si lo desea, puede omitir la urna transparente, haciendo que todo el proyecto luzca diferente incluso cuando los ventiladores no estén en uso. Comencemos a desarrollar esta segunda parte del proyecto.
Los materiales necesarios para todo el proyecto son:
-
1x PAM8403 Mini amplificador de audio digital 2x 3 vatios DC 5V Placa con potenciómetro
-
1x Módulo de relé de 4 canales 5V con disparador de bajo nivel con optoacoplador
-
2x Interfaz de aislamiento del disipador térmico del ventilador sin escobillas DC 3,3 V 5 V
-
1x Potenciómetro de 5 Kohmios
El software requerido es:
● IDE de Arduino
● Biblioteca Adafruit GFX (Arduino Adafruit_GFX.h)
● Biblioteca Adafruit NeoPixel (Arduino Adafruit_NeoPixel.h)
● SoftwareBiblioteca serial (SoftwareSerial.h)
● Biblioteca Adafruit_NeoMatrix (Adrafruit_NeoMatrix.h)
● Biblioteca DFPlayer Mini de DFRobot (DFRobotDFPlayerMini.h)
● Biblioteca SPI.h (incluida en el IDE de Arduino)
● 001.mp3
● 002.mp3
● 003.mp3
● cubo_de_nieve_parte_animada_2.ino
Los dibujos de los personajes son:
● Zug.jpg
Diagrama de circuito y descripción de los módulos utilizados en la segunda parte del proyecto.

Dibujo 2 – Dibujo del cubo de nieve, parte 2
Montaje del proyecto
Para completar la estructura del proyecto, se agregó un panel posterior para instalar la matriz de 256 LED WS2812B y toda la electrónica en esta parte posterior del panel. Para instalar el panel LED y un panel traslúcido (en este caso una hoja de papel blanca) se colocaron unos carriles en los que se insertan los bordes del panel LED y el panel traslúcido. Las dimensiones de la placa recién agregada se muestran en la siguiente imagen. También se añadió el dibujo de la parte inferior de la plataforma de los ventiladores y los ejes.

Figura 1 – Dimensiones del panel WS2812B

Imagen 2 - Panel WS2812B
Descripción del boceto.
Después de colocar el soporte para instalar la matriz LED WS2812B y los componentes electrónicos, comenzamos a analizar el boceto. Al comienzo de cada boceto, primero se deben insertar las bibliotecas necesarias para utilizar los módulos. En este caso, se requieren tres bibliotecas para utilizar el panel LED en este proyecto. Se requieren las siguientes tres bibliotecas para mostrar texto. la biblioteca Adafruit_GFX.h es necesario para mostrar gráficos primitivos como líneas, círculos, etc. Dado que nuestro panel LED es una cuadrícula de LED, también necesitamos la biblioteca Adafruit_NeoMatrix.h para poder controlar un grupo de LEDs en el panel. La última biblioteca que incluimos es Adafruit_NeoPixel.h, que se requiere para controlar los tres LED internos de cada LED.
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
lo siguiente Es necesario agregar bibliotecas: <SoftwareSerial.h>, que permite al microcontrolador habilitar cada pin digital para la comunicación en serie. Esto es necesario para utilizar el módulo de reproducción de MP3 y la consola serie para mostrar mensajes al inicio. <DFRobotDFPugadorMini.h> es la biblioteca que habilita las funciones necesarias para utilizar el módulo del reproductor MP3.
#include <SoftwareSerial.h>
#include <DFRobotDFPlayerMini.h>
A continuación, es necesario implementar un objeto para utilizar el módulo de reproducción de MP3. Este es el objeto miSoftwareSerial de la biblioteca <SoftwareSerial.h> Implementado para indicar al microcontrolador los pines digitales que se utilizarán para la comunicación serie con el módulo. En este proyecto, el pin digital 15 del microcontrolador se usa para recibir datos del módulo MP3 y el pin digital 14 se usa para enviar datos al módulo MP3. Para utilizar los métodos y comandos de control del módulo MP3, como por ejemplo: B. ajustar el volumen o comenzar a reproducir un archivo MP3, el objeto miDFPlayer de la biblioteca <DFRobotDFPugadorMini.h> creado.
SoftwareSerial mySoftwareSerial(15, 14);
DFRobotDFPlayerMini myDFPlayer;
La siguiente línea crea una primera constante con el número de LEDs (256) de la matriz de LEDs WS2812B y una segunda para indicar que la línea de datos de la matriz está conectada al puerto 16 del microcontrolador. Necesitamos estas dos constantes para poder trabajar con la matriz LED.
#define NUM_LEDS 256
#define PIN 16
Para poder controlar el módulo con 4 relés, el microcontrolador debe saber a qué puertos están conectadas las líneas de control individuales del módulo de relés. Para hacer esto, se crean 3 constantes, cuyos valores deben corresponder a los números de los puertos a los que están conectadas las líneas de control del módulo de relé.
#define FAN_1 17
#define FAN_2 18
#define FAN_3 19
Luego se crea un objeto con el nombre matriz de la biblioteca Adafruit_NeoMatrix.h implementado para mostrar texto en el panel LED. Los argumentos o parámetros a especificar son:
● Número de LEDs en el ancho y alto del panel (16 LEDs de ancho y 16 LEDs de alto) y el PIN del microcontrolador al que está conectada la línea de datos del panel.
● Ubicación del LED número 0 en el panel de control (el número de LED es 256, pero la numeración comienza en 0 y termina en 255). El LED 0 está ubicado en la parte inferior derecha del panel de control.
● Disposición de los LED en la Matriz y Numeración Consecutiva: Los LED están dispuestos en columnas de modo que cuando el LED número 0 está en la esquina inferior derecha, el LED número 1 es el superior. Cuando se llega al LED número 15 (primera columna y último LED), el siguiente LED (número 16) está a su izquierda, es decir, h. la numeración corre en zigzag como una serpiente.
● La disposición y el cableado de los tres LED internos, la disposición interna es verde, rojo y azul (NEO_GRB). El último parámetro es la frecuencia de trabajo (800 KHz).
Matriz Adafruit_NeoMatrix = Adafruit_NeoMatrix(16, 16, PIN,
NEO_MATRIX_BOTTOM + NEO_MATRIX_RIGHT +
NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,
NEO_GRB + NEO_KHZ800);
Entonces la variable debe x Se puede crear en el que primero se guarda el número de LEDs que tiene de ancho el panel. Este valor se establece con el comando matriz.ancho() determinado. Estos datos se crearon previamente cuando se creó el objeto. matriz entró. Esta variable está en una condición. si se utiliza para contar el número de columnas que deben moverse hacia la izquierda para mostrar un mensaje en el panel. Esta condición está dentro de un bucle. hacer mientras. La forma de presentar el texto se explicará más adelante.
entero x = matriz.ancho();
Después de implementar el objeto imagen de la librería Adafruit_NeoPixel.h con el número de los LED del panel, el pin de conexión al microcontrolador, la disposición y cable de los tres LED internos, la disposición interna de los LED es verde, rojo y azul (NEO_GRB). El valor final de los argumentos es la frecuencia de trabajo (800 KHz). Estos objetos y definiciones de colores posteriores son necesarios si representan imágenes en el panel LED, pero no es necesario que estén representados solo por texto.
Adafruit_NeoPixel imagen(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);
Se define una gama de colores, aunque no se utilicen todos.
uint32_t p_red = picture.Color(150,0,0);
uint32_t p_green = picture.Color(0,150,0);
uint32_t p_blue = picture.Color(0,0,150);
uint32_t p_yellow = picture.Color(150,150,0);
uint32_t p_purple = picture.Color(150,0,150);
uint32_t p_light_blue = picture.Color(0,150,150);
uint32_t p_white = picture.Color(150,150,150);
uint32_t p_maroon = picture.Color(150,51,0);
uint32_t p_black = picture.Color(0,0,0);
Las líneas creadas en la primera parte del proyecto, que representan la definición de los pines del microcontrolador a los que se conectarán los contactos del módulo L298N que controla cada motor, se mantienen sin cambios.
#define enable_Santa_motor 7
#define connection_1_Santa_motor 5
#define connection_2_Santa_motor 6
#define enable_train_motor 2
#define connection_1_train_motor 3
#define connection_2_train_motor 4
También se conservan las constantes de los seis LED, a los que se les asigna el número del puerto del microcontrolador al que están conectados.
#define led_house_1 8
#define led_house_2 9
#define led_house_3 10
#define led_house_4 11
#define led_house_5 12
#define led_house_6 13
Una vez agregadas las bibliotecas y definidas las variables requeridas para esta segunda parte del proyecto, se deben inicializar y configurar las condiciones iniciales de los módulos agregados. Esto se hace en el método configuración(), que comienza la descripción del código que contiene.
Primero, se deben inicializar y configurar los parámetros del panel LED para que pueda mostrar texto. El panel debe ser inicializado por el objeto. matriz con La matriz debe inicializarse. comenzar(); El texto debe comenzar su visualización en el lado derecho del panel y terminar en el izquierdo usando el comando matriz uso. establecerEnvoltura de texto(falso.falso) evita que el texto que aparece a la izquierda vuelva a aparecer a la derecha. El brillo de los LED se ajusta con el comando matriz.establecerBrillo(7) establezca un valor de 7 para mostrar el texto. Este es un brillo bajo. El color inicial del texto se establece con el comando matriz.setTextColor(matriz.Color(rojo, Verde, azul)) , ya que tanto el LED rojo como el verde muestran los valores 0 están completamente apagados y el LED azul con el valor 254 está encendido.
matrix.begin();
matrix.setTextWrap(false);
matrix.setBrightness(7);
matrix.setTextColor(matrix.Color(0, 0, 254));
Si desea mostrar gráficos en el panel LED, inicialice el objeto imagen con imagen. comenzar()para mostrar imágenes en el panel LED si lo desea. En este proyecto esto no se ha elegido pero se inicializa en este método y si desea mostrar imágenes solo necesita agregar el código requerido para que la imagen se muestre en el método. bucle() agregar. Termina con una pausa de 2 segundos.
picture.begin();
delay(2000);
A continuación, es necesario inicializar el módulo de reproducción de MP3 y comunicarlo con el microcontrolador. miSoftwareSerial.comenzar(9600), donde 9600 es la velocidad de transferencia de datos en baudios. Además, la comunicación con el monitor serie se realiza vía Serie.comenzar (115200) a una velocidad de 115200 baudios (la velocidad debe seleccionarse en la parte inferior derecha del Monitor Serial cuando se abre la consola) para mostrar los mensajes relacionados con el estado de inicialización o errores del módulo MP3. con la linea Serial.println („Navidad 2025: Bola de nieve”) Se envía un mensaje a la consola serie. Para ver este mensaje, es muy importante cambiar el valor de velocidad en la consola serie.
mySoftwareSerial.begin(9600);
Serial.begin(115200);
Serial.println ("Christmas 2025: Snow ball");
Lo siguiente que hay que comprobar en el código es la inicialización del módulo MP3. Esto se hace usando una declaración condicional. si usado. en la instrucción si El código entre llaves se ejecutará si la condición de su parámetro es verdadera. en este caso comprueba si el módulo MP3 no se ha inicializado por algún motivo. La inicialización negada fue con el símbolo ! escrito. Este símbolo se utiliza como método de negación para que si el módulo no se inicializa, la condición es verdadera y el código dentro de las llaves se ejecuta y la consola serie informa para verificar las conexiones y la inserción de la tarjeta microSD. Si el módulo de reproducción de MP3 se inicializa correctamente, la condición no se cumple y el código descrito anteriormente no se ejecutará. el metodo configuración () continuó ejecutándose a través de la consola serie con la línea Serie.println(F("Inicialización correcta de DFPlayer.")) para informar que el módulo de reproducción de MP3 se ha inicializado correctamente.
mySoftwareSerial.begin(9600);
Serial.begin(115200);
Serial.println ("Christmas 2025: Snow ball");
if (!myDFPlayer.begin(mySoftwareSerial)) {
Serial.println(F("Error initializing mp3 module:"));
Serial.println(F("1. Please check the connections!"));
Serial.println(F("2. Please insert the microSD memory!"));
while(true){
delay(0);
}
}
Serial.println(F("Correct DFPlayer initialization."));
Luego del código de inicialización del módulo MP3, se configuran los pines del microcontrolador que se utilizan para controlar los motores. Deben usarse como pines de señal de salida. modo pin(número_PIN, SALIDA) configurados porque necesitan enviar señales a los pines del módulo de control L298N.
pinMode(enable_Santa_motor,OUTPUT);
pinMode(connection_1_Santa_motor,OUTPUT);
pinMode(connection_2_Santa_motor,OUTPUT);
pinMode(enable_train_motor,OUTPUT);
pinMode(connection_1_train_motor,OUTPUT);
pinMode(connection_2_train_motor,OUTPUT);
Los pines del microcontrolador al que se conectan los LED de iluminación interior de las viviendas también deben configurarse como pines de señal de salida, ya que tienen que suministrar tensión para que los LED se enciendan.
pinMode(FAN_1, OUTPUT);
digitalWrite(FAN_1, HIGH);
pinMode(FAN_2, OUTPUT);
digitalWrite(FAN_2, HIGH);
pinMode(FAN_3, OUTPUT);
digitalWrite(FAN_3, HIGH);
Para programar el método configuración() Para finalizar solo queda configurar los puertos del microcontrolador a los que se conecta el módulo de relé que controla el encendido y apagado de los ventiladores. Estas deben ser salidas y el estado inicial debe ser alto, enviando 5Vdc al módulo de relé.
modo pin(FAN_1, SALIDA);
escritura digital(FAN_1, ALTA);
modo pin(FAN_2, SALIDA);
escritura digital(FAN_2, ALTA);
modo pin(FAN_3, SALIDA);
escritura digital(FAN_3, ALTA);
Una vez configuradas las condiciones iniciales de todos los módulos y componentes del proyecto, ahora se debe configurar el método. bucle() Ser programado para que todo el sistema realice los movimientos, sonidos y mensajes luminosos deseados. La primera línea muestra el volumen de la reproducción de sonido. miDFPlayer.volumen(20) establecido en un valor de 20 de 30, lo que da como resultado el archivo denominado 001.mp3 miDFPlayer.jugar (001) jugado. Este archivo debe almacenarse en la tarjeta microSD insertada en el módulo de reproducción de MP3 y reproducirá el sonido del silbato del tren exactamente cuando el tren comience a moverse. con la linea retraso(1700) establece el tiempo entre la preparación del archivo de audio y su reproducción.
myDFPlayer.volume(20);
myDFPlayer.play(001);
delay(1700);
A continuación se programa el movimiento del tren, utilizando la línea analógicoEscribir(número_pin, valor) la velocidad del motor se establece con un valor analógico cuyo valor máximo es 244. Los dos se utilizan para la dirección de rotación del motor. escritura digital(número_PIN, estado) Se utilizan líneas definidas. Si el motor gira en sentido contrario al deseado, esto se puede corregir cambiando el estado de estas dos líneas o intercambiando los cables entre el módulo L298N y el motor.
analogWrite(enable_train_motor,128);
digitalWrite(connection_1_train_motor,HIGH);
digitalWrite(connection_2_train_motor,LOW);
Para encender el LED, puede cambiar la posición del pin a la conexión. Normalmente, tiene un voltaje en una placa de microcontrolador o es reinicia, el estado inicial de los puertos es bajo (LOW), decae, no baja el voltaje, pero es necesario cambiar el estado a alto (HIGH) para obtener un voltaje de 5 Vcc. Se realiza con el comando digitalWrite(pin_number, STATE). Después de encender cada LED, se realizan en una pausa de 1 segundo.
digitalWrite(led_house_1, HIGH);
delay(1000);
digitalWrite(led_house_2, HIGH);
delay(1000);
digitalWrite(led_house_3, HIGH);
delay(1000);
digitalWrite(led_house_4, HIGH);
delay(1000);
digitalWrite(led_house_5, HIGH);
delay(1000);
digitalWrite(led_house_6, HIGH);
delay(1000);
Cuando todas las casas estén iluminadas, Papá Noel deberá comenzar a caminar por el pueblo, pero antes se deberá escuchar el repique de las campanas de los renos, para lo cual se deberá ajustar el volumen del sonido. myDFPlayer tiene un valor de 25 sobre 30. volumen(25), entonces se incluye el archivo con el nombre 002.mp3 miDFPlayer. jugar(002). Este archivo debe guardarse en la tarjeta microSD insertada en el módulo de reproducción de MP3 y reproduce el sonido de las campanas. con la linea retraso(800) establece el tiempo entre la preparación del archivo de audio y su reproducción.
myDFPlayer.volume(25);
myDFPlayer.play(002);
delay(800);
Entonces Santa comienza a girar alrededor del pueblo cuando la línea analógicoEscribir(número_pin, valor) se ejecuta. La velocidad del motor se fija con un valor analógico, cuyo valor máximo es 244, como ya se mencionó en la primera parte. La velocidad era demasiado alta, pero si el valor de esta variable es inferior a 128, el motor no girará, por lo que se decidió instalar un potenciómetro de 5 Kohm. En la línea de polaridad positiva que va desde el módulo L298N al motor, la velocidad deseada se establece ajustando el valor de este potenciómetro. Los dos se utilizan para la dirección de rotación del motor. escritura digital(número_PIN, estado) Se utilizan líneas definidas. Si el motor de Santa gira en la dirección opuesta, esto se puede corregir cambiando el estado de estos dos cables o intercambiando los cables del módulo L298N al motor. con la linea retraso(2000) Hay una pausa de 2 segundos hasta que se ejecuta la siguiente línea de código.
analogWrite(enable_Santa_motor,128);
digitalWrite(connection_1_Santa_motor,HIGH);
digitalWrite(connection_2_Santa_motor,LOW);
delay(2000);
Luego se ajusta el volumen de la reproducción del sonido. miDFPlayer.volumen(15) establezca un valor de 15 de 30 para incluir el archivo de audio denominado 003.mp3 miDFPlayer. jugar(003) conjunto. Este archivo debe guardarse en la tarjeta microSD insertada en el módulo del reproductor MP3 y reproduce una melodía navideña.
miDFPlayer.volumen(15);
miDFPlayer.jugar(003);
Las siguientes tres líneas cambian el estado de los puertos a los que está conectado el módulo de relé de "alto" a "bajo", lo que hace que el módulo de relé active los tres relés y los ventiladores se energicen y comiencen a girar, introduciendo aire en la urna, lo que debería hacer que las escamas se muevan en todas direcciones.
escritura digital(FAN_1,BAJO);
escritura digital(FAN_2,BAJO);
escritura digital(FAN_3,BAJO);
Luego la siguiente línea de código mostrar_mensaje_az() ejecutado. Esta línea es una llamada para ejecutar el método con ese nombre, que ejecuta el código contenido en ese método. Una vez completada la ejecución, el programa regresa a la línea retraso (3000) ejecutado para tomar una pausa de 3 segundos antes de la siguiente línea de código bucle() se ejecuta.
show_message_az();
Si el método mostrar_mensaje_az() se llama, se ejecutará y habrá un bucle dentro de sus llaves hacer mientrasque se ejecutará siempre que se cumpla la condición mientras es verdad. Como recordamos, la variable fue x originalmente inicializado con el número de LEDs que tiene el panel de ancho, es decir 16. Este bucle se ejecuta hasta que se cumpla la condición mientras el valor x alcanzado por -109, que es la última ejecución, ya que -109 es mayor que -110 (son números negativos), el bloque de comando hacer ejecutado.
vacío mostrar_message_az() {
hacer {
…
…
…
} mientras (x > -110);
}
Dentro del bucle hacer La primera instrucción a ejecutar es apagar todos los LED del panel con la instrucción matriz.llenar pantalla(0). La segunda declaración establece el color del texto. matriz.establecerTextColor(matriz.Color(254, 0, 0)) puesto en rojo, con matriz. establecercursor(x, 5) el cursor se coloca en la columna 16 (es decir, la primera columna se mueve 16 posiciones hacia la izquierda) y la línea 5, luego se incluye el texto que se mostrará en el panel matriz. imprimir(F(" De AZ-Delivery ")). La siguiente condición si es un contador que comienza en 16 y llega hasta -110. Se utiliza para establecer el valor del cursor. x (las columnas) para mostrar el texto y dar la impresión de movimiento. Disminuye en una unidad y ejecuta la siguiente instrucción, a saber matriz.mostrar(), que enciende los LED correspondientes a esa posición. con retraso(35) Habrá una pausa de 35 milisegundos ya que este es el final del ciclo. Luego se realizará la revisión mientras ejecutado que dice que el bucle comienza desde el principio siempre que el valor de x es mayor que -110. En resumen, configura el color del texto, mueve las columnas y enciende los LED correspondientes para mostrar cada parte de las letras del texto y con el retraso de 35 milisegundos da la impresión de movimiento en el texto.
matriz.establecerTextColor(matriz.Color(254, 0, 0));
matriz.establecercursor(x, 5);
matriz.imprimir(F("De AZ-Delivery "));
si(--x < -110) {
x = matriz.ancho();
}
matriz.mostrar();
retraso(35);
Una vez que se completa este método, regresa a la siguiente declaración desde la cual se realizó la llamada, ejecutando así una espera de 3 segundos.
retraso(3000);
Con las llamadas a los métodos. mostrar_mensaje_alemania() y mostrar_mensaje_español() Estos métodos se llevan a cabo de acuerdo con el método explicado anteriormente. mostrar_mensaje_az() parecerse.
Si quieres imágenes además de texto en tu publicación de blog de Navidad 2022”3er Adviento: Adornos navideños LED animados – ACTUALIZACIÓN”Aquí hay instrucciones sobre cómo mostrar imágenes tanto en la placa AZ-MEGA2560 como en la placa AZ-ATmega328.
Este proyecto también se puede realizar sin ventiladores y sin la urna transparente. El aspecto es diferente, pero aun así crea una sensación única.
Nosotros de AZ-Delivery Vertriebs GmbH le desea una Feliz Navidad, un próspero Año Nuevo y mucha diversión con su familia.






