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.
[color=#000000]
// 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);
}
}
[/color]
Uds. Podrán variar los valores de acuerdo a la utilidad que quieran darle. Para comprobar y regularlo a gusto.
Espero que les sirva como a mí. Les deseo lo mejor!.