hice este reloj alarma con opción para colocar varias alarmas
me aparece la hora. pero al momento de ingresar al menú y querer cambiar las horas de las alarmas con los botones no se puede. me podrían ayudar.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "RTClib.h"
LiquidCrystal_I2C lcd(0X3F,16,2); // inicializa la interfaz I2C del LCD 16x2
RTC_DS1307 RTC; // inicializa el modulo RTC
int r_diaSemana; // almacena el resultado del dia de la semana calculado
const int timbre = 7; // Pin 7 encargado de activar el timbre, se conecta al Rele
const int Pulsador_modo=2;
const int Pulsador_up=3;
const int Pulsador_down=4;
const int Pulsador_edit=5;
int horas;
int minutos;
int segundos;
volatile boolean actualizar=true;
int tiempo_timbre=7000; // Tiempo continuo que dura el timbre sonando, en milisegundos 7000 = 7 segundos
boolean alarmaOn=false;
int horas_alarma=0;
int minutos_alarma=0;
int horas_alarma2=0;
int minutos_alarma2=0;
char texto[10];
int modo=0;
int seleccion=0;
int estado;
int modo_alarma=0;
const int Y=16;
const int A=4;
const int B=4;
////////////////////////////////// Void Setup() ///////////
void setup() {
// put your setup code here, to run once:
pinMode(timbre, OUTPUT); // Configura como salida el pin 7
Wire.begin();
RTC.begin();
//RTC.adjust(DateTime(__DATE__, __TIME__)); // Lee la fecha y hora del PC (Solo en la primera carga)
Serial.begin(9600); // Establece la velocidad de datos del puerto serie a 9600
lcd.init();
lcd.backlight(); // Coloca luz de fondo al LCD
lcd.clear(); // Borra el LCD
pinMode(Pulsador_modo, INPUT);
pinMode(Pulsador_up, INPUT);
pinMode(Pulsador_down, INPUT);
pinMode(Pulsador_edit, INPUT);
}
/////////////////////////////// CAMBIAR HORA //////////////////////////////////
// alarma1
void incrementarHorasAlarma(){
horas_alarma++;
horas_alarma= horas%24;
actualizar=true;
}
void decrementarHorasAlarma(){
horas_alarma--;
if(horas_alarma<0){
horas_alarma=23;
}
actualizar=true;
}
void incrementarMinutosAlarma(){
minutos_alarma++;
minutos_alarma= minutos%60;
actualizar=true;
}
void decrementarMinutosAlarma(){
minutos_alarma--;
if(minutos_alarma<0){
minutos_alarma=59;
}
actualizar=true;
}
// alarma 2
void incrementarHorasAlarma2(){
horas_alarma2++;
horas_alarma2= horas%24;
actualizar=true;
}
void decrementarHorasAlarma2(){
horas_alarma2--;
if(horas_alarma2<0){
horas_alarma2=23;
}
actualizar=true;
}
void incrementarMinutosAlarma2(){
minutos_alarma2++;
minutos_alarma2= minutos%60;
actualizar=true;
}
void decrementarMinutosAlarma2(){
minutos_alarma2--;
if(minutos_alarma2<0){
minutos_alarma2=59;
}
actualizar=true;
}
void fijarCursorModo(){
switch(seleccion){
case 0:
lcd.noBlink();
break;
case 1:
lcd.setCursor(0,1);
lcd.blink();
break;
case 2:
lcd.setCursor(3,1);
lcd.blink();
break;
case 3:
lcd.setCursor(6,1);
lcd.blink();
break;
}
}
/////////////////////////////// menu//////////////////////////////////
void menuPrincipal()
{
do{
// Código de las acciones del menú Dos.
if(digitalRead(Pulsador_modo)==HIGH){
modo_alarma++;
modo_alarma = modo_alarma % Y;
fijarCursorModo();
while(digitalRead(Pulsador_modo)==HIGH);
}
switch(modo_alarma)
{
case 1: lcd.clear();
alarma1(); // alarma 1
lcd.clear();
break;
case 2: lcd.clear();
alarma2(); // alarma 2
lcd.clear();
break;
}
}while(digitalRead(Pulsador_edit) != HIGH);
}
void alarma1()
{
if(digitalRead(Pulsador_edit)==HIGH){
seleccion++;
seleccion = seleccion % A;
fijarCursorModo();
while(digitalRead(Pulsador_edit)==HIGH);
}
lcd.setCursor(0, 0); lcd.print("Alarma 1"); //Mostramos el menu en el LCD.
lcd.setCursor(0,1);
sprintf(texto, "%02d:%02d", horas_alarma, minutos_alarma); //las horas tendran 2 digitos
lcd.print(texto);
switch (seleccion){
case 1:
if(digitalRead(Pulsador_up)==HIGH){
incrementarHorasAlarma();
while(digitalRead(Pulsador_up)==HIGH);
}
if(digitalRead(Pulsador_down)==HIGH){
decrementarHorasAlarma();
while(digitalRead(Pulsador_down)==HIGH);
}
break;
case 2:
if(digitalRead(Pulsador_up)==HIGH){
incrementarMinutosAlarma();
while(digitalRead(Pulsador_up)==HIGH);
}
if(digitalRead(Pulsador_down)==HIGH){
decrementarMinutosAlarma();
while(digitalRead(Pulsador_down)==HIGH);
}
break;
case 3:
if(digitalRead(Pulsador_up)==HIGH){
alarmaOn=true;
actualizar=true;
while(digitalRead(Pulsador_up)==HIGH);
}
if(digitalRead(Pulsador_down)==HIGH){
alarmaOn=false;
actualizar=true;
while(digitalRead(Pulsador_down)==HIGH);
}
break;
}
if(alarmaOn == true){
lcd.print(" ON");
}else{
lcd.print(" OFF");
}
}
void alarma2()
{
lcd.setCursor(0, 0); lcd.print("Alarma 2"); //Mostramos el menu en el LCD.
lcd.setCursor(0,1);
sprintf(texto, "%02d:%02d", horas_alarma2, minutos_alarma2); //las horas tendran 2 digitos
lcd.print(texto);
if(digitalRead(Pulsador_edit)==HIGH){
seleccion++;
seleccion = seleccion % B;
fijarCursorModo();
while(digitalRead(Pulsador_edit)==HIGH);
}
switch (seleccion){
case 1:
if(digitalRead(Pulsador_up)==HIGH){
incrementarHorasAlarma2();
while(digitalRead(Pulsador_up)==HIGH);
}
if(digitalRead(Pulsador_down)==HIGH){
decrementarHorasAlarma2();
while(digitalRead(Pulsador_down)==HIGH);
}
break;
case 2:
if(digitalRead(Pulsador_up)==HIGH){
incrementarMinutosAlarma2();
while(digitalRead(Pulsador_up)==HIGH);
}
if(digitalRead(Pulsador_down)==HIGH){
decrementarMinutosAlarma2();
while(digitalRead(Pulsador_down)==HIGH);
}
break;
case 3:
if(digitalRead(Pulsador_up)==HIGH){
alarmaOn=true;
actualizar=true;
while(digitalRead(Pulsador_up)==HIGH);
}
if(digitalRead(Pulsador_down)==HIGH){
alarmaOn=false;
actualizar=true;
while(digitalRead(Pulsador_down)==HIGH);
}
break;
}
if(alarmaOn == true){
lcd.print(" ON");
}else{
lcd.print(" OFF");
}
}
////////////////////////////////// Void loop() ///////////
void loop (){
DateTime now = RTC.now(); // Obtiene la fecha y hora del RTC
Serial.print(now.year(), DEC); // A¤o
Serial.print('/');
Serial.print(now.month(), DEC); // Mes
Serial.print('/');
Serial.print(now.day(), DEC); // Dia
Serial.print(' ');
Serial.print(now.hour(), DEC); // Horas
Serial.print(':');
Serial.print(now.minute(), DEC); // Minutos
Serial.print(':');
Serial.print(now.second(), DEC); // Segundos
Serial.println();
lcd.setCursor(0,0);
lcd.print("D:");
lcd.print(now.year(), DEC);
lcd.print("/");
lcd.print(now.month(), DEC);
lcd.print("/");
lcd.print(now.day(), DEC);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print("T: ");
lcd.print(now.hour(), DEC);
lcd.print(":");
lcd.print(now.minute(), DEC);
lcd.print(":");
lcd.print(now.second(), DEC);
delay(1000);
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(" ");
if(digitalRead(Pulsador_modo)==HIGH){
menuPrincipal();
}
int r_diaSemana=dia_de_semana();
if ((r_diaSemana == 6 || r_diaSemana == 0)){ // si es fin de semana no hace nada
alarmaOn=false;
digitalWrite(timbre, LOW);
}
if (now.hour()==horas_alarma && now.minute() ==minutos_alarma && now.second()==0 && alarmaOn==true)
{
lcd.clear();
lcd.setCursor(2,0);
lcd.print("Encendido");
activar_timbre();
}
}
/////////////////////////////// Funcion que activa el Timbre //////////////////////////////////
void activar_timbre(){
digitalWrite(timbre, HIGH);
lcd.setCursor(0,0);
Serial.println("Timbre Activo");
delay(tiempo_timbre);
}