Si buenas, me refiero al reloj en tiempo real, al final no se puso el codigo final no se que ha pasado.
// Alarma Chalet
#include <Wire.h> // Libreria para I2C
#include <LiquidCrystal_I2C.h> // Libreria para LCD
#define DS1307_I2C_ADDRESS 0x68 // Direccion bus Reloj
LiquidCrystal_I2C lcd(0x27,16,2); // Direccion de bus pantalla
const int zumbador = 7; // Pin Zumbador de aviso
const int pir1 = 2; // Pin de entrada señal Pir 1
const int pir2 = 4; // Pin de entrada señal Pir 2
const int ledEstado = 13; // Led en pin 13 salto Pir 1 y Pir 2
int estadoPir1 = 0; // Estado de Pir 1 "0"
int estadoPir2 = 0; // Estado de Pir 2 "0"
byte decToBcd(byte val)
{
return ( (val/10*16) + (val%10) );
}
// Convierte BCD (binario decimal codificado) a números normales decimales
byte bcdToDec(byte val)
{
return ( (val/16*10) + (val%16) );
}
// 1) Sets the date and time on the ds1307
// 2) Starts the clock
// 3) Sets hour mode to 24 hour clock
void setDateDs1307(byte second, // 0-59
byte minute, // 0-59
byte hour, // 1-23
byte dayOfWeek, // 1-7
byte dayOfMonth, // 1-28/29/30/31
byte month, // 1-12
byte year) // 0-99
{
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.send(0);
Wire.send(decToBcd(second));
Wire.send(decToBcd(minute));
Wire.send(decToBcd(hour));
Wire.send(decToBcd(dayOfWeek));
Wire.send(decToBcd(dayOfMonth));
Wire.send(decToBcd(month));
Wire.send(decToBcd(year));
Wire.endTransmission();
}
// Establece la fecha y la hora del reloj
void getDateDs1307(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
// Resetea el registro puntero
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.send(0);
Wire.endTransmission();
Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
// Alguno de estos necesitan enmascarar porque ciertos bits son bits de control
*second = bcdToDec(Wire.receive() & 0x7f);
*minute = bcdToDec(Wire.receive());
*hour = bcdToDec(Wire.receive() & 0x3f);
*dayOfWeek = bcdToDec(Wire.receive());
*dayOfMonth = bcdToDec(Wire.receive());
*month = bcdToDec(Wire.receive());
*year = bcdToDec(Wire.receive());
}
void setup()
{
lcd.init(); // Inicializacion LCD
lcd.backlight(); // Iluminacion LCD
pinMode(zumbador, OUTPUT); // Funcion de salida Zumbador pin 9
pinMode(ledEstado, OUTPUT); // Funcion de salida LedEstado pin 13
pinMode(pir1, INPUT); // Funcion de entrada Pir 1 pin 2
pinMode(pir2, INPUT); // Funcion de entrada Pir 2 pin 4
Serial.begin(9600); // Puerto serie configurado a 9600 baudios.
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
Wire.begin();
// la primera vez debemos poner en hora, active esta parte y luego vuelva a quitarla
/*second = 00;
minute = 33;
hour = 15;
dayOfWeek = 6;
dayOfMonth = 11;
month = 2;
year = 12;
setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); */
}
void loop()
{
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
lcd.setCursor(6,0);
lcd.print(year, DEC);
lcd.setCursor(2,0);
lcd.print("/");
lcd.setCursor(3,0);
if (month < 10) lcd.print("0");
lcd.print(month, DEC);
lcd.setCursor(5,0);
lcd.print("/");
lcd.setCursor(0,0);
if (dayOfMonth < 10) lcd.print("0");
lcd.print(dayOfMonth, DEC);
lcd.print("");
lcd.setCursor(0,1);
if (hour < 10) lcd.print("0");
lcd.print(hour, DEC);
lcd.setCursor(2,1);
lcd.print(":");
lcd.setCursor(3,1);
if (minute < 10) lcd.print("0");
lcd.print(minute, DEC);
lcd.setCursor(5,1);
lcd.print(":");
if (second < 10) lcd.print("0");
lcd.print(second, DEC);
switch (dayOfWeek)
{
case 1:
lcd.setCursor(9,0);
lcd.print("Lunes");
break;
case 2:
lcd.setCursor(9,0);
lcd.print("Martes");
break;
case 3:
lcd.setCursor(9,0);
lcd.print("Miercoles");
break;
case 4:
lcd.setCursor(9,0);
lcd.print("Jueves");
break;
case 5:
lcd.setCursor(9,0);
lcd.print("Viernes");
break;
case 6:
lcd.setCursor(9,0);
lcd.print("Sabado");
break;
case 7:
lcd.setCursor(9,0);
lcd.print("Domingo");
break;
}
delay(1000); //Pausa durante 1 segundo
estadoPir1 = digitalRead(pir1); // Leer estado Pir 1
estadoPir2 = digitalRead(pir2); // Leer estado Pir 2
lcd.backlight(); // Iluminacion LCD
if (estadoPir1 == HIGH) { // Si esta sl sensor Pir 1 activado activa led Pin 13
for ( int i=20; i>=0; i-- ){ // Se inicia bucle cuenta atras desde 35s
Serial.println(i); // Se imprime bucle en puerto serie
lcd.setCursor (13,1); // Se establece el curso en el LCD
lcd.print(i); // Se imprime el valor de i por donde va.
if (i < 10) lcd.print(" "); // Imprime 2 espacios en blanco para eleminar numero residual.
digitalWrite(zumbador, HIGH);
delay(250);
digitalWrite(zumbador, LOW);
delay(1000); // Tiempo que esta en cada variable del bucle
}
digitalWrite(ledEstado, HIGH); //Pone led Estado pin 13 a nivel alto
digitalWrite(zumbador, HIGH);
lcd.setCursor(9,1);
lcd.print("Pir 1"); // Aparece en pantalla Pir 1
delay(1500);
digitalWrite(zumbador, LOW);
}
else { // Si no se da las condiciones anteriores pone led Estado a nivel bajo
digitalWrite(ledEstado, LOW);
lcd.setCursor(9,1);
if (estadoPir2 == HIGH) { // Si esta sl sensor Pir 1 activado activa led Pin 13
for ( int i=20; i>=0; i-- ){ // Se inicia bucle cuenta atras desde 35s
Serial.println(i); // Se imprime bucle en puerto serie
lcd.setCursor (13,1); // Se establece el curso en el LCD
lcd.print(i); // Se imprime el valor de i por donde va.
if (i < 10) lcd.print(" "); // Imprime 2 espacios en blanco para eleminar numero residual.
digitalWrite(zumbador, HIGH);
delay(250);
digitalWrite(zumbador, LOW);
delay(1000); // Tiempo que esta en cada variable del bucle
}
digitalWrite(ledEstado, HIGH); //Pone led Estado pin 13 a nivel alto
digitalWrite(zumbador, HIGH);
lcd.setCursor(9,1);
lcd.print("Pir 2"); // Aparece en pantalla Pir 2
delay(1500);
digitalWrite(zumbador, LOW);
}
else { // Si no se da las condiciones anteriores pone led Estado a nivel bajo
digitalWrite(ledEstado, LOW);
lcd.setCursor(9,1);
lcd.print("OK "); // Aparece en pantalla OK
}
}
}
Tambien estoy intentando parar la cuenta atras una vez iniciada simulando la desconexion de la alarma y no se como hacerlo, ni como empezar a ver si me podeis orientar un poco, porque mirando el manual del arduino no he visto nada que pueda aplicar...
Puse un pin digital como entrada e intente que usando if cuando ese pin este a nivel alto se desconecte la cuenta atras pero no lo consegui, creo que no es lo adecuado.