Uso de dos sensores PIR de forma simultánea para detectar perro.

Buenas noches a todos,

Soy nuevo posteando en el foro, así que espero hacerlo de forma correcta. Estoy teniendo un problema a la hora de programar dos sensores de movimiento PIR AM312 para detectar cuando mi perro, de pequeño tamaño, entra a mi habitación en mi ausencia. Estoy usando dos sensores, uno en el suelo, para detectar al perro y otro sobre una mesa para detectar una posible presencia humana y evitar falsos positivos. Así, si el detector sobre el suelo, sensorinferior, detecta movimiento y el sensorsuperior no detecta, se puede estar seguro que es el perro que está pasando delante.
Estoy usando Arduino UNO, y la idea es que cuando el perro sea detectado se me avise de varias formas: con un correo electrónico, para lo que uso un módulo ESP32-CAM, que realizará una fotografía del perro y me la mandará por correo electrónico, también con un SMS, para lo que utilizo una tarjeta SIM900, y también se me avisará con un mensaje LoRa, a través de dos módulos TTGO LoRa32 SX1278. Al mismo tiempo le quiero añadir la complicación de que sólo se me avise cuando el perro haya pasado al menos dos veces en menos de dos minutos.
Es con esta última condición con la que creo que estoy teniendo problemas a la hora de notificarme. El código que estoy usando es el siguiente:

[code]

#include <SoftwareSerial.h>; //librerías para SIM900 y poder mandar el SMS

#include<LoRa.h>

// Tiempo para calibrar los sensores de movimiento unos 30 segundos aproximadamente según el fabricante
int tiempoDeCalibracion = 30;

//Pines en los que vamos a conectar los sensores PIR
int sensorsuperior = 3; //Pin donde conectaremos la salida OUT del sensor de arriba. Lo hemos cambiado al 3 puesto que el 2 es el IRQ del bus SPI.
int sensorinferior = 4; //Pin donde se conectará la salida OUT del sensor de abajo

//Pines en los que conectaremos las salidas de los sensores
int pinperro = 5; //Pin donde conectaremos el cable que va al ESP32-CAM. 
int loraperro = 6; //pin in Arduino where the connection will be made from Arduino to Lora
int veces = 0; //Controla el número de veces que la mascota ha pasado por delante del sensor, si son dos veces o superior se dará la alarma y se avisará
// al dueño de la mascota.
const byte numveces = 2;

// tiempo a cero que se le sumara el intervalo de 2 minutos para comparar con el tiempo
//previo
unsigned long intervalo2min = 120000; // dos minutos en milisegundos para medir que el perro no pase más de dos veces
// en dos minutos.
unsigned long  tiempoPrevio;
boolean notificado = false;

