top of page
image.png

RELOJ CON ALARMA Y MP3 - ARDUINO (V 1.0)

  • Foto del escritor: Mr T
    Mr T
  • 25 ago 2024
  • 8 Min. de lectura

¡Hola! El día de hoy explicaré como construir un Reloj con Alarma y un Módulo MP3 (DF PLAYER MINI), El cual por ahora no es una versión definitiva, pero es completamente funcional. Permite ajustar la hora y definir una alarma, junto con la adición de MP3.


Materiales:

- 1 Módulo Arduino (UNO o NANO)

- 1 Pantalla LCD de 20x4 con módulo I2C (Imprescindible el I2C)

- 1 Transistor NPN 2N2222

- 1 Resistencia de entre 200 a 400 Ohm

- 1 DFPlayer mini

- 1 Altavoz de 1 a 3 Watts (No superar 3 Watts)

- 1 Buzzer o Zumbador o Piezoeléctrico

- 8 Pulsadores

- Cables de conexión


Ensamblaje:

Para este caso, utilizaremos la alimentación por USB, asegurando que se conecte a un puerto USB 3.0 o superior (900 mA).


Diagrama de conexiones:

ree

Imagen de Referencia:

ree

Código:

A continuación, proporciono el Código para cargarlo en el Arduino:

Pero en caso de que quieran el archivo directo, aquí está: https://www.mediafire.com/folder/wpqo26fmi092y/RelojAlarmayMP3

#include <Wire.h>
#include <LiquidCrystal_I2C.h> //instalar las bibliotecas si no las tienen

//********************************************************************
//R E L O J  C O N  A R D U I N O - P O W E R  T O  T H E  B U Z Z E R
//********************************************************************


//+-+-+-+-+-+-+-+-+-+-+-
//CONFIGURACIÓN PANTALLA
//+-+-+-+-+-+-+-+-+-+-+-

LiquidCrystal_I2C lcd(0x27, 20, 4); //Depende de la dirreción, tipo y resolución de la pantalla


//+-+-+-+-+-+-+-+-+-+
//VARIABLES DE INICIO
//+-+-+-+-+-+-+-+-+-+


//FUNCIÓN MILLIS
//Cuenta cuanto tiempo ha pasado desde que se prendió la placa

unsigned long MillisAnterior = 0;
const long intervalo = 1000;


//ASTERISCO PARPADENATE
//Cuando se prende la Alarma

bool blink = false;
unsigned long intervaloblink = 0;


//VARIABLES HORA
//Guarda la info de los contadores de la hora

int sec = 0; //Segundos
int min = 0; //Minutos
int hour = 0; //Horas


//DECORACIÓN DE LA PANTALLA
//solo decoración

char array2[] = "--------------------"; 

//PARA MOSTRAR SI LA ALARMA ESTÁ PRENDIDA

char array3[] = "-> ON ";
char array4[] = "-> OFF";

//PARA MOSTRAR AM O PM

char array5[] = " AM";
char array6[] = " PM";

//PARA MOSTRAR SI EL MP3 ESTA PRENDIDO

char array7[] = "----==MP3 mode==----"; //Modo MP3
char array8[] = "----=clock only=----"; //Apaga el MP3

//CONTROLES
//Controles para los ajustadores del reloj

const int SetH = 9;
const int SetM = 8;
const int Mode = 7;

//CONTROLES
//Controles para los ajustadores de la Alarma

const int AlarmH = 6; //Botón para ajustar horas de la alarma
const int AlarmM = 5; //Botón para ajustar minutos de la alarma

//CONTROLES
//para activar el modo MP3

const int MP3 = 3; //Botón para MP3

//BASE DEL TRANSISTOR
//Para controlar el MP3

const int BASE = 2;

//VARIABLES PARA LA ALARMA
//controlan el funcionamiento de la Alarma

int alarmHour = 12; //la alarma estará configurada a las 12:00 por defecto
int alarmMin = 0;

bool alarmActive = false; //Estado de la alarma al prender, este cambiará al presionar el botón

//VARIABLES PARA EL BUZZER 
//Será la Alarma

int buzzer = 10;


