Reproductor MP3 con pantalla táctil

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.

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.

Scroll al inicio