void setup() {
  Serial.begin(19200);
  //A PARTIR DE AQUI SETUP DEL MÓDULO SIM900 PARA ENVIAR SMS SI SE DETECTARA AL PERRO
 codigo
  //A PARTIR DE AQUI SETUP DE LOS SENSORES
 
  pinMode(sensorsuperior, INPUT); //la salida del sensor sera por tanto una entrada en arduino
  pinMode(sensorinferior, INPUT);
  digitalWrite(sensorsuperior, LOW); //nos aseguramos que el valor de los dos sensores
  digitalWrite(sensorinferior, LOW); // se encuentren a nivel bajo
  pinMode(pinperro, OUTPUT); //el pin que se activa cuando se detecta al animal y va directamente al ESP32-CAM
  pinMode (loraperro, OUTPUT);

  tiempoPrevio = millis(); //tiempo Previo se inicializará con millis en el setup antes de detectar al perro, por lo que valdrá 0 en el loop
  //Se da tiempo para que los sensores de movimiento se calibren, según fabricante inferior a 1 minuto, valdrá con 30 segundos
  Serial.print("Calibrando sensores ");
  for (int i = 0; i < tiempoDeCalibracion; i++) {
    Serial.print(".");
    delay(1000);
  }
  Serial.println ("CALIBRADO CORRECTO");
  delay(50);

}
void loop() {
  unsigned long currentMillis=millis();
  delay(3000);
  if ((currentMillis - tiempoPrevio) <= (tiempoPrevio + intervalo2min)) { //es decir, si todavía no han pasado dos minutos, entro y compruebo si el perro ha pasado, si en este intervalo detecto que ha pasado
    //dos veces, entonces es cuando doy la voz de alarma. Al final de los dos minutos es cuando actualizo el valor de tiempoPrevio a millis().

  //A continuación compruebo los valores de los dos sensores y si ya hemos notificado al propietario para no inundar a mensajes, valdrá true si ya hemos notificado cuando el perro haya pasado dos veces  
  if (digitalRead(sensorinferior) == HIGH && digitalRead(sensorsuperior) == LOW && (notificado == false)) {
      //El sensor inferior está activado, el superior no : pasa el perro, comprobamos si ha pasado un mínimo de dos veces en dos minutos
      Serial.println("El perro está pasando...");
      veces++;//Con esta variable se controla el número de veces que pasa el perro frente al sensor,  se incrementa en uno cada vez que pasa
      Serial.print("El numero de veces que ha pasado el perro frente al sensor hasta ahora es de: "); Serial.println(veces);
      Serial.print("Y el valor de la variable booleana notificado es de ");Serial.println(digitalRead(notificado));
      if (veces >= numveces) {//compruebo que el número de veces es mayor o igual a 2, como lo compruebo dentro del intervalo2min,
        //estoy viendo si en menos de dos minutos el perro ha pasado dos veces
        //AQUÍ SE ACTIVAN TODOS LOS ACTUADORES, SE MANDA CORREO, SE MANDA SMS Y SE  MANDA MENSAJE LORA
        Serial.print("El perro ha pasado dos o más veces a la habitación, por lo tanto ");
        Serial.print("se manda señal para mandar correo electrónico");
        digitalWrite(pinperro, HIGH); //Se enciende el pinperro, aquí mandaremos una interrupción al GPIO13 del ESP32-CAM para tomar la fotografía
        delay(10000);
        digitalWrite(pinperro, LOW); //Se desactiva el pin pinperro, para provocar la interrupción es suficiente este tiempo
        Serial.println("y se manda señal para mandar un SMS");
        mensaje_sms(); // mandamos SMS al dueño avisando de la intrusión del perro
        Serial.println(" y también se manda señal para mensaje LoRa");
        digitalWrite(loraperro, HIGH); //se activa la señal hacia el circuito del pin12 en SX1278 para mandar mensaje
        delay(3000);// se manda señal LoRa al receptor
        digitalWrite(loraperro, LOW); // se vuelve a poner a nivel bajo la señal de entrada al pin 12 del SX1278
        veces = 0; // Se reinicia el valor de veces a 0, puesto que ya ha alcanzado el valor límite de 2.
        notificado=true;//así ya no volvería a notificar al dueño en este intervalo de dos minutos.
        
      }
    }
  } else {//es decir, si estoy en un tiempo tal que se han cumplido 2 minutos o más desde el comienzo actualizo el valor de tiempoPrevio a millis()
    tiempoPrevio = currentMillis;//se han cumplido dos minutos desde el principio y vuelvo al loop para el control de otros dos minutos.
    notificado=false; //ya volveria a notificar al dueño, estamos en otro intervalo de dos minutos
    Serial.print("El nuevo valor de tiempoPrevio es de "); Serial.print(tiempoPrevio); Serial.println(" milisegundos.");
  }
}

[/code]
Con el código anterior estoy observando que constantemente me meto dentro del if

if (digitalRead(sensorinferior) == HIGH && digitalRead(sensorsuperior) == LOW && (notificado == false)) {

Por lo que creo que estoy teniendo algún problema con los sensores probablemente, pero me gustaría pedirles consejos sobre cómo utilizar dos sensores PIR al mismo tiempo, no sé si tengo que utilizar algún delay entre lectura y lectura de los sensores, ya que medí que entre la aparición del obstáculo (del perro) hasta que el sensor ofrece a su salida unos 3 V pasan dos segundos aproximadamente, por lo que quizás tengo que tener en cuenta este tiempo?.

En otros posts pasados vi que se referenciaba a la librería NewPing, con un ejemplo de utilizar tres sensores al mismo tiempo, pero este ejemplo era para sensores ultrasónicos y se podía utilizar la librería NewPing...con sensores PIR me temo que no hay librería ninguna..

Si alguien ha trabajado de esta forma con dos sensores PIR y tiene alguna forma si existe un fallo que ocasione que entre siempre en el anterior 'if' le estaría muy agradecido.

Un saludo a todos, muchas gracias y felices fiestas! :smiley:


Mi consejo es que pruebes la parte de los PIR y una vez resuelto pases a enviar el mensaje SMS.