//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
//Control especial para alternar la Alarma
//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-

bool StatebeforeAl = HIGH; 
bool ActionstateAl = false; 

//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
//Control especial para alternar modos "MP3 OFF O MP3 ON"
//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-

bool StatebeforeMP3 = HIGH; 
bool ActionstateMP3 = false; 


//=================================================================
//AHORA ES EL VOID SETUP
//=================================================================


void setup() {
  lcd.init();
  lcd.backlight();

  //PINES
  //para los controles de la hora
  
  pinMode(SetH, INPUT_PULLUP);
  pinMode(SetM, INPUT_PULLUP);
  pinMode(Mode, INPUT_PULLUP);

  //PINES
  //para la alarma

  pinMode(AlarmH, INPUT_PULLUP);
  pinMode(AlarmM, INPUT_PULLUP);

  //PINES
  //para el mp3

  pinMode(MP3, INPUT_PULLUP);

  //PINES
  //para la base controladora del transistor que prenderá el mp3

  pinMode(BASE, OUTPUT);
  digitalWrite(BASE, LOW);

  //MENSAJES INICIALES
  //para la pantalla

  lcd.setCursor(0, 3); //para el mensaje de mp3 apagado
  lcd.print(array8);

  lcd.setCursor(0, 1); //para la linea divisora decorativa
  lcd.print(array2);

  lcd.setCursor(13,2); //para el mensaje de alarma apagada
  lcd.print(array4);
}


//=================================================================
//AHORA ES EL VOID LOOP
//=================================================================


