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);
}




 

 

 

Scarica tutto quello che serve: