Alarma con Arduino

Hola. Mi proyecto funciona usando un arduino uno, un teclado matricial, leds y buzzers como salidas y una entrada. (La cual no funciona y es mi problema)

La alarma se desactiva presionando el código establecido, haciendo que ledVerde pase a estar encendido y ledRojo pase a estar apagado.
La alarma se activa presionando "*" y da un tiempo 'X' antes de encender y en este estado ledVerde pasa a apagarse y ledRojo a encender.
Cuando la alarma está encendida, tenemos que si se introduce el código erróneo se encenderá un buzzer, y debería ser que si una señal de entrada, (llamada "ir" en el código) se llega a apagar la alarma, debería de encenderse de igual manera, con su respectivo retraso.

No logro hacer que me encienda con la señal de ir, simplemente es como si no la detectara.
Gracias.
PHP:
include <Keypad.h>
 


const byte Filas = 4;  //Cuatro filas
const byte Cols = 4;   //Cuatro columnas
byte Pins_Filas[] = {9,8,7,6};//Pines Arduino a las filasbyte 
byte Pins_Cols[] = {5,4,3,2}; // Pines Arduino a las columnas.
//no utilizar los pines 1 y 0 para no interferir en Rx y Tx

char Teclas [ Filas ][ Cols ] =
 {
    {'1','2','3','A'},
    {'4','5','6','B'},
    {'7','8','9','C'},
    {'*','0','#','D'}
 };

char codigoSecreto[4] = {'1','2','3','4'}; // Aqui va el codigo secreto
// Para cambiar el tamaño de la clave, solo hay que cambiar el tamaño del array

int posicion=0;    // necesaria para la clave
int cursor=5;      // posicion inicial de la clave en el LCD
int clave=0;       // para el LCD
int luz=0;         // para el LCD
int tiempo=0;      // para el LCD
int ledVerde=11;   // pin para el LED verde
int ledRojo=12;    // pin para el LED rojo
int buzzer=10;     // pin altavoz
int ir = A0;
int buzz=1;

Keypad Teclado1 = Keypad(makeKeymap(Teclas), Pins_Filas, Pins_Cols, Filas, Cols);

void setup()
   {
      Serial.begin(9600) ;
     
      pinMode (ledVerde,OUTPUT);
      pinMode (ledRojo, OUTPUT);
      pinMode (buzzer, OUTPUT);
      pinMode(ir, INPUT);
      pinMode(buzz,OUTPUT);
      digitalWrite(ledRojo,HIGH); // encendemos el LED rojo
      digitalWrite(ledVerde, LOW); // apagamos el verde

    }

void loop()
   {
    //Serial.print(buzzer);
      //

      char pulsacion = Teclado1.getKey() ; // leemos pulsacion
      if (pulsacion != 0) //Si el valor es 0 es que no se ha pulsado ninguna tecla
        { // descartamos almohadilla y asterisco
          if (pulsacion != '#' && pulsacion != '*' && clave==0)
           { 
             cursor++;             // incrementamos el cursor
             tone(buzzer,350);     // tono de pulsacion
             delay(200);
             noTone(buzzer);

      //--- Condicionales para comprobar la clave introducida -----------
      // comparamos entrada con cada uno de los digitos, uno a uno
      if (pulsacion == codigoSecreto[posicion])
          posicion ++; // aumentamos posicion si es correcto el digito

      if (posicion == 4)
       { // comprobamos que se han introducido los 4 correctamente
         digitalWrite (13,HIGH);  // encendemos LED
         delay(200);                           // tono de clave correcta
         tone(buzzer,500);
         delay(100);
         noTone(buzzer);
         tone(buzzer,600);
         delay(100);
         noTone(buzzer);
         tone(buzzer,800);
         delay(100);
         noTone(buzzer);

        
         clave=1; // indicamos que se ha introducido la clave
         digitalWrite(ledRojo,LOW); // apagamos el LED rojo
         digitalWrite(ledVerde, HIGH); // encendemos el verde
     }
     //--- En el caso de que este incompleta o no hayamos acertado ----------
     if(cursor>8)        // comprobamos que no pase de la cuarta posicion
       {   cursor=5;     // lo volvemos a colocar al inicio
           posicion=0;           // borramos clave introducida
         
         alarma:
         delay(5000);
          if(digitalRead(ir == LOW) && clave == 0) 
          //Puerta abierta
                                 {    delay (5000)  ; 
                                          //digitalWrite(buzzer,HIGH); 
           if(clave==0)         // comprobamos que no hemos acertado
              { digitalWrite(buzzer,HIGH); // para generar
                              }                                                
        }                   
              
        }    
     }
     
   } 

 

 

 //--- Condicionales para resetear clave introducida -------------
 if (pulsacion == '*')
     { // asterisco para resetear el contador
       posicion = 0;
       cursor = 5;
       clave=0;
       posicion=0;

       delay(5000);
       digitalWrite(ledRojo,HIGH); // encendemos el LED rojo
       digitalWrite(ledVerde, LOW); // apagamos el verde
     

    }
 }
 
Última edición por un moderador:
No es:
Código:
if(digitalRead(ir == LOW) && clave == 0)
si no
Código:
 if((digitalRead(ir)== LOW) && (clave == 0))
 
Además de lo que te han dicho, la variable ` ir` lo estas implementando como si fuese una entrada analógica (A0) y después lo utilizas como entrada digital.
 
Además de lo que te han dicho, la variable ` ir` lo estas implementando como si fuese una entrada analógica (A0) y después lo utilizas como entrada digital.

Ese no es problema, A0 solo es el nombre del PIN para Arduino, es irrelevante si se usa el nombre A0 o "14", si ves la cabecera del Arduino Uno (pins_arduino.h), de hecho, A0 es una constante cuyo valor es 14.
 
Hola.
¿Me podrían ayudar corrigiéndome, por favor?
Tengo que hacer una alarma donde tengo 3 botones.
1. Al presionar el primer botón, se activa la alarma, y tenemos 15 segundos para salir de la casa antes de que te detecte el sensor.
2. El botón 2 es un botón de reset para desactivar la alarma, (cuando llegas a tu casa y el sensor te detecta tienes 30 segundos para desactivarla antes de que suene la alarma).
3. El botón 3 es un botón de "pánico", cuando se presiona empieza a sonar la alarma.
Uso un sensor ultrasónico y un buzzer.
C++:
int tiempo1=15000;
int tiempo2=30000;
int trig=7;
int echo=6;
int boton1=13;
int boton2=12;
int boton3=11;
int timbre=10;

void setup()
{
pinMode(boton1,INPUT);
pinMode(boton2,INPUT);
pinMode(boton3,INPUT);
pinMode(timbre,OUTPUT);
pinMode(trig,OUTPUT);
pinMode(echo,INPUT);
}

void loop() {
  if(digitalRead(boton1)==HIGH)
    {
      long duration, distance;
          digitalWrite(trig, LOW);
          delay(tiempo1);
          digitalWrite(trig, HIGH);
          delay(5);
          digitalWrite(trig, LOW);
          duration = pulseIn(echo, HIGH);
          distance = (duration/2)*0.0343;
        if (distance < 10)
          {
            digitalWrite(timbre,LOW);
            delay(tiempo2);
            tone(timbre,1000);
            delay(tiempo2);
          }
        else
          {
            noTone(timbre);
          }
    }
    if(digitalRead(boton2)==HIGH)
    {
      digitalWrite(trig,LOW);
      digitalWrite(timbre,LOW);
    }
  if(digitalRead(boton3)==HIGH)
    {
      digitalWrite(timbre,HIGH);
      delay(tiempo2);
    }
}


Eso es lo que hice pero no me funciona. 🙁
 
¿Y el rebote de los pulsadores?
Después de detectar los pulsadores tiene un retardo mínimo de 15 segundos, si bien es una buena practica, ¿ para que el antirebote ?

La pregunta sería: ¿ esta todo bien conectado ? ¿ estas las resistencias de pull down ? ¿ El modulo esta bien conectado ?

Usas Arduino, aprovecha la comunicación serial para imprimir mensajes de que esta haciendo tu circuito en cada paso, que valor lee el programa desde el modulo ultrasónico, etc.... Mejor debugguer que ese y gratis no vas a tener.
 
Atrás
Arriba