void loop() {
  unsigned long MillisActual = millis(); // Obtiene el tiempo actual en milisegundos

  //Comprueba si ha pasado el intervalo de 1 segundo
  if (MillisActual - MillisAnterior >= intervalo) {  //cuando se prende quedaría 1000 ms - 0 >= 1000 ms
    MillisAnterior = MillisActual; //Se actualiza MillisAnterior para que pueda seguir la comprobacion de que ha pasado 1 sec

    sec++; //Sube el contador de segundos despues de la comprobación anterior cada segundo, ovbiamente.
    
    //+-+-+-+-+-+-+-+-+-+-+-+-
    //FUNCIONAMIENTO DEL RELOJ
    //+-+-+-+-+-+-+-+-+-+-+-+-

    if (sec >= 60) { //Si los segundos llegan a 60
      sec = 0; //Reinicia este contador
      min++; //Sube el contador de minutos

      if (min >= 60) { //Si los minutos llegan a 60
        min = 0; //Reinicia este contador
        hour++; //Sube el contador de horas

        if (hour >= 24) { //Si las horas llegan a 24
          hour = 0; //Reinicia este contador
        }
      }
    }

    //MOSTRAR AM O PM
    //Muestra AM si la hora es menor a 12 y si no, muestra PM

    char* amPm = (hour >= 12) ? array6 : array5;

    //IMPRIMIR LA HORA
    //Muestra la hora en la pantalla LCD con formato de dos dígitos
    //Al último está la parte indispensable para que se muestren en 2 dígitos
    //Ya que de lo contrario, solo se mostraría un dígito

    lcd.setCursor(0, 0);
    lcd.print("CLOCK: ");
    printTwoDigits(hour); //Imprimir la hora en la pantalla
    lcd.print(":");
    printTwoDigits(min); //Imprimir los minutos en la pantalla
    lcd.print(":");
    printTwoDigits(sec); //Imprimir los segundos en la pantalla
    lcd.print(amPm); // Imprimir AM o PM

    lcd.setCursor(0, 2);
    lcd.print("ALARM: "); 
    printTwoDigits(alarmHour); //Para mostrar la hora de la Alarma
    lcd.print(":");
    printTwoDigits(alarmMin); //Para mostrar los mins de la Alarma

    //para el * decorativo cuando se prende la Alarma
    if (ActionstateAl) {
      if (MillisActual - intervaloblink >= 1000) {
        intervaloblink = MillisActual;
        blink = !blink;
        lcd.setCursor(19,0);
        lcd.print(blink ? "*":" ");
      }
    }
    
  }


  //+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
  //ESTA ES LA PARTE DEL AJUSTADOR
  //+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-

  //CÓDIGO CONTROLES
  //Lee el estado de los botones

  //+-+-+-+-LOW = Cuando se presiona el Botón+-+-+-+-+-

  //para modificar la hora, al presionar el botón, el contador subirá
  if (digitalRead(SetH) == LOW) {
    hour++;
    delay(50);
    if (hour >= 24) {
      hour = 0; //si la hora supera a 24, vuelve a 0
    }
    tone(buzzer, 1500, 100); //altavoz (solo tono para representar que el botón se ha presionado)
    delay(100);
  }

  //para modificar los mins, al presionar el botón, el contador subirá

  if (digitalRead(SetM) == LOW) {
    min++;
    delay(50);
    if (min >= 60) {
      min = 0; //si los minutos superan 60, vuelve a 0
    }
    tone(buzzer, 1500, 100); //altavoz (solo tono para representar que el botón se ha presionado)
    delay(100);
  }

//CÓDIGO CONTROLES
//Para el estado de alarma encendida o apagada

  bool ActualstateAl = digitalRead(Mode);

  if (ActualstateAl == LOW && StatebeforeAl == HIGH) {
    delay(100);
    
    if (ActualstateAl == LOW) {
      ActionstateAl = !ActionstateAl; //si el botón se presiona, ActionstateAl pasará a ser verdadero (lo inverso)

      if (ActionstateAl) {
        
        lcd.setCursor(13, 2);
        lcd.print(array3);
        
        lcd.setCursor(0, 1);  //es solo para que no se mueva la linea
        lcd.print(array2);

        tone(buzzer, 1700, 100); //altavoz (solo tono para representar que el botón se ha presionado)
        delay(100);
      } else {
        lcd.setCursor(13, 2);
        lcd.print(array4);

        lcd.setCursor(0, 1);  //es solo para que no se mueva la linea
        lcd.print(array2);
        lcd.setCursor(19, 0); //para que no se muestre el asterisco en Alarm off
        lcd.print(" ");

        tone(buzzer, 1700, 100); //altavoz (solo tono para representar que el botón se ha presionado)
        delay(100);
      }
    }
  }

  //CÓDIGO CONTROLES
  //PARA EL MODO DE MP3

  bool ActualstateMP3 = digitalRead(MP3);

  if (ActualstateMP3 == LOW && StatebeforeMP3 == HIGH) {
    delay(100);
    
    if (ActualstateMP3 == LOW) {
      ActionstateMP3 = !ActionstateMP3;

      if (ActionstateMP3) {
        
        lcd.setCursor(0, 3);
        lcd.print(array7);

        //Para prender la base del transistor, permitirá a la corriente fluir y encender el DFPlayer
        //(intenté controlarlo directamente desde el Arduino pero da problemas con la hora, esta se colgaba)
 
        digitalWrite(BASE, HIGH); //Prende la base y el DFPlayer se Apaga

        tone(buzzer, 1800, 100); //altavoz (solo tono para representar que el botón se ha presionado)
        delay(400); //la razón por la que los delays son mayores, es para evitar prender o apagar muy rápido el MP3

      } else {
        lcd.setCursor(0, 3);
        lcd.print(array8);

        digitalWrite(BASE, LOW); //apaga la base y el DFPlayer se Apaga

        tone(buzzer, 1800, 100); //altavoz (solo tono para representar que el botón se ha presionado)
        delay(400); //la razón por la que los delays son mayores, es para evitar prender o apagar muy rápido el MP3
      }
    }
  }


  //CÓDIGO CONTROLES
  //PARA AJUSTAR LA HORA DE LA ALARMA


  if (digitalRead(AlarmH) == LOW) {
    alarmHour++;
    delay(50);
    if (alarmHour >= 24) {
      alarmHour = 0; //si la hora supera a 24, vuelve a 0
    }
    tone(buzzer, 1600, 100); //altavoz (solo tono para representar que el botón se ha presionado)
    delay(100);
  }
  
  if (digitalRead(AlarmM) == LOW) {
    alarmMin++;
    delay(50);
    if (alarmMin >= 60) {
      alarmMin = 0; //si los mins superan 60, vuelve a 0
    }
    tone(buzzer, 1600, 100); //altavoz (solo tono para representar que el botón se ha presionado)
    delay(100);
  }
  
  // Comprobar si es hora de activar la alarma, si no es la misma hora no se activará
  if (ActionstateAl && (hour == alarmHour && min == alarmMin)) {
    tone(buzzer, 1300); // Emite sonido de alarma, este seapagará si se presiona cualquier otro botón
    //esto debido a que el tono de los demas pulsadores se superpondrá, pero para no desconfigurar la
    //hora o la alarma, simplemente se presiona el botón de apagar o encender la alarma.

    alarmActive = true;
  }
}

