CONTENIDO ►
Reloj Arduino sin RTC Módulo de reloj en tiempo real (Real Time Clock) con salida a una pantalla LCD 1602 i2c – este proyecto permite ajustar la hora (horas y minutos) y la hora de la alarma. Para ello se utilizan dos pulsadores de reloj (para cambiar los modos de ajuste) y el zumbador del Arduino para la señal sonora. El proyecto contiene un esquema del montaje del dispositivo y un programa para la placa Arduino en funcionamiento.
Para esta actividad necesitaremos:
- Arduino Uno / Arduino Nano / Arduino Mega
- pantalla LCD 1602 i2c;
- zumbador;
- pulsadores;
- cables de conexion;
- libreria LiquidCrystal_I2C.h
Reloj LCD Arduino 16×02 sin módulo RTC
Este proyecto requiere un mínimo de piezas: una pantalla 1602 con módulo i2c (puedes conectar una pantalla sin i2c si lo deseas), dos botones pulsadores y un altavoz piezoeléctrico. Los botones se conectan a los pines del microcontrolador Arduino Uno / Nano configurado en modo INPUT_PULLUP – con este método de conexión, se puede leer el número de pulsaciones de los botones, y no se necesitan resistencias para el montaje.
Esquema de conexión del reloj sin módulo RTC

