ajustement de capteur mouvement PIR

bonjour cher

je sollicite votre savoir pour la résolution de ma préoccupation

je veux avoir un Système de sécurité qui est basé sur la détection de mouvement lorsque le capteur(PIR) détecte un mouvement il allume la premier lampe puis après quelque seconde il allume une autre jusqu'à la troisième. le programme fonctionne mais avec une anomalie.

quand je branche l'arduino sur 5 volt même si il y a pas de mouvement le programme commence a tourner

mon souci est que le programme tourne que lorsque y a mouvement pas lorsque je branche la carte mais qu'il attente bien un mouvement.

s'il y a possibilité merci de m'aider

const int capPin = 2; // broche du capteur PIR
const int ledPin1 = 11; // la LED du Arduino
const int ledPin2=12;// la LED du Arduino
const int ledPin3=13;// la LED du Arduino
int capState = 0; // etat de la sortie du capteur
 
void setup()
{
  pinMode(ledPin1, OUTPUT);
   pinMode(ledPin2, OUTPUT);
   pinMode(ledPin3, OUTPUT);
  //la broche des LED est mise en sortie
  pinMode(capPin, INPUT); //la broche du capteur est mise en entree
}
 
void loop()
{
  capState = digitalRead(capPin);//lecture du capteur
  if (capState == HIGH) //si quelquechose est detecte
  {
    digitalWrite(ledPin1, HIGH); //on allume la LED
    delay(7000);
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, HIGH);
    delay(20000);
    digitalWrite(ledPin2, LOW);
    digitalWrite(ledPin3, HIGH);
    delay(40000);
    digitalWrite(ledPin3, LOW);
    
  }
  else //sinon
  {
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, LOW);
    digitalWrite(ledPin3, LOW);//on eteint la LED
  }
}

quand je branche l'arduino sur 5 volt même si il y a pas de mouvement le programme commence a tourner

Certains PIRs nécessitent jusqu'à 30 secondes pour se calibrer correctement. essayez en rajoutant un à la fin du setup()

delay(30000UL);

Sinon Tel que c'est codé, si le PIR ne détecte plus rien vous aurez quand même la phase des 3 allumages successifs.

Salut ,

Dans un premier temps , vu que la pin capPin est une entree Tout Ou Rien ( TOR pour les intimes ) ,

elle est censée ne pouvoir avoir que 2 valeurs differentes : vrai ou faux , autant la declarer en tant que valeur booléenne , ca prend moins de place en memoire , et ca devient surtout plus comprehensible ( mais ca ne change rien au deroulement du programme ) .

par contre , le fait de ne pas dire au programme de mettre cette PIN en pull_up_down fait justement que l ' etat de cette pin est purement et simplement inconnu et passe de vrai a faux continuellement !

en fonction de l ' etat initial dont vous avez besoin , il faut declarer la variable en PULL_UP ou PULL_DOWN .

ca devrait deja faire ce que vous voulez que ca fasse avec ces 2 trucs :slight_smile:

vous pouvez aussi declarer les variables ou constantes en type byte au lieu de type int , vu que les pins ne vont jamais au dessus de 255 , ca permet de gagner de la place en memoire et de la rapidité d' execution sur le programme , mais ca marche aussi bien comme ca .

voir ici pour l ' explication sur le pull up : INPUT_PULLUP - Le bar - Arduino Forum .

le code modifié , mais non teste !!

const int capPin = 2; // broche du capteur PIR
const int ledPin1 = 11; // la LED du Arduino
const int ledPin2=12;// la LED du Arduino
const int ledPin3=13;// la LED du Arduino
boolean capState = false; // etat de la sortie du capteur
/* modification du type de la variable capState*/

void setup()
{
  pinMode(ledPin1, OUTPUT);
   pinMode(ledPin2, OUTPUT);
   pinMode(ledPin3, OUTPUT);
  //la broche des LED est mise en sortie
  pinMode(capPin, INPUT_PULLUP); //la broche du capteur est mise en entree
  /*modification assignée a l ' entrée capPin pour eviter quelle soit dans un etat latent et changeant */ 
}
 