//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
//PARA QUE SE PUEDAN MOSTRAR 2 DIGITOS SI EL NUMERO ES MENOR A 10
//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-

void printTwoDigits(int number) {
  if (number < 10) {
    lcd.print("0");
  }
  lcd.print(number);
}

Funcionamiento y Explicación:

Una vez realizadas las conexiones y la carga del código, la pantalla LCD mostrará lo siguiente:

ree

La hora por defecto será 00:00 AM, mientras que la Alarma será 12:00 PM, esto se puede ajustar con los pulsadores correspondientes.


Hora:

El pulsador conectado al pin D10 aumenta el contador de la hora.

El pulsador conectado al pin D09 aumenta el contador de los minutos.


Alarma:

El pulsador conectado al pin D08 permitirá activar o desactivar la Alarma.

El pulsador conectado al pin D07 aumenta el contador de la hora en la Alarma.

El pulsador conectado al pin D06 aumenta el contador de los minutos en la Alarma.


Cuando la Hora de la Alarma coincida con la actual, el buzzer emitirá un pitido a 1300 hz, el cual será constante y la forma más cómoda de desactivarlo es presionando el botón que permite activar o desactivar la Alarma.


(Se planea en un futuro agregar una función de Snooze)


MODO MP3:

El pulsador conectado al pin D06 permitirá activar o desactivar la función MP3, que está impulsada por el DFPlayer Mini


Cuando se activa el modo MP3 se enviará una señal desde el pin D2 hacia la base del transistor 2N2222 conectado entre el GND del Arduino y el GND del DFPlayer, lo que permitirá que el circuito se cierre correctamente y el DFPlayer empiece a funcionar.

(Busqué controlar el DFPlayer desde el Arduino, sin embargo, este se ralentizaba notoriamente)


Aclaraciones:

Esta no es la versión final, por lo cual tiene algunos errores o limitaciones:


  • La adición del Módulo DFPlayer puede llegar a consumir demasiada corriente, conectando directamente en el Arduino (Este solo puede entregar entre 500 a 800 mA, pero depende de modelo a modelo) puede provocar que el Módulo no sea capaz de mantener un volumen muy alto, provocando que se reinicie automáticamente apenas está sonando la canción. Sin embargo, eso se puede solucionar utilizando una fuente de energía aparte para alimentar el módulo DFPlayer Mini y la Pantalla, se puede utilizar un cargador de 5v o una fuente con mayor voltaje como 9 a 12v conectada a un regulador como el LM7805 que entregue 5v de salida, asegurando que tanto la fuente como el Regulador puedan manejar la potencia del Altavoz, o utilizar un altavoz de menor potencia.

  • La pantalla también puede verse afectada por el Funcionamiento del DFPlayer Mini, sin embargo, esto se puede solucionar aumentando el contraste mediante el pequeño potenciómetro detrás de la pantalla.

  • El módulo no guardará la Ultima canción reproducida antes de apagarlo, por lo cual, al volver a encenderlo, empezará a reproducir la lista desde el principio.

  • Cada vez que se modifica la Hora, Alarma o cualquier otro atributo en la pantalla, este cambio se actualizará en 1 segundo.


Video:

En el siguiente video, se mostrará el funcionamiento y el ensamblaje del dispositivo:



Este ha sido Mr. T para POWER TO THE BUZZER, Hasta la próxima.


Entradas recientes

Ver todo

Comentarios


POWER TO THE BUZZER

bottom of page