Utiliser un détecteur de présence infrarouge

Ce capteur complexe est bien connu : il est utilisé par les systèmes d’alarme et les éclairages automatiques de lieux publics et privés. Relativement abordable, il est assez simple d’utilisation.

Précédent | 6/6

C’est un capteur complexe, ce qui signifie qu’il embarque une éléctronique propre, complexe, ce qui lui permet d’envoyer une information simple alors qu’en fait il traite une information complexe, des filtres de parasitage, un timer, une mémoire.

Le montage est donc un montage classique à 3 fils : une alimentation en 5 volts venant d’Arduino, une pin sur une entrée digitale et un fil vers le ground. Se reporter à la documentation du senseur pour connaitre la correspondance entre les fils et leurs fonctions. Voici un schéma classique.

La pin utilisée pour l’input de l’information recevra une information HIGH si il n’y a pas de présence détectée et LOW si quelque chose est dans le champ.

Le code ci-dessous est commenté. La réception de l’information (sur la pin 2 dans ce code) est simple, le reste est là pour détecter si quelqu’un vient d’entrer dans le champ vide, si quelqu’un est toujours là, un système de timer permet d’attendre un peu pour éviter un passage trop rapide de HIGH à LOW. Une temporisation qui peut être réglée avec la variable pir_delay et le delay entre chaque test.

// Utiliser un PIR
// placé sur la pin 2

int pirPin=2; // la pin sur laquelle est placé le PIR
int pir_delay=12; // 3 secondes sans mouvement = fini
int decompte=-1; // on signale qu'il n'y a personne

void setup(){
 Serial.begin(9600);
 pinMode(pirPin, INPUT);
}

void loop(){
 int pirVal = digitalRead(pirPin);

 if(pirVal == LOW){
   // quelque chose dans le champ

   if(decompte== -1){
     // si la valeur est -1, c'est une entree
     Serial.println("quelque chose est dans le champ");
   }

   // tant qu'il y a quelque chose, on remet le compteur au max
   decompte=pir_delay;

 }
 else if(pirVal == HIGH && decompte > 0){
   // plus personne, on commence à décompter
   decompte--;
   Serial.print("plus personne - decompte : ");
   Serial.println(decompte);
 }

 if(decompte==0 ){
   // le temps d'attente est écoulé
   decompte=-1; // spécifier la sortie de champ
   Serial.println("plus rien dans le champ");
 }
 // un test tout les quart de seconde
 delay(250);
}