Cuenta atras para alarma Nuevo PROBLEMA

Buenas a todos, estoy montando una alarma y quiero poner una cuenta atras para para activarla y para desactivarla, actualmente la he realizado asi:

if (estadoPir2 == HIGH) { // Si esta sl sensor Pir 2 activado activa led Pin 13

lcd.setCursor(9,1);
delay (1000);
lcd.print("6 ");
lcd.setCursor(9,1);
delay (1000);
lcd.print("5 ");
lcd.setCursor(9,1);
delay (1000);
lcd.print("4 ");
lcd.setCursor(9,1);
delay (1000);
lcd.print("3 ");
lcd.setCursor(9,1);
delay (1000);
lcd.print("2 ");
lcd.setCursor(9,1);
delay (1000);
lcd.print("1 ");
lcd.setCursor(9,1);
delay (1000);
lcd.print("0 ");
lcd.setCursor(9,1);
delay (1000);
lcd.print("Pir 2"); // Aparece en pantalla Pir 2
digitalWrite(ledEstado, HIGH); //Pone led Estado pin 13 a nivel alto

Pero claro este es un ejemplo, para hacer la cuanta atras de 40segundos por ejemplo pues son muchas lineas, de que otra manera podria realizarlo?

Ya que no he encontrado nada mas y me extraña que esta sea la unica manera.

Saludos y gracias

puedes utilizar un bucleo for o while.
mira la documentación e intentalo, si no te sale pon tu código aquí y te ayudo.
basicamente tienes que meter dentro del bucle la parte de setcursor,dealy y print

puedes utilizar un bucleo for o while.
mira la documentación e intentalo, si no te sale pon tu código aquí y te ayudo.
basicamente tienes que meter dentro del bucle la parte de setcursor,dealy y print

Ok, muchas gracias ahora mismo estaba con la documentación y he encontrado un par de ejemplo, ahora solo me queda entenderlo bien y adaptarlo.

a ver si soy capaz jejeje.

Saludos

Pues tengo que ser mas tonto de lo que pensaba jeje porque no soy capaz de implementarlo a mi codigo jejeje.

Este es el codigo con el aviso de presencia mediante 2 pir, mostrandolo en LCD junto con la fecha y la hora he iluminando el led del pin 13 de la placa.

asi es como lo puse anteriormente, pero claro son muchas lineas:

// 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 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
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

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 = 24;
hour = 12;
dayOfWeek = 7;
dayOfMonth = 01;
month = 4;
year = 12;

setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); */

}

void loop()
{

lcd.backlight(); // Iluminacion LCD
lcd.setCursor(0,0); // Seleccionamos posicion del cursor

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

lcd.setCursor(9,1);
lcd.print("5 ");
lcd.setCursor(9,1);
delay (1000);
lcd.print("4 ");
lcd.setCursor(9,1);
delay (1000);
lcd.print("3 ");
lcd.setCursor(9,1);
delay (1000);
lcd.print("2 ");
lcd.setCursor(9,1);
delay (1000);
lcd.print("1 ");
lcd.setCursor(9,1);
delay (1000);
lcd.print("0 ");
lcd.setCursor(9,1);
delay (1000);
lcd.print("Pir 1"); // Aparece en pantalla Pir 1
digitalWrite(ledEstado, HIGH); //Pone led Estado pin 13 a nivel alto

}

else { // Si no se da las condiciones anteriores pone led Estado a nivel bajo
digitalWrite(ledEstado, LOW);

if (estadoPir2 == HIGH) { // Si esta sl sensor Pir 2 activado activa led Pin 13

lcd.setCursor(9,1);
delay (1000);
lcd.print("6 ");
lcd.setCursor(9,1);
delay (1000);
lcd.print("5 ");
lcd.setCursor(9,1);
delay (1000);
lcd.print("4 ");
lcd.setCursor(9,1);
delay (1000);
lcd.print("3 ");
lcd.setCursor(9,1);
delay (1000);
lcd.print("2 ");
lcd.setCursor(9,1);
delay (1000);
lcd.print("1 ");
lcd.setCursor(9,1);
delay (1000);
lcd.print("0 ");
lcd.setCursor(9,1);
delay (1000);
lcd.print("Pir 2"); // Aparece en pantalla Pir 2
digitalWrite(ledEstado, HIGH); //Pone led Estado pin 13 a nivel alto

}

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

}

}
}

y este otro el codigo que empece a modificar para implementarlo a mi codigo, pero me extraña que tenga que poner yo todos los numeros de la cuenta atras como en este codigo, y luego no se como hacer que empiece la cuenta atras justo cuando salta algun Pir..

// Se inicializan las constantes (variables cuyo valor no cambiara durante la ejecución del programa) y se le asignan los números de pin.
const int buzzerPin = 9;
const int ledPin = 13;

