cuenta regresiva para alarma [SOLUCIONADO]

Hola, si alguien seria tan amable de ayudarme, estoy haciendo un codigo para un proyecto de alarma para la casa; tengo bastante avanzado el codigo pero mi problema esta que no se como realizar una cuenta regresiva una vez que la alarma esta activada para darme tiempo a desactivar la alarma cuando entre a la casa. se que tengo que utilizar la funcion millis ya que tengo que ingresar la clave a su vez que el conteo se realice pero no se como se utiliza esta variable. desde ya muchas gracias.

Hola,

unsigned long tiempoAnterior = 0;  //guarda tiempo de referencia para comparar

  if(millis()>tiempoAnterior+periodo){  //si ha transcurrido el periodo programado
    Lo que quieras hacer
    tiempoAnterior=millis();  //guarda el tiempo actual como referencia
    }

¿De verdad no has encontrado nada de información?.
Feliz Navidad.

claro, pero segun lo que entiendo de ese fragmento de codigo realiza la cuenta regresiva y despues hago lo que quiero. es asi o estoy equivocado?
yo necesitaria poder ingresar la clave mientras transcurre ese tiempo y de ser correcta que desactive la alarma y si se acaba el tiempo si que suene la alarma; no se si me explico.
Feliz navidad :slight_smile: y muchas gracias por la ayuda

Como no has puesto nada de tú código no se cómo lo tienes estructurado, deberás de modificarlo un poco, la clave es donde colocas la inicialización del tiempo y en el if añadir una variable de que la alarma está activa, si la alarma está activa y se cumple el tiempo entonces suena.

Por favor, lee las normas del foro y edita tu post. Los códigos van con etiquetas