| LCD 1602 i2c | Arduino Uno | Arduino Nano | Arduino Mega |
| GND | GND | GND | GND |
| VCC | 5V | 5V | 5V |
| SDA | A4 | A4 | 20 |
| SCL | A5 | A5 | 21 |
Si estás utilizando un Arduino Mega, en esta placa los puertos SDA y SCL para la conexión de la pantalla se encuentran en los pines 20 y 21. La placa Arduino Nano tiene la misma distribución de pines que la Uno y el LCD 1602 se conecta a los pines A4 (SDA) y A5 (SCL). El despertador emite un pitido durante 1 minuto y puedes pulsar el botón conectado al puerto 8 para apagarlo. Después de montar el diagrama, cargue el siguiente programa.
Programa Arduino para reloj sin módulo RTC
#include "Wire.h" #include "LiquidCrystal_I2C.h" LiquidCrystal_I2C LCD(0x27, 20, 2); byte SEC = 0; byte MIN = 34; byte HOUR = 12; byte MIN_A = 35; byte HOUR_A = 12; unsigned long timer; boolean button1WasUp = true; boolean button2WasUp = true; boolean button1IsUp; boolean button2IsUp; boolean alarm = true; byte c1, c2, c3, w, i; // icône d'alarme byte bell [8] = { 0b11000, 0b11110, 0b01100, 0b01000, 0b00000, 0b00000, 0b00000, 0b00000, }; void setup() { pinMode(9, INPUT_PULLUP); pinMode(8, INPUT_PULLUP); pinMode(5, OUTPUT); LCD.init(); LCD.backlight(); LCD.createChar(1, bell); timer = millis(); } void loop() { button1IsUp = digitalRead(9); button2IsUp = digitalRead(8); if (button1WasUp && !button1IsUp) { delay(10); button1IsUp = digitalRead(9); if (!button1IsUp) { SEC = 0; w = 1; } } button1WasUp = button1IsUp; if (button2WasUp && !button2IsUp) { delay(10); button2IsUp = digitalRead(8); if (!button2IsUp) { alarm = false; } } button2WasUp = button2IsUp; if (millis() - timer > 1000) { timer = millis(); SEC++; if (SEC > 59) { SEC = 0; MIN++; } if (MIN > 59) { MIN = 0; HOUR++; } if (HOUR > 23) { HOUR = 0; } if (alarm == true && HOUR == HOUR_A && MIN == MIN_A && i < 60) { tone(5, 50); i++; } if (i >= 60) { noTone(5); alarm == false; i = 0; } if (HOUR < 10) { c1 = 5; } if (HOUR >= 10) { c1 = 4; } if (MIN < 10) { c2 = 8; } if (MIN >= 10) { c2 = 7; } if (SEC < 10) { c3 = 11; } if (SEC >= 10) { c3 = 10; } LCD.setCursor(4, 0); LCD.print("0"); LCD.setCursor(c1, 0); LCD.print(HOUR); LCD.print(":"); LCD.setCursor(7, 0); LCD.print("0"); LCD.setCursor(c2, 0); LCD.print(MIN); LCD.print(":"); LCD.setCursor(10, 0); LCD.print("0"); LCD.setCursor(c3, 0); LCD.print(SEC); if (alarm == true) { LCD.print(char(1)); } if (alarm == false) { LCD.print(" "); } noTone(5); } while (w == 1) { if (HOUR > 23) { HOUR = 0; } if (HOUR < 10) { c1 = 5; } if (HOUR >= 10) { c1 = 4; } if (MIN < 10) { c2 = 8; } if (MIN >= 10) { c2 = 7; } LCD.setCursor(4, 0); LCD.print("0"); LCD.setCursor(c1, 0); LCD.print(HOUR); LCD.print(":"); LCD.setCursor(7, 0); LCD.print("0"); LCD.setCursor(c2, 0); LCD.print(MIN); LCD.print(":"); LCD.setCursor(10, 0); LCD.print("00"); if (alarm == true) { LCD.print(char(1)); } if (alarm == false) { LCD.print(" "); } LCD.setCursor(2, 1); LCD.print("HOUR SETTING"); button1IsUp = digitalRead(9); button2IsUp = digitalRead(8); if (button1WasUp && !button1IsUp) { delay(10); button1IsUp = digitalRead(9); if (!button1IsUp) { LCD.clear(); w = 2; } } button1WasUp = button1IsUp; if (button2WasUp && !button2IsUp) { delay(10); button2IsUp = digitalRead(8); if (!button2IsUp) { HOUR++; } } button2WasUp = button2IsUp; } while (w == 2) { if (MIN > 59) { MIN = 0;} if (HOUR < 10) { c1 = 5; } if (HOUR >= 10) { c1 = 4; } if (MIN < 10) { c2 = 8; } if (MIN >= 10) { c2 = 7; } LCD.setCursor(4, 0); LCD.print("0"); LCD.setCursor(c1, 0); LCD.print(HOUR); LCD.print(":"); LCD.setCursor(7, 0); LCD.print("0"); LCD.setCursor(c2, 0); LCD.print(MIN); LCD.print(":"); LCD.setCursor(10, 0); LCD.print("00"); if (alarm == true) { LCD.print(char(1)); } if (alarm == false) { LCD.print(" "); } LCD.setCursor(1, 1); LCD.print("MINUTE SETTING"); button1IsUp = digitalRead(9); button2IsUp = digitalRead(8); if (button1WasUp && !button1IsUp) { delay(10); button1IsUp = digitalRead(9); if (!button1IsUp) { LCD.clear(); w = 3; } } button1WasUp = button1IsUp; if (button2WasUp && !button2IsUp) { delay(10); button2IsUp = digitalRead(8); if (!button2IsUp) { MIN++; } } button2WasUp = button2IsUp; } while (w == 3) { if (MIN_A > 59) { MIN_A = 0; HOUR_A++; } if (HOUR_A > 23) { HOUR_A = 0; } if (HOUR_A < 10) { c1 = 5; } if (HOUR_A >= 10) { c1 = 4; } if (MIN_A < 10) { c2 = 8; } if (MIN_A >= 10) { c2 = 7; } LCD.setCursor(4, 0); LCD.print("0"); LCD.setCursor(c1, 0); LCD.print(HOUR_A); LCD.print(":"); LCD.setCursor(7, 0); LCD.print("0"); LCD.setCursor(c2, 0); LCD.print(MIN_A); LCD.print(":"); LCD.setCursor(10, 0); LCD.print("00"); if (alarm == true) { LCD.print(char(1)); LCD.setCursor(4, 1); LCD.print("ALARM ON "); } if (alarm == false) { LCD.print(" "); LCD.setCursor(4, 1); LCD.print("ALARM OFF"); } button1IsUp = digitalRead(9); button2IsUp = digitalRead(8); if (button1WasUp && !button1IsUp) { delay(10); button1IsUp = digitalRead(9); if (!button1IsUp) { LCD.clear(); w = 4; } } button1WasUp = button1IsUp; if (button2WasUp && !button2IsUp) { delay(10); button2IsUp = digitalRead(8); if (!button2IsUp) { alarm = !alarm; } } button2WasUp = button2IsUp; } while (w == 4) { if (MIN_A > 59) { MIN_A = 0; HOUR_A++; } if (HOUR_A > 23) { HOUR_A = 0; } if (HOUR_A < 10) { c1 = 5; } if (HOUR_A >= 10) { c1 = 4; } if (MIN_A < 10) { c2 = 8; } if (MIN_A >= 10) { c2 = 7; } LCD.setCursor(4, 0); LCD.print("0"); LCD.setCursor(c1, 0); LCD.print(HOUR_A); LCD.print(":"); LCD.setCursor(7, 0); LCD.print("0"); LCD.setCursor(c2, 0); LCD.print(MIN_A); LCD.print(":"); LCD.setCursor(10, 0); LCD.print("00"); if (alarm == true) { LCD.print(char(1)); } if (alarm == false) { LCD.print(" "); } LCD.setCursor(1, 1); LCD.print("ALARM SET HOUR"); button1IsUp = digitalRead(9); button2IsUp = digitalRead(8); if (button1WasUp && !button1IsUp) { delay(10); button1IsUp = digitalRead(9); if (!button1IsUp) { LCD.clear(); w = 5; } } button1WasUp = button1IsUp; if (button2WasUp && !button2IsUp) { delay(10); button2IsUp = digitalRead(8); if (!button2IsUp) { HOUR_A++; } } button2WasUp = button2IsUp; } while (w == 5) { if (MIN_A > 59) { MIN_A = 0; HOUR_A++; } if (HOUR_A > 23) { HOUR_A = 0; } if (HOUR_A < 10) { c1 = 5; } if (HOUR_A >= 10) { c1 = 4; } if (MIN_A < 10) { c2 = 8; } if (MIN_A >= 10) { c2 = 7; } LCD.setCursor(4, 0); LCD.print("0"); LCD.setCursor(c1, 0); LCD.print(HOUR_A); LCD.print(":"); LCD.setCursor(7, 0); LCD.print("0"); LCD.setCursor(c2, 0); LCD.print(MIN_A); LCD.print(":"); LCD.setCursor(10, 0); LCD.print("00"); if (alarm == true) { LCD.print(char(1)); } if (alarm == false) { LCD.print(" "); } LCD.setCursor(0, 1); LCD.print("ALARM SET MINUTE"); button1IsUp = digitalRead(9); button2IsUp = digitalRead(8); if (button1WasUp && !button1IsUp) { delay(10); button1IsUp = digitalRead(9); if (!button1IsUp) { LCD.clear(); w = 0; } } button1WasUp = button1IsUp; if (button2WasUp && !button2IsUp) { delay(10); button2IsUp = digitalRead(8); if (!button2IsUp) { MIN_A++; } } button2WasUp = button2IsUp; } }
Explicación del código para el reloj sin RTC:
- durante el ajuste del reloj y la alarma, el temporizador se detiene;
- las variables c1 y c2 son responsables de la posición del cursor cuando la hora y los minutos se muestran en la pantalla, dependiendo de si se almacena un número de dos dígitos o de un solo dígito en la variable.
Conclusión. Un reloj sin módulo RTC (Real Time Clock) restablecerá la hora a los valores originales cuando se corte la alimentación, por lo que se han añadido botones al proyecto. Estos pueden ser utilizados para ajustar el reloj sin tener que recargar el sketch – un simple proyecto de Arduino para los principiantes de programación. También puede añadir un sensor DHT11 o BMP180 para mostrar la temperatura en el LCD 1602 i2c.

Deja una respuesta