void setup(){

// Se asignan los pines.
pinMode(ledPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);

// Se ajusta la salida de datos del puerto serie a 9600 baudios.
Serial.begin(9600);

};

void loop(){

// Se inicializa un array de tipo char (texto/string) con los valores que se mostraran por el puerto serie.
// El asterisco aun no tengo claro que función tiene, pero sin él da error la compilación.
char* cuentaAtras[] = {"Sirena!", "1", "2", "3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26"};

// Se inicia un bucle que va marcha atrás de modo que a cada vuelta obtenemos que i vale: 3, 2, 1 y 0.
for ( int i=26; i>=0; i-- ){

// Se imprime en pantalla el valor del array que corresponda a la vuelta del for.
Serial.println(cuentaAtras*);*

  • // Además, cuando el valor del array contenga la palabra "Despegue!" se encenderá el ledPin y a continuación el buzzerPin con sus tiempos correspondientes.*
    _ if ( cuentaAtras == "Despegue!" ){_
    * digitalWrite(ledPin, HIGH);*
    * delay(800);*
    * digitalWrite(buzzerPin, HIGH);*
    * digitalWrite(ledPin, LOW);*
    * delay(200);*
    * digitalWrite(buzzerPin, LOW);*
    * }*
    * else{*
    * delay(1000);*
    * }*

* }*

}[/quote]
Saludos y perdon por ser tan ceporro :cold_sweat:

intenta hacer la cosas por partes.
lo que planteas en tu primer mensaje es hacer que muestre por lcd la cuenta atras con un código mas optimizado.
vamos a solucionar eso y luego ya pondras el resto de tu código.

intenta escribir un bucle for que contenga lo que te he puesto en mi primer mensaje.
cuando tengas el lcd haciendolo puedes añadirlo al resto de tu codigo.

ademas esta linea

    // Se imprime en pantalla el valor del array que corresponda a la vuelta del for.
    Serial.println(cuentaAtras);

no tiene sentido, tendrias que mostrar unicamente el valor del FOR por el que vas

    // Se imprime en pantalla el valor del array que corresponda a la vuelta del for.
    Serial.println(i);

animo

ok, voy a ello jeje, una preguntilla, para la cuenta atras tengo que poner yo todos los numeros de 0 al 30 por ejemplo o eso lo realizara solo el arduino?

para la cuenta atras tienes que imprimir el valor de la "i" del FOR por el que vas.

por serie...
Serial.println(i);

por lcd

lcd.print(i);

esto tiene que ir dentro del FOR que esta reduciendo la i desde 26 o donde sea hasta cero

ok,ahora si lo he pillado, ya que el codigo que encontre de ejemplo usaba char*, que ami no me hace falta para nada.

ahora si me funciona, lo he dejado asi:

// Se inicializan las constantes (variables cuyo valor no cambiara durante la ejecución del programa) y se le asignan los números de pin.
#include <Wire.h> // Libreria para I2C
#include <LiquidCrystal_I2C.h> // Libreria para LCD

LiquidCrystal_I2C lcd(0x27,16,2); // Direccion de bus pantalla

void setup(){

lcd.init();
lcd.backlight();

// Se ajusta la salida de datos del puerto serie a 9600 baudios.
Serial.begin(9600);

}

void loop(){

// Se inicializa un array de tipo char (texto/string) con los valores que se mostraran por el puerto serie.
// El asterisco aun no tengo claro que función tiene, pero sin él da error la compilación.

// Se inicia un bucle que va marcha atrás de modo que a cada vuelta obtenemos que i vale: 3, 2, 1 y 0.
for ( int i=26; i>=0; i-- ){

// Se imprime en pantalla el valor del array que corresponda a la vuelta del for.
Serial.println(i);
lcd.setCursor(0,0);
lcd.print(i);

delay(1000);
}

}

Pero tengo un pequeño problema al mostrarlo por el LCD, del 26 al 10 genial, pero bajando de hay me deja el 0 del 10 residual y claro en vez de mostrar 9,8,7,.... pues aparece 90,80,70.... y no se como hacer que lo muestre bien.

// Se inicializan las constantes (variables cuyo valor no cambiara durante la ejecución del programa) y se le asignan los números de pin.
#include <Wire.h>                   // Libreria para I2C
#include <LiquidCrystal_I2C.h>      // Libreria para LCD

LiquidCrystal_I2C lcd(0x27,16,2);  // Direccion de bus pantalla


void setup(){
 
  lcd.init();
  lcd.backlight();
  
 
  // Se ajusta la salida de datos del puerto serie a 9600 baudios.
  Serial.begin(9600);
 
}
 
