El siguiente proyecto consiste en el diseño e implementación de un reproductor de música, utilizando un microcontrolador, una pantalla táctil y un módulo MP3.
La programación del microcontrolador establece una comunicación mediante el protocolo RS232 con el módulo reproductor y la pantalla Nextion, para enviar y recibir los comandos correspondientes para la reproducción de la música alojada en la memoria microSD insertada en el módulo MP3. También se programó un módulo de reloj mediante la comunicación I2C para mostrar la hora en la pantalla.
@microchipotle Dispositivo con pantalla táctil @Justway #electronica #programacion #mecatronica #microchip #arduino ♬ sonido original - Microchipotle
Circuito Reproductor MP3 con pantalla Nextion

Materiales:
- PIC16F1786
- Módulo MP3: DFPlayer mini MP3
- Memoria micro SD
- Pantalla Nextion: NX3224T024
- Módulo de reloj: DS3231
- Bocina: 8 ohms 3W
- Resistencia: 1K
Código PIC
El código de programación está realizado en PIC C Compiler, utilizando el microcontrolador PIC16F1786.
#include "stdlib.h"
#FUSES NOMCLR
#use i2c(Master, fast, sda=PIN_C4, scl=PIN_C3, STREAM=DS3231_STREAM)
#use rs232(baud=9600, stop=1, parity=N, xmit=PIN_C6, rcv=PIN_C7, bits=8, stream=NEXTION)
#use rs232(FORCE_SW, baud=9600, stop=1, parity=N, xmit=PIN_C5, bits=8, stream=DFPLAYER)
#include "mp3tf16p.c"//Libreria Modulo DF PLAYER
#include "DS3231.c"//Libreria Modulo I2C DS3231
#define busy input(PIN_C2)
char recibido[15];
int estado=1;
int8 horas=0, minutos=0, segundos=0;
int8 num_horas;
RTC_Time *reloj;
void datos();
#int_rda
void rda_isr()
{
memset(recibido, 0, sizeof(recibido)); //limpia los registros de la variable
int8 i=0;
while(true)
{
recibido[i] = fgetc(NEXTION);//RECIBE EL CARACTER
if (recibido[i] == 255 ){return;} //inicio de pantalla nextion
if(recibido[i] == '\n')//busca el salto de linea \r\n
{
recibido[i-1] = '\0'; // \r = \0 (caracter nulo)
recibido[i] = '\0'; // \n = \0 (caracter nulo)
datos();
return;
}
i++;
}
}
void datos()
{
char comand[5];
char num[2];
char play[5] = "play";
char paus[5] = "paus";
char next[5] = "next";
char prev[5] = "prev";
char vol_[5] = "vol_";
char fold[5] = "fold";
char hora[5] = "hora";
char minu[5] = "minu";
memset(comand, 0, sizeof(comand)); //limpia los registros de la varible comand
memset(num, 0, sizeof(num)); //limpia los registros de la varible num
for (int i=0; i<=3; ++i)
{
comand[i] = recibido[i]; //guarda el comando caracter 0-3
}
num[0] = recibido[4]; //guarda el caracter 5 recibido
num[1] = recibido[5]; //guarda el caracter 6 recibido
// si el comando recibido es igual a comando ejecuta la subrutina
if(strcmp(comand, play)==0)//compara, si son iguales (0), no (+-1)
{
estado=0;
df_resume(); //reproduce la pista
return;
}
if(strcmp(comand, paus)==0)
{
estado=1;
df_pause(); //pausa la pista
return;
}
if(strcmp(comand, next)==0)
{
estado=0;
df_next(); //siguiente pista
return;
}
if(strcmp(comand, prev)==0)
{
estado=0;
df_prev(); //pista anterior
return;
}
// establce el vulumen "**"
//atoi convierte los caracteres NUM en entero
if(strcmp(comand, vol_)==0)
{
df_set_volume(atoi(num)); // establece el volumen "**"
return;
}
// Accede a la carpeta "num" y reproduce la pista 1
if(strcmp(comand, fold)==0)
{
estado=0;
df_play_folder((unsigned int8)atoi(num),1);
return;
}
//Guarda los caracteres NUM en entero
if(strcmp(comand, hora)==0)
{
num_horas = atoi(num);
return;
}
//Cambia la hora en el módulo ds3231
if(strcmp(comand, minu)==0)
{
reloj->hours = num_horas;
reloj->minutes = atoi(num);
reloj->seconds = segundos;
RTC_Set(reloj);
return;
}
}
void main()
{
enable_interrupts(int_rda);
enable_interrupts(global);
delay_ms(3000); //Tiempo de inicio DFPLAYER
df_set_volume(15); //Cambia el volumen a 15
while(TRUE)
{
reloj = RTC_Get();
horas = reloj->hours;
minutos = reloj->minutes;
//Actualiza la hora en la pantalla nextion
fprintf(NEXTION,"t0.txt=\"%02d\"",horas); //objname.txt=valor
putc(0xFF,NEXTION); //datos para recepcion en pantalla nextion
putc(0xFF,NEXTION); //
putc(0xFF,NEXTION); //
delay_ms(200);
fprintf(NEXTION,"t1.txt=\"%02d\"",minutos); //objname.txt=valor
putc(0xFF,NEXTION); //datos para recepcion en pantalla nextion
putc(0xFF,NEXTION); //
putc(0xFF,NEXTION); //
delay_ms(200);
//Cambia la pista automaticamente
//El pin busy indica el estado del reproductor pausa=1 reproduciendo=0
if (busy==1 && estado==0)
{
df_next();
delay_ms(2000);
}
delay_ms(1000);
}
}
Interfaz grafica Nextion
La programación de la interfaz gráfica de la pantalla Nextion se realiza en el software Nextion Editor. Programación de pantalla Nextion

Música – Memoria Micro SD
Cada carpeta deberá ser numerada con dos dígitos, del 01 al 99, y las pistas de música deberán ser numeradas con tres dígitos, del 001 al 255. Es decir, que podrás tener hasta 99 carpetas, y en cada carpeta podrás colocar 255 pistas de música.

Descargar archivos de programación e impresión 3d
A continuación, se incluyen los archivos de programación tanto del microcontrolador PIC como de la pantalla Nextion y los archivos STL para la impresión 3d de la carcasa.
