PitHCSR501
L'utilizzo del sensore HC-SR501 - sensore di PIR.
Prova del Sensore
Per le spiegazioni sull'utilizzo del sensore dei trimmer e dei jumper vedere gli articoli su NE555.it o su Adrirobot .
Cosa serve:
- Sensore di PIR HC-SR501
- resistenza 220 ohm
- led
- cavetti
Codice sorgente per la lettura del sensore:
int pirPin = 8;
int val;
void setup() {
Serial.begin(9600);
}
void loop() {
val = digitalRead(pirPin); //read state of the PIR
if (val == LOW) {
Serial.println("No motion"); //if the value read is low, there was no motion
}
else {
Serial.println("Motion!"); //if the value read was high, there was motion
}
delay(10);
}
Codice sorgente per l'impostazione di una stazione di allarmi:
/*
*
* Zappoco marzo 2019
* www.zappoco.altervista.org
*
* questa routine legge lo stato del sensore pir e valuta il livello di allarme
*
*
* sul sensore sono presenti due trimmer e un
*
* vedere https://www.ne555.it/sensore-movimento-pir-hc-sr501/
*
* -- il primo controlla il delay, ovvero quanto rimane alto il segnale dopo il movimento,
* il minimo è 3 secondi, il massimo 5 minuti e in particolare girando in senso orario
* si raggiunge il massimo del tempo, in senso antiorario invece si raggiunge il minimo del delay.
*
* -- il secondo trimmer regola la sensibilità che va da un minimo di 3 metri ad un massimo di 7 metri.
*
* -- infine vi è un jumper con tre posizioni.
* Non in tutti i moduli di questo tipo vi è il jumper settabile, in alcuni la posizione è fissa ma si
* può modificare interrompendo una pista del circuito stampato e facendo una saldatura.
* Le posizioni sono solo due; se il pin centrale è connesso al pin L allora dopo il movimento il segnale
* diventa alto e rimane alto per un tempo che dipende dal trimmer del tempo, se vi è un nuovo movimento
* il tempo mentre il segnale è alto non viene resettato. Se il pin centrale è connesso al pin H
* allora il pin di uscita del segnale rimane a livello alto dopo l’ultimo movimento per un tempo che
* dipende dal trimmer del tempo, indipendentemente se prima vi è stato un movimento o no.
*
*
*
* nell'esempio che segue sono stati fatte le seguenti regolazioni
*
* -- delay 3 secondi(tutto in senso antiorario)
*
* -- sensibilità circa 5 metri (al centro)
*
* -- jumper H il time delay viene azzerato ad ogni segnale rilevato per cui il tempo totale si cumula
*
*
* --------------------------
*
* la routine calcola il tempo tra il livello motion e il ritorno a no motion
*
* se questo tempo è
* minore di timeSensMin allora non è allarme ma falso
* tra 1 e 2 timeSensMin allora non è allarme ma falso
* oltre 2 timeSensMin allora è allarme duration
*
* se nell'arco di timeDelayMax si hanno più allarmi anche falsi i tempi sono cumulati
*
* se la somma dei tempi è superiore a 3 timeSensMin allora è allarme
*
* riassunto livello 0 e 1 (allarmi corti sono falsi allarmi)
* livello 2 e 3 allarmi durata
*
* livello 3 senza azzeramento allarme durata time over
*
* livello 3 come somma di allarmi 0 e 1 nell'arco di 1 minuto allarme somma
*
* nei casi 2 e 3 viene inviata la mail
*
*/
int pirPin = 8; //Arduino
int ledPin = 7; //Arduino
//int pirPin = 14; //D1 mini pin14 --> D5
//int ledPin = 16; //D1 mini pin16 --> D0
int valPirPin;
int counter=0;
long timeDelayMax = 60000; // 1 minuto
long timeSensMin = 3500; // tempo minimo del sensore
long time0 , time1 , time2 , timeSomma = 0;
boolean flagAlarmMail = false;
String stringAlarmMail ;
void setup() {
Serial.begin(9600);
pinMode (pirPin, INPUT);
pinMode (ledPin, OUTPUT);
}
void loop() {
valPirPin = digitalRead(pirPin); //read state of the PIR
counter ++;
Serial.print (counter);Serial.print(" - ");
Serial.print ("time0 : "); Serial.print (time0);Serial.print(" - ");
Serial.print ("time1 : "); Serial.print (time1);Serial.print(" - ");
Serial.print ("time2 : "); Serial.print (time2);Serial.print(" - ");
Serial.print ("timeS : "); Serial.print (timeSomma);Serial.print(" - ");
digitalWrite(ledPin,valPirPin);
if (valPirPin == LOW) {
if (time1 != 0){
time2 = millis();
}
//Serial.print (millis()-time1);Serial.print(" - ");
Serial.print("No motion"); //if the value read is low, there was no motion
}
else {
if (time0 == 0){
time0 = millis(); //rilevato allarme -->
}
if (time1 == 0){
time1 = millis(); //rilevato allarme -->
}
Serial.print("Motion!"); //if the value read was high, there was motion
}
if (time1 != 0) {
if (time2 != 0) {
//
// allarme finito somma i tempi
//
timeSomma = timeSomma + time2 - time1;
Serial.print(" - "); Serial.print (time2 - time1);
int levAlarm = (time2 - time1) / timeSensMin ;
Serial.print(" - "); Serial.print (levAlarm);
if (levAlarm >= 3){
flagAlarmMail = true;
stringAlarmMail = "alarm level = 3 duration";
}
else if (levAlarm >= 2){
flagAlarmMail = true;
stringAlarmMail = "alarm level = 2 duration";
}
else if (levAlarm >= 1){
stringAlarmMail = "alarm level = 1 duration";
}
else{
stringAlarmMail = "alarm level = 0 duration";
}
//
// annulla i timer intermedi
//
time1 = time2 = 0;
}
else{
//
// allarme non ancora finito
// nel caso di allarme continuo di livello superiore a 3
//
int levAlarm = (millis()- time1 ) / timeSensMin ;
if (levAlarm >= 3){
timeSomma = timeSomma + millis() - time1;
flagAlarmMail = true;
stringAlarmMail = "alarm level = 3 time over";
time1 = time2 = 0;
}
else{
stringAlarmMail = "";
}
}
Serial.print(" - "); Serial.print (stringAlarmMail);
}
if ( time0 !=0){
Serial.print (" - Dtime0 : "); Serial.print (millis() - time0);Serial.print(" - ");
if( (millis() - time0) >= timeDelayMax){
//
// trascorso il time max verifica time cumulato
//
Serial.print ("timeSomma : "); Serial.print (timeSomma);Serial.print(" - ");
int levAlarm = timeSomma / timeSensMin ;
if (levAlarm >= 3){
flagAlarmMail = true;
stringAlarmMail = "alarm level = 3 sum over";
}
else
{
stringAlarmMail = "alarm level = 0 sum below";
}
Serial.print(" - "); Serial.print (stringAlarmMail);
//
// azzera tutti contatori
//
time0 = time1 = time2 = timeSomma = 0;
}
}
Serial.println("");
if (flagAlarmMail == true){
Serial.println (" -------------------------------------- ");
Serial.println (" allarme rilevato");
Serial.println (" -------------------------------------- ");
Serial.println("");
Serial.println (stringAlarmMail);
Serial.println("");
Serial.println (" -------------------------------------- ");
flagAlarmMail = false;
//
// azzera tutti contatori
//
time0 = time1 = time2 = timeSomma = 0;
}
//delay(50);
}