Hola Buenas tardes. Necesitaría que me ayudaran con un proyecto que emprendí, es un control de luces programable (esta parte esta hecha), la complicación esta en que deseo colocarle un sistema que permita mantener la hora y los datos ingresados ante un posible corte de luz que no duraría mas de un par de minutos. Estuve viendo con los sistemas rtc pero no logro entender como hacer para guardar los datos necesarios para realizar la tarea que necesito. Si pudieran ayudarme se los agradeceria. A continuación dejo el sketch. Desde ya muchas gracias
ARDUINO UNO.
LCD 2 X 16 I2C.
3 PULSADORES.
#include <TimerOne.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
RTC_DS1307 RTC;
LiquidCrystal_I2C lcd (0x3F, 16, 2);
const int PULSADOR_MODO = 2;
const int PULSADOR_UP = 3;
const int PULSADOR_DOWN = 4;
const int LUZ = 5;
int horas=0;
int minutos=0;
volatile int segundos=0;
volatile boolean actualizar=true;
int horas_inicio=0;
int minutos_inicio=0;
boolean alarmaOn=false;
boolean luz_iniciada =false;
boolean indicador_encendido =false;
int horas_final=0;
int minutos_final=0;
char texto[10];
int modo = 0;
const int N=8;
void setup(){
Wire.begin();
lcd.begin(16,2);
lcd.clear();
lcd.backlight();
pinMode(PULSADOR_MODO, INPUT);
pinMode(PULSADOR_UP, INPUT);
pinMode(PULSADOR_DOWN, INPUT);
pinMode(LUZ, OUTPUT);
Timer1.initialize(1000000);
Timer1.attachInterrupt(manejadoraTimer);
}
void manejadoraTimer(){
segundos++;
actualizar=true;
}
void actualizarReloj(){
minutos += segundos / 60;
segundos = segundos % 60;
horas += minutos / 60;
minutos = minutos % 60;
horas = horas % 24;
}
void incrementarHoras(){
horas ++;
horas = horas % 24;
actualizar=true;
}
void decrementarHoras(){
horas --;
if(horas<0){
horas = 23;
}
actualizar=true;
}
void incrementarHorasInicio(){
horas_inicio++;
horas_inicio = horas_inicio % 24;
actualizar=true;
}
void incrementarHorasFinal(){
horas_final++;
horas_final = horas_final % 24;
actualizar=true;
}
void decrementarHorasInicio(){
horas_inicio--;
if(horas_inicio<0){
horas_final = 23;
}
actualizar=true;
}
void decrementarHorasFinal(){
horas_final--;
if(horas_final<0){
horas_final = 23;
}
actualizar=true;
}
void incrementarMinutosInicio(){
minutos_inicio ++;
minutos_inicio = minutos_inicio % 60;
actualizar=true;
}
void incrementarMinutosFinal(){
minutos_final ++;
minutos_final = minutos_final % 60;
actualizar=true;
}
void decrementarMinutosInicio(){
minutos_inicio --;
if(minutos_inicio<0){
minutos_inicio = 59;
}
actualizar=true;
}
void decrementarMinutosFinal(){
minutos_final --;
if(minutos_final<0){
minutos_final = 59;
}
actualizar=true;
}
void incrementarMinutos(){
minutos ++;
minutos = minutos % 60;
actualizar=true;
}
void decrementarMinutos(){
minutos --;
if(minutos<0){
minutos = 59;
}
actualizar=true;
}
void fijarCursorModo(){
switch(modo){
case 0:
lcd.noBlink();
break;
case 1:
lcd.setCursor(0, 0);
lcd.blink();
break;
case 2:
lcd.setCursor(3, 0);
lcd.blink();
break;
case 3:
lcd.setCursor (11, 0);
lcd.blink();
break;
case 4:
lcd.setCursor(0, 1);
lcd.blink();
break;
case 5:
lcd.setCursor(3, 1);
lcd.blink();
break;
case 6:
lcd.setCursor(6, 1);
lcd.blink();
break;
case 7:
lcd.setCursor (9, 1);
lcd.blink();
break;
}
}
void loop(){
if(digitalRead(PULSADOR_MODO)==HIGH){
modo++;
modo = modo % N;
fijarCursorModo();
while(digitalRead(PULSADOR_MODO)==HIGH);
}
switch(modo){
//RELOJ
case 1:
if(digitalRead(PULSADOR_UP)==HIGH){
incrementarHoras();
while(digitalRead(PULSADOR_UP)==HIGH);
}
if(digitalRead(PULSADOR_DOWN)==HIGH){
decrementarHoras();
while(digitalRead(PULSADOR_DOWN)==HIGH);
}
break;
case 2:
if(digitalRead(PULSADOR_UP)==HIGH){
incrementarMinutos();
while(digitalRead(PULSADOR_UP)==HIGH);
}
if(digitalRead(PULSADOR_DOWN)==HIGH){
decrementarMinutos();
while(digitalRead(PULSADOR_DOWN)==HIGH);
}
break;
//ALARMA
case 3:
if(digitalRead(PULSADOR_UP)==HIGH){
alarmaOn=!alarmaOn;
actualizar=true;
while(digitalRead(PULSADOR_UP)==HIGH);
}
break;
case 4:
if(digitalRead(PULSADOR_UP)==HIGH){
incrementarHorasInicio();
while(digitalRead(PULSADOR_UP)==HIGH);
}
if(digitalRead(PULSADOR_DOWN)==HIGH){
decrementarHorasInicio();
while(digitalRead(PULSADOR_DOWN)==HIGH);
}
break;
case 5:
if(digitalRead(PULSADOR_UP)==HIGH){
incrementarMinutosInicio();
while(digitalRead(PULSADOR_UP)==HIGH);
}
if(digitalRead(PULSADOR_DOWN)==HIGH){
decrementarMinutosInicio();
while(digitalRead(PULSADOR_DOWN)==HIGH);
}
break;
case 6:
if(digitalRead(PULSADOR_UP)==HIGH){
incrementarHorasFinal();
while(digitalRead(PULSADOR_UP)==HIGH);
}
if(digitalRead(PULSADOR_DOWN)==HIGH){
decrementarHorasFinal();
while(digitalRead(PULSADOR_DOWN)==HIGH);
}
break;
case 7:
if(digitalRead(PULSADOR_UP)==HIGH){
incrementarMinutosFinal();
while(digitalRead(PULSADOR_UP)==HIGH);
}
if(digitalRead(PULSADOR_DOWN)==HIGH){
decrementarMinutosFinal();
while(digitalRead(PULSADOR_DOWN)==HIGH);
}
break;
}
if(actualizar == true){
actualizarReloj();
lcd.clear();
lcd.noBlink();
//RELOJ
lcd.setCursor(0,0);
sprintf(texto, "%02d:%02d:%02d",horas,minutos, segundos);
lcd.print(texto);
//INICIO
lcd.setCursor(0,1);
sprintf(texto, "%02d:%02d",horas_inicio,minutos_inicio);
lcd.print(texto);
//FINAL
lcd.setCursor(6,1);
sprintf(texto, "%02d:%02d",horas_final,minutos_final);
lcd.print(texto);
lcd.setCursor (12, 1);
//lcd.print(" OFF");
if(alarmaOn ==true){
lcd.setCursor(10, 0);
lcd.print(" ON");
}
else{
lcd.setCursor(10, 0);
lcd.print(" OFF");
}
if(alarmaOn ==true){
if(segundos==0 && horas == horas_inicio && minutos == minutos_inicio){
digitalWrite(LUZ, HIGH);
luz_iniciada = false;
indicador_encendido = true ;
};
}
if (indicador_encendido ==true){
lcd.setCursor(12, 1);
lcd.print(" ON");
}
if(luz_iniciada==false){
if(segundos==0 && horas >= horas_final && minutos >= minutos_final){
digitalWrite(LUZ, LOW);
indicador_encendido = false;
}
}
if (indicador_encendido == false){
lcd.setCursor(12, 1);
lcd.print(" OFF");
}
actualizar = false;
fijarCursorModo();
}
}
[CODE].