Autor Tema: Aporte-Temporizador para Sensor PIR Hc-sr501  (Leído 2146 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado humberto 02

  • PIC16
  • ***
  • Mensajes: 184
Aporte-Temporizador para Sensor PIR Hc-sr501
« en: 08 de Febrero de 2017, 18:44:13 »

Hola Buenas Tardes

Estudiando las bondades del Sensor PIR-HC05 en Arduino noté que es demasiado sensible. O sea que ante un disparo envía muchos pulsos. Lo que hace en algunos proyectos una molestia de verdad.

También ante cualquier mínimo movimiento se dispara dando “falsas alarmas”. Por ello hice este código (en cascada) que quería compartir con Uds.

Materiales: Arduino (NANO, UNO, etc.), Sensor Pir y Cables.

La sensibilidad está controlada con la función millis(), a partir del disparo:
-   Si persiste la señal hasta 3500 milisegundos lo considera FALSA ALARMA.
-   Si la señal continúa entre 3500 y 15000 milisegundos Prende las luces.
-   Si la señal supera los 15000 milisegundos enciende la Sirena.

Para probarlo le puse un LED que remplaza el encendido de las luces y Buzzer 5v. con el VISOR Serial.

Código: [Seleccionar]
// Este Programa permite controlar el exceso de disparos
// del Sensor de Movimientos, con la Frecuencia Millis()
// Siendo la Diferencias:      Hasta 3500ms FALSA ALARMA
//                     Entre 3500 y 15000ms PRENDO LUCES
//                   15000ms en adelante SUENA LA ALARMA

int ct   = 10; //.......... Calibration time
int PIRX =  2; //.......... PIR Sensor Output
long inicio, actual = 0; // Control de Milisegundos (Tiempos)
int Sirena = 3; //......... Sirena
int Luces  = 4; //......... Luces Externas
String Estado = "";

void setup() {
     Serial.begin(9600);
     pinMode(PIRX, INPUT);
     pinMode(Luces,OUTPUT);

     Serial.println("Calibrando el Sensor...");
     for(int i = 0; i <= ct; i++) {
        Serial.print(((i*100)/ct));
        Serial.print("% ");
        Serial.println("Listo...");
        delay(1000); // 1000
     }
     Serial.println("** SENSOR ACTIVADO **");
     digitalWrite(PIRX, LOW);
}

void loop() {
     while (digitalRead(PIRX) == HIGH) {
         Estado = "";
         digitalWrite(Luces,LOW);
         Serial.println("--------------------------------");
         Serial.print("** SE HA DETECTADO MOVIMIENTO ** ");
         inicio = millis();
         Serial.print(inicio);

         while (digitalRead(PIRX) == HIGH && (actual-inicio <= 3500)) {
             actual = millis();
             Estado = " Falsa Alarma";

             while (digitalRead(PIRX) == HIGH && (actual-inicio > 3500 && actual-inicio < 15000)) {
                 actual = millis();
                 Estado = " Encender LUCES";
                 digitalWrite(Luces,HIGH);

                 while (digitalRead(PIRX) == HIGH && (actual-inicio >= 15000)) {
                     actual = millis();
                     Estado = " Disparo de la SIRENA !!!";
                     
                     for (int k=0; k<2; k++) {
                         // Sonido Agudo
                         for (int i=2000;i<=4000; i++) {tone(Sirena, i, 250);}
                         // Sonido Grave
                         for (int i=4000;i>=2000; i--) {tone(Sirena, i, 250);}
                     }
                 }
             }
         }
         Serial.println(" "+String(actual)+" "+String(actual-inicio)+" "+String(Estado));
         Serial.println("----------------------ESTABLE--- ");
         digitalWrite(Luces,LOW);
     }
}

Uds. Podrán variar los valores de acuerdo a la utilidad que quieran darle. Para comprobar y regularlo a gusto.

Gracias por estar siempre ahí dándonos una mano desinteresadamente. Esta vez quise sentirme como Uds. Con este pequeño código. Espero que les sirva como a mí. Les deseo lo mejor!.
« Última modificación: 08 de Febrero de 2017, 22:18:34 por humberto 02 »

Desconectado fandiño

  • PIC10
  • *
  • Mensajes: 12
Re:Aporte-Temporizador para Sensor PIR Hc-sr501
« Respuesta #1 en: 24 de Junio de 2017, 22:26:13 »
Es un buen aporte. también se puede complementar con un filtro paso bajos, ya que aunque puedan existir falsos positivos, tambien se pueden dar casos de falsos negativos, lo cual puede llegar a ser un gran problema.


 

anything