void loop(){
 
  // Se inicializa un array de tipo char (texto/string) con los valores que se mostraran por el puerto serie.
  // El asterisco aun no tengo claro que función tiene, pero sin él da error la compilación.

 
  // Se inicia un bucle que va marcha atrás de modo que a cada vuelta obtenemos que i vale: 3, 2, 1 y 0.
  for ( int i=26; i>=0; i-- ){
 
    // Se imprime en pantalla el valor del array que corresponda a la vuelta del for.
    Serial.println(i);
    lcd.setCursor(0,0);
    lcd.print(i);
     if (i < 10) lcd.print(" ");
    
     delay(1000);
    }
 
  }

añade
if (i < 10) lcd.print(" ");
esto imprime un espacio y borrara ese segundo digito que se quedo.

Ole, ole, ole jejejej.

Muchas gracias compañero sin ti abria dado muchas vueltas jejeje, hay muchas cosas que aun no entiendo muy bien, como funcionan y como usarlas.

Saludos

de nada, podrías pegar tu código final y marcar el post en el titulo como solucionado para futuras consultas.
un saludo

Bueno, aqui esta como a quedado al final:

#include <Wire.h> // Libreria para I2C
#include <LiquidCrystal_I2C.h> // Libreria para LCD

LiquidCrystal_I2C lcd(0x27,16,2); // Direccion de bus pantalla

void setup(){

lcd.init();
lcd.backlight();

// Se ajusta la salida de datos del puerto serie a 9600 baudios.
Serial.begin(9600);

}

void loop(){

// Se inicia un bucle que va marcha atrás de modo que a cada vuelta obtenemos que i vale: 3, 2, 1 y 0.
for ( int i=26; i>=0; i-- ){

// Se imprime en pantalla el valor del array que corresponda a la vuelta del for.
Serial.println(i);
lcd.setCursor(0,0);
lcd.print(i);
if (i < 10) lcd.print(" ");

delay(1000);
}

}

Ahora a ver si soy capaz de hacer que empiece la cuenta atras cuando yo quiero, en el armado de la alarma y para desactivarla.

Saludos

Buenas de nuevo, me ha surgido un nuevo problema, entonces en vez de abrir un tema nuevo pues lo añado aqui.

Ya que implementado la cuenta atras a mi codigo, añadiendo un zumbador para que valla cantando la cuenta atras antes de que saltara la alarma, todo perfecto.

El problema es que cuando se activa la cuenta atras el reloj mostrado en el LCD se queda congelado y cuando pasa la cuenta atras se actualiza.

Alguna forma de solucionarlo?

código?

Te refieres a un reloj a tiempo real?

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.

Tiozes,

No tienes que utilizar delay(), sino usar variables para compararlas con el tiempo que lleva arduino encendido, de esta forma puedes decidir cuando mostrar el siguiente número en tu LCD sin parar el código.

ejemplo:

Var A = millis() --> Guarda en A el tiempo actual (en milisegundos)
...
...
if (millis() >= A+1000) --> esto se puede leer como: "Si ha pasado un segundo entonces"
{
*** representa el siguiente numero ***
A = millis() ---> vuelves a guardar el nuevo “tiempo” para el próximo chequeo
}

Lógicamente lo que te he puesto no es código... sino para que se entienda.

No he leído todo tu código, pero supongo que tendrás que modificarlo bastante para que te funcione. En un sistema de alarma no puedes utilizar ni un solo delay() porque podría dar la casualidad de que en ese justo segundo pase algo de lo que te quieras enterar... :wink:

Un Saludo

Imagina:
Tiozes,

No tienes que utilizar delay(), sino usar variables para compararlas con el tiempo que lleva arduino encendido, de esta forma puedes decidir cuando mostrar el siguiente número en tu LCD sin parar el código.

ejemplo:

Var A = millis() --> Guarda en A el tiempo actual (en milisegundos)
...
...
if (millis() >= A+1000) --> esto se puede leer como: "Si ha pasado un segundo entonces"
{
*** representa el siguiente numero ***
A = millis() ---> vuelves a guardar el nuevo “tiempo” para el próximo chequeo
}

Lógicamente lo que te he puesto no es código... sino para que se entienda.

No he leído todo tu código, pero supongo que tendrás que modificarlo bastante para que te funcione. En un sistema de alarma no puedes utilizar ni un solo delay() porque podría dar la casualidad de que en ese justo segundo pase algo de lo que te quieras enterar... :wink:

Un Saludo

Ummmm, no habia caido en lo de usar delay, porque claro usandolo se para el codigo alli durante el tiempo marcado, espero haberlo entendido bien.

Pues a modificarlo... a ver que tal queda la cosa, despues de comer me pondre a ello a ver que sale.

Muchas gracias

Yo he realizado varias alarmas. Las primeras eran prehistóricas pero ahora ya tienen su punto. Lo único que me falta es poder guardar los eventos en la eeprom en función del reloj. Sigo tu post atento.
Si necesitas ideas o ayudas aquí me tienes.