void loop()
{
  capState = digitalRead(capPin);//lecture du capteur
  if (capState == true) //si quelquechose est detecte
  {
    digitalWrite(ledPin1, HIGH); //on allume la LED
    delay(7000);
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, HIGH);
    delay(20000);
    digitalWrite(ledPin2, LOW);
    digitalWrite(ledPin3, HIGH);
    delay(40000);
    digitalWrite(ledPin3, LOW);
   
  }
  else //sinon
  {
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, LOW);
    digitalWrite(ledPin3, LOW);//on eteint la LED
  }
}

Il faudrait avant d'affirmer cela connaître le modèle de PIR.

S'il s'agit d'un HC-SR501 ou d'un MH-SR602 la sortie n'est pas à collecteur ouvert et lorsque le PIR ne détecte rien sa sortie est à 0V. C'est un circuit électronique, ce n'est pas un interrupteur ou un bouton poussoir.
Il n'y a aucun besoin de pullups ou de pulldown.

Je viens de retirer la batterie de mon détecteur de mouvement équipé d'un HC-SR501.
Effectivement lorsque je réinsère la batterie la sortie du capteur passe à 1.
Je précise que je ne suis pas dans le champ de détection du HC-SR501.

Par contre le MH-SR602 n'a pas ce problème.

Salut ,

je ne suis pas sur que ca resoudra le probleme de notre ami , par contre ce qui est sur , c ' est que le doute ne sera plus possible quand a la valeur de capPin dans son programme .

D ' apres vos tests , que faut il conclure ?

Le seul fait dont je sois certain est que le fait d'ajouter une résistance de pullup augmente la consommation lorsque le capteur est au repos.
Personnellement je n'ai jamais ajouté de pullup ni configuré l'entrée en INPUT_PULLUP quand j'utilise un capteur PIR. C'est totalement inutile.

J'en conclus simplement que la sortie du HC-SR501 passe à l'état haut lorsqu'on l'alimente.
C'est un défaut de ce capteur, on n'y peut rien.
Il faut tenir compte de ce défaut dans le logiciel, comme l'a suggéré J-M-L par exemple, en ajoutant une temporisation dans le setup.

Un petit test simple :

Brancher une LED entre la sortie du HC-SR501 et GND avec une résistance de 10KΩ en série, sans rien d'autre, sans ARDUINO.
Lorsque le PIR détecte un passage, la LED s'allume, et elle s'éteint ensuite.

Ensuite brancher la LED (dans l'autre sens) entre la sortie du HC-SR501 et le +5V avec la même résistance.
Lorsque le PIR détecte un passage, la LED s'éteint, et elle s'allume ensuite.

Cela veut dire que la sortie du PIR peut tirer du courant, ou en fournir.
C'est donc une sortie push-pull. Aucun besoin de pullup ou pulldown.

Lorsque j'alimente le PIR, sa sortie passe systématiquement à 3.3V (normal, le circuit est alimenté en 3.3V).

Même type de retour de mon côté, je n'ai jamais mis de pullup sur un PIR

Il y a un très bon tuto en anglais chez adafruit

Notez qu'ils mentionnent:

Once you have the breadboard wired up, insert batteries and wait 30-60 seconds for the PIR to 'stabilize'. During that time the LED may blink a little. Wait until the LED is off and then move around in front of it, waving a hand, etc, to see the LED light up!

'insert batteries and wait 30-60 seconds for the PIR to 'stabilize'. During that time the LED may blink a little. Wait until the LED is off

Ce conseil vise plutôt à masquer un défaut du capteur. Ce que je constate est différent. La sortie passe à l'état haut à la mise sous tension et reste à l'état haut pendant la durée fixée par le potentiomètre de réglage.

Solution, qui fonctionne chez moi, car seul le front montant m'intéresse : régler le potentiomètre de réglage du temps au minimum (2 à 3 secondes) et ajouter un delay dans le setup, légèrement supérieur.

J'ai déjà eu des instabilité après ce délai de 2 ou 3 secondes, des détections parasites.

Je me demande donc s'il n'y a pas une période de "chauffe" du capteur IR qui lui permet d'équilibrer les signaux en provenance des 2 fentes...

Cependant la spécification technique des capteurs infrarouges Pyro-electriques ne mentionne rien à ce sujet, donc sans doute sujet effectivement plus au montage...

merci a vous tous chers amis votre apport était d'une grande importance
je pense que le mieux a faire ce changer la marque du capteur pour utiliser le
MH-SR602.

merci a tous

Le MH-SR602 ne dispose pas de réglage de sensibilité ni de temps.

Mais si cela convient, pourquoi pas ?