#include <LiquidCrystal.h> 
#include <Keypad.h>
#define buzzer 8
#define trigPin 9
#define echoPin 10
#define luz_v  3
#define luz_r  11
long duration;
int distance, initialDistance, currentDistance, i;
int screenOffMsg =0;
String password="1234";
String tempPassword;
boolean activated = false; // Estado de la alarma
boolean isActivated;
boolean activateAlarm = false;
boolean alarmActivated = false;
boolean enteredPassword; // Estado de la contraseña ingresada para detener la alarma
boolean passChangeMode = false;
boolean passChanged = false;
const byte ROWS = 4; //filas
const byte COLS = 4; //columnas
char keypressed;
//defina los simbolos en los botones de los teclados
char keyMap[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {A5, A4, A3, A2}; 
byte colPins[COLS] = {A1, A0, 12, 13}; 
Keypad myKeypad = Keypad( makeKeymap(keyMap), rowPins, colPins, ROWS, COLS); 
LiquidCrystal lcd(1, 2, 4, 5, 6, 7); // (rs, enable, d4, d5, d6, d7) 
void setup() { 
  lcd.begin(16,2); 
  pinMode(buzzer, OUTPUT); 
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT); 
  pinMode(luz_v, OUTPUT);
  pinMode(luz_r, OUTPUT);
}
void loop() {
  if (activateAlarm) {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("LA ALARMA SE");
    lcd.setCursor(0,1);
    lcd.print("ACTIVARA EN");
   
    int countdown = 9; // 9 segundos de cuenta regresiva
    while (countdown != 0) {
      lcd.setCursor(13,1);
      lcd.print(countdown);
      countdown--;
      tone(buzzer, 700, 100);
      delay(1000);
    }
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("ALARMA ACTIVADA");
    initialDistance = getDistance();
    activateAlarm = false;
    alarmActivated = true;
    digitalWrite(luz_v, HIGH);
     digitalWrite(luz_r, LOW);
  }
  if (alarmActivated == true){
      currentDistance = getDistance() + 10;
      if ( currentDistance < initialDistance) {
        tone(buzzer, 1000);  
        lcd.clear();
        enterPassword();
      }
    }
  if (!alarmActivated) {
    if (screenOffMsg == 0 ){
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("A - ACTIVAR");
      lcd.setCursor(0,1);
      lcd.print("B - CAMBIAR PASS");
      screenOffMsg = 1;
      digitalWrite(luz_v, LOW);
      digitalWrite(luz_r, LOW);
    }
    keypressed = myKeypad.getKey();
     if (keypressed =='A'){        // Si A se presiona se activa la alarma
      tone(buzzer, 1000, 200);
      activateAlarm = true;            
    }
    else if (keypressed =='B') {
      lcd.clear();
      int i=1;
      tone(buzzer, 2000, 100);
      tempPassword = "";
      lcd.setCursor(0,0);
      lcd.print("PASSWORD");
      lcd.setCursor(0,1);
      lcd.print(">");
      passChangeMode = true;
      passChanged = true;   
      while(passChanged) {      
      keypressed = myKeypad.getKey();
      if (keypressed != NO_KEY){
        if (keypressed == '0' || keypressed == '1' || keypressed == '2' || keypressed == '3' ||
            keypressed == '4' || keypressed == '5' || keypressed == '6' || keypressed == '7' ||
            keypressed == '8' || keypressed == '9' ) {
         tempPassword += keypressed;
         lcd.setCursor(i,1);
         lcd.print("*");
         i++;
         tone(buzzer, 2000, 100);
        }
      }
      if (i > 5 || keypressed == '#') {
        tempPassword = "";
        i=1;
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print("PASSWORD");
        lcd.setCursor(0,1);
        lcd.print(">"); 
      }
      if ( keypressed == '*') {
        i=1;
        tone(buzzer, 2000, 100);
        if (password == tempPassword) {
          tempPassword="";
          lcd.clear();
          lcd.setCursor(0,0);
          lcd.print("NUEVA PASSWORD");
          lcd.setCursor(0,1);
          lcd.print(">");
          while(passChangeMode) {
            keypressed = myKeypad.getKey();
            if (keypressed != NO_KEY){
              if (keypressed == '0' || keypressed == '1' || keypressed == '2' || keypressed == '3' ||
                  keypressed == '4' || keypressed == '5' || keypressed == '6' || keypressed == '7' ||
                  keypressed == '8' || keypressed == '9' ) {
                tempPassword += keypressed;
                lcd.setCursor(i,1);
                lcd.print("*");
                i++;
                tone(buzzer, 2000, 100);
              }
            }
            if (i > 5 || keypressed == '#') {
              tempPassword = "";
              i=1;
              tone(buzzer, 2000, 100);
              lcd.clear();
              lcd.setCursor(0,0);
              lcd.print("NUEVA PASSWORD");
              lcd.setCursor(0,1);
              lcd.print(">");
            }
            if ( keypressed == '*') {
              i=1;
              tone(buzzer, 2000, 100);
              password = tempPassword;
              passChangeMode = false;
              passChanged = false;
              screenOffMsg = 0;
            }            
          }
        }
      }
    }
   }
 }
}
void enterPassword() {
  int k=5;
  tempPassword = "";
  activated = true;
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(" *** ALARMA *** ");
  lcd.setCursor(0,1);
  lcd.print("PASS>");
  digitalWrite(luz_v, LOW);
  digitalWrite(luz_r, HIGH);
      while(activated) {
      keypressed = myKeypad.getKey();
      if (keypressed != NO_KEY){
        if (keypressed == '0' || keypressed == '1' || keypressed == '2' || keypressed == '3' ||
            keypressed == '4' || keypressed == '5' || keypressed == '6' || keypressed == '7' ||
            keypressed == '8' || keypressed == '9' ) {
          tempPassword += keypressed;
          lcd.setCursor(k,1);
          lcd.print("*");
          k++;
        }
      }
      if (k > 9 || keypressed == '#') {
        tempPassword = "";
        k=5;
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print(" *** ALARMA *** ");
        lcd.setCursor(0,1);
        lcd.print("Pass>");
      }
      if ( keypressed == '*') {
        if ( tempPassword == password ) {
          activated = false;
          alarmActivated = false;
          noTone(buzzer);
          screenOffMsg = 0; 
        }
        else if (tempPassword != password) {
          lcd.setCursor(0,1);
          lcd.print("INCORRECTO");
          delay(2000);
          lcd.clear();
          lcd.setCursor(0,0);
          lcd.print(" *** ALARMA *** ");
          lcd.setCursor(0,1);
          lcd.print("PASS>");
        }
      }    
    }
}
// Funcion para el modulo de ultrasonido
long getDistance(){
  //int i=10;
  
  //while( i<=10 ) {
  // Borra el TrigPin
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  // Establece el trigPin en estado ALTO durante 10 micro segundos
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  // Lee el echoPin, devuelve el tiempo de viaje de la onda de sonido en microsegundos
  duration = pulseIn(echoPin, HIGH);
  // Calcula la distancia
  distance = duration*0.034/2;
  //sumDistance += distance;
  //}
  //int averageDistance= sumDistance/10;
  return distance;
}

Este es el codigo hasta el momento, todavia me falta agregarle un modulo gsm y la parte de la cuenta regresiva para la desconexion.

Hola,
Creo que así

#include <LiquidCrystal.h>
#include <Keypad.h>
#define buzzer 8
#define trigPin 9
#define echoPin 10
#define luz_v  3
#define luz_r  11
long duration;
int distance, initialDistance, currentDistance, i;
int screenOffMsg =0;
String password="1234";
String tempPassword;
boolean activated = false; // Estado de la alarma
boolean isActivated;
boolean activateAlarm = false;
boolean alarmActivated = false;
boolean enteredPassword; // Estado de la contraseña ingresada para detener la alarma
boolean passChangeMode = false;
boolean passChanged = false;
const byte ROWS = 4; //filas
const byte COLS = 4; //columnas
char keypressed;
//defina los simbolos en los botones de los teclados
char keyMap[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {A5, A4, A3, A2};
byte colPins[COLS] = {A1, A0, 12, 13};
Keypad myKeypad = Keypad( makeKeymap(keyMap), rowPins, colPins, ROWS, COLS);
LiquidCrystal lcd(1, 2, 4, 5, 6, 7); // (rs, enable, d4, d5, d6, d7)
void setup() {
  lcd.begin(16,2);
  pinMode(buzzer, OUTPUT);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(luz_v, OUTPUT);
  pinMode(luz_r, OUTPUT);
}
void loop() {
  if (activateAlarm) {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("LA ALARMA SE");
    lcd.setCursor(0,1);
    lcd.print("ACTIVARA EN");
   
    int countdown = 9; // 9 segundos de cuenta regresiva
    while (countdown != 0) {
      lcd.setCursor(13,1);
      lcd.print(countdown);
      countdown--;
      tone(buzzer, 700, 100);
      delay(1000);
    }
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("ALARMA ACTIVADA");
    initialDistance = getDistance();
    activateAlarm = false;
    alarmActivated = true;
    digitalWrite(luz_v, HIGH);
     digitalWrite(luz_r, LOW);
  }
  if (alarmActivated == true){
      currentDistance = getDistance() + 10;
      if ( currentDistance < initialDistance) {
        //tone(buzzer, 1000); 
        lcd.clear();
        enterPassword();
      }
    }
  if (!alarmActivated) {
    if (screenOffMsg == 0 ){
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("A - ACTIVAR");
      lcd.setCursor(0,1);
      lcd.print("B - CAMBIAR PASS");
      screenOffMsg = 1;
      digitalWrite(luz_v, LOW);
      digitalWrite(luz_r, LOW);
    }
    keypressed = myKeypad.getKey();
     if (keypressed =='A'){        // Si A se presiona se activa la alarma
      tone(buzzer, 1000, 200);
      activateAlarm = true;           
    }
    else if (keypressed =='B') {
      lcd.clear();
      int i=1;
      tone(buzzer, 2000, 100);
      tempPassword = "";
      lcd.setCursor(0,0);
      lcd.print("PASSWORD");
      lcd.setCursor(0,1);
      lcd.print(">");
      passChangeMode = true;
      passChanged = true;   
      while(passChanged) {     
      keypressed = myKeypad.getKey();
      if (keypressed != NO_KEY){
        if (keypressed == '0' || keypressed == '1' || keypressed == '2' || keypressed == '3' ||
            keypressed == '4' || keypressed == '5' || keypressed == '6' || keypressed == '7' ||
            keypressed == '8' || keypressed == '9' ) {
         tempPassword += keypressed;
         lcd.setCursor(i,1);
         lcd.print("*");
         i++;
         tone(buzzer, 2000, 100);
        }
      }
      if (i > 5 || keypressed == '#') {
        tempPassword = "";
        i=1;
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print("PASSWORD");
        lcd.setCursor(0,1);
        lcd.print(">");
      }
      if ( keypressed == '*') {
        i=1;
        tone(buzzer, 2000, 100);
        if (password == tempPassword) {
          tempPassword="";
          lcd.clear();
          lcd.setCursor(0,0);
          lcd.print("NUEVA PASSWORD");
          lcd.setCursor(0,1);
          lcd.print(">");
          while(passChangeMode) {
            keypressed = myKeypad.getKey();
            if (keypressed != NO_KEY){
              if (keypressed == '0' || keypressed == '1' || keypressed == '2' || keypressed == '3' ||
                  keypressed == '4' || keypressed == '5' || keypressed == '6' || keypressed == '7' ||
                  keypressed == '8' || keypressed == '9' ) {
                tempPassword += keypressed;
                lcd.setCursor(i,1);
                lcd.print("*");
                i++;
                tone(buzzer, 2000, 100);
              }
            }
            if (i > 5 || keypressed == '#') {
              tempPassword = "";
              i=1;
              tone(buzzer, 2000, 100);
              lcd.clear();
              lcd.setCursor(0,0);
              lcd.print("NUEVA PASSWORD");
              lcd.setCursor(0,1);
              lcd.print(">");
            }
            if ( keypressed == '*') {
              i=1;
              tone(buzzer, 2000, 100);
              password = tempPassword;
              passChangeMode = false;
              passChanged = false;
              screenOffMsg = 0;
            }           
          }
        }
      }
    }
   }
 }
}
void enterPassword() {
  int k=5;
  tempPassword = "";
  activated = true;
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(" *** ALARMA *** ");
  lcd.setCursor(0,1);
  lcd.print("PASS>");
  digitalWrite(luz_v, LOW);
  digitalWrite(luz_r, HIGH);
  unsigned long tiempoAnterior = millis();  //guarda tiempo de referencia para comparar
      while(activated) {
      keypressed = myKeypad.getKey();
      if (keypressed != NO_KEY){
        if (keypressed == '0' || keypressed == '1' || keypressed == '2' || keypressed == '3' ||
            keypressed == '4' || keypressed == '5' || keypressed == '6' || keypressed == '7' ||
            keypressed == '8' || keypressed == '9' ) {
          tempPassword += keypressed;
          lcd.setCursor(k,1);
          lcd.print("*");
          k++;
        }
      }
      if (k > 9 || keypressed == '#') {
        tempPassword = "";
        k=5;
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print(" *** ALARMA *** ");
        lcd.setCursor(0,1);
        lcd.print("Pass>");
      }
      if ( keypressed == '*') {
        if ( tempPassword == password ) {
          activated = false;
          alarmActivated = false;
          noTone(buzzer);
          screenOffMsg = 0;
        }
        else if (tempPassword != password) {
          lcd.setCursor(0,1);
          lcd.print("INCORRECTO");
          delay(2000);
          lcd.clear();
          lcd.setCursor(0,0);
          lcd.print(" *** ALARMA *** ");
          lcd.setCursor(0,1);
          lcd.print("PASS>");
        }
      }
  if(millis()>tiempoAnterior + 5000) // Cinco segundos para desactivar
  {  //si ha transcurrido el periodo programado
    tone(buzzer, 1000);
  }   
    }
}
// Funcion para el modulo de ultrasonido
long getDistance(){
  //int i=10;
 
  //while( i<=10 ) {
  // Borra el TrigPin
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  // Establece el trigPin en estado ALTO durante 10 micro segundos
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  // Lee el echoPin, devuelve el tiempo de viaje de la onda de sonido en microsegundos
  duration = pulseIn(echoPin, HIGH);
  // Calcula la distancia
  distance = duration*0.034/2;
  //sumDistance += distance;
  //}
  //int averageDistance= sumDistance/10;
  return distance;
}

funciono.. muchas gracias