Problème avec PIR HC-SR505 et relais

Bonjour,

Je suis actuellement sur un projet arduino, utilisant un détecteur infra-rouge (PIR) pour la détection de mouvements et un relais. Cependant je rencontre un problème :

Voici un exemple illustrant mon problème :

Branchements :

  • PIR: (ref: HC-SR505)
  • ---> 5V
  • ---> Gnd
    out ---> D6

  • Relais : (ref: SRD-05VDC-SL-C)

  • ---> 5V
  • ---> Gnd
    S ---> D5

De l'autre côté du relais, il s'agit uniquement de fermer le contact entre le C et le NO lors de l'activation du relais, pour allumer une led.

J'ai moi même fait énormément de tests et en est arrivé à une caractérisation précise du problème :

En fait, lorsque le relais est activé, et donc que j'ai eu "digitalWrite(5,HIGH)", ET que le détecteur ne capte rien et donc ne revoie que du LOW;
Si je désactive le relais, que ce soit physiquement (en le débranchant) ou dans le programme (avec un "digitalWrite(5,HIGH)"), l'arduino se met à recevoir un signal dans le pin D6, comme si il y avait du mouvement... or il n'y a aucun mouvement !

Pour mieux comprendre voici un exemple :

(Avec les mêmes branchements)

Code:

void setup() {
Serial.begin(9600);
pinMode(6,INPUT);
pinMode(5,OUTPUT);
digitalWrite(6,LOW);
}
void loop() {
Serial.println(digitalRead(6));
if(digitalRead(6)==HIGH) {
Serial.println("Mouvement");
digitalWrite(5,HIGH);
}
else {
Serial.println("Pas de mouvement");
}
delay(250);
}

Lors du lancement du programme:

  • Le moniteur série renvoie digitalRead(6)= 0 et "pas de mouvement",
  • je fais du mouvement devant le capteur
  • le relais s'allume et j'ai "mouvement", et digitalRead(6)= 1
  • J'attend d'avoir à nouveau digitalRead(6)= 0;

A ce moment j'ai bien :

  • Aucun signal renvoyé par le capteur IR
  • le relais activé

Si je débranche le relais (pin S), donc comme si je désactivait le relais par le code (testé aussi),
Le pin 6 me renvoie 1, alors qu'il n'y a aucun mouvement !

J'ai pu déterminer que 10 millisecondes après la désactivation du relais, le pin du capteur ir renvoie un bref signal, qui me renvoie des "1" pendant 7-8 secondes, comme si il y avait eu un mouvement.

Notes :

  • j'ai donc essayé de changer l'alimentation des composants :
    en effet si le + du relais et le + du PIR sont sur des +5V différents, le problème n'est plus.

  • Avec un PIR de ref: HC-SR501, qui possède plus de carte électronique, le problème n'est plus.

Quelqu'un aurait-t'il une solution simple pour éviter ce problème avec le capteur HC-SR505, et sur le même +5V (celui de l'arduino) que le relais ?

bonjour,
photo du pir
tu dois avoir 2 potards dessus
1 pour la sensibilité
1 pour la durée

tu oublie de mettre ton relais a LOW après, donc il est toujours activé dons ton else

else {
Serial.println("Pas de mouvement");
}

tu peux après soir utiliser millis() pour savoir si un mouvement dure plus de X secondes pour allumer ton relais et l'éteindre.
ou mettre un compteur, qui arrive à 50 par exemple pour activer le relais et tu le remets à 0 après extinction du relais

D'abord merci pour ta réponse,

Voici le PIR en question :

je ne peux pas régler les potards, même si je ne pense pas que ce soit le problème

Ensuite j'ai volontairement choisit de ne pas mettre le relais a LOW pour mettre mon problème en évidence,

Reprenons :
Voici l'extrait réel en question du code avec lequel je travail :

//pin relai:
const int relais= 5;


//pin capteur infra-rouge:
const int ir=6;
//temps de calibrage: (sec*2)
const int calibragetmp=14;


//variables compteur:
  int c=-1; // On definit le relais comme ouvert
  int minute = 0;
  int sec = 10;
  int temps_rep= 100;
  int delai = ( (sec*1000) + (minute*60000) ) / temps_rep;


void setup() {
  
//pin relai:
pinMode(relais,OUTPUT);

//pin capteur infra-rouge:
pinMode(ir,INPUT);
digitalWrite(ir,LOW);


//Console 
Serial.begin(9600);


//SETUP CAPTEUR IR
 Serial.print("calibrage PIR ");
  for(int i = 0; i < calibragetmp; i++){
    Serial.print(".");
    delay(500);}
}

void loop() {
int pirVal = digitalRead(ir);
Serial.println(pirVal);

  
if(pirVal==HIGH) {
  
if(c == -1){digitalWrite(relais,HIGH);}  //le relais était ouvert donc on le ferme
c=delai; //on remonte le décompteur au délai choisit tant qu'il y a du mouvement

}

else { // ici: pirval==LOW

if(c>0){c--;} //on décompte une fois
if(c==0) { // si le délai est écoulé
  Serial.println("delai écoulé");
  digitalWrite(relais,LOW); // on désactive le relais
  c=-1; // on signal le relais comme ouvert
}
}

 delay(temps_rep);// un test tout les [défini plus haut]
}

Ce programme permet donc d'activer le relais en cas de mouvement et de le désactiver si il n'y a plus de mouvement durant une certaine durée définie avec les variables "minute" et "sec".

Imaginons qu'il y a du mouvement:

  • le relais s'active bien
  • le capteur fini par ne plus capter au bout de 7-8 secondes (délai constant propre au PIR)
  • le décompte se fait (ici 10 sec)
  • Mais au moment ou on désactive le relais, je reçois a nouveau systématiquement un signal du PIR alors qu'il n'y a aucun mouvement

J'ai essayé de modifier ce passage du code comme ceci :

if(c==0) { // si le délai est écoulé
  Serial.println("delai écoulé");
  digitalWrite(relais,LOW); // on désactive le relais
  Serial.println(pirVal); // 1*
  delay(10);
  Serial.println(pirVal); // 2*
  c=-1; // on signal le relais comme ouvert
}

au 1*, j'ai : pirVal= 0
au 2*, j'ai : pirVal= 1

sans aucun mouvement devant le capteur !
je reçois un signal "magique" au pin du PIR si le relais se désactive, c'est ce que je ne comprend pas.

Encore une fois si le + du relais et le + du PIR sont sur des +5V différents, le problème n'est plus.

c'est un soucis d'alim, j'ai déjà eu le cas.
essaye en mettant le pir en LOW pendant quelques secondes après LOW relais.

sinon mettre un condo entre le 5v et signal du pir.
les plus calé pourront confirmer, ca évite l'antirebond lorsque le relais se coupe.

Rajouter un "digitalWrite(ir,LOW)" ne sert a rien, à partir du moment ou le pir a subit ce rebond, il lui faut 7-8 secondes pour se calmer,
Une solution efficace est bien de rajouter un delay de 8000 après le "digitalWrite(relais,LOW)", pour attendre que le pir se ressaisisse.
Mais cela crée un temps de non fonctionnement du programme de 8 secondes que j'aimerai éviter.

Concernant le condo, j'ai remarqué que le pir HC-SR501 qui est plus complet au niveau de sa carte éléctronique, possède des condensateurs et ne subit pas ce rebond.

Mais avant de tester avec ce condo, j'aimerai être sûr de la façon de l'intégrer au montage,
je doit donc bien mettre le + du condo au +5V et le - du condo au out du pir ?

De plus,
voici un programme simple :

void setup() {
Serial.begin(9600);
pinMode(6,INPUT);
pinMode(5,OUTPUT);
digitalWrite(6,LOW);
}
void loop() {
Serial.println(digitalRead(6));
if(digitalRead(6)==HIGH) {
Serial.println("Mouvement");
digitalWrite(5,HIGH);
}
else {
Serial.println("Pas de mouvement");
digitalWrite(5,LOW);
}
delay(250);
}

Avec celui la tout fonctionne très bien,le relais s'éteint correctement et le pir ne renvoie rien, s'il s'agit d'un rebond, ne devrait-il pas reproduire la même erreur ici ?

pas trop le temps de tester ce soir, parait qu'un gros monsieur doit passer déposer des joujoux par milliers un peu partout.

si tu mettais le code entier qui pose soucis, ca serait mieux que de mettre des bouts par ci par là en changeant les noms par les pins :wink:

Effectivement ce n'est pas forcément le meilleur moment pour ces choses la, j'en suis d'autant plus reconnaissant envers toi pour tes réponses :wink:

Je comprend aussi que des codes par-ci par-là peuvent êtres déroutants, j'ai la tête dans mon projet, pas toi, et il faut que je sois le plus clair possible dans mes explications, alors je récapitule la situation:

Prendre tout mon code et tout mon montage pour la résolution du problème n'aurait aucun intérêt, mis à part altérer la lisibilité du code, et la compréhension du problème;

Car en effet seule une partie me pose problème et est représentable avec simplement le relais et le PIR:

Prenons donc le montage et code suivant :

Branchements :

  • PIR: (ref: HC-SR505)
  • ---> 5V
  • ---> Gnd
    out ---> D6

  • Relais : (ref: SRD-05VDC-SL-C)

  • ---> 5V
  • ---> Gnd
    S ---> D5
//pin relai:
const int relais= 5;


//pin capteur infra-rouge:
const int ir=6;


//variables compteur:
  int c=-1; // On definit le relais comme ouvert
  int delai = 100;


void setup() {
  
//pin relai:
pinMode(relais,OUTPUT);

//pin capteur infra-rouge:
pinMode(ir,INPUT);
digitalWrite(ir,LOW);


//Console 
Serial.begin(9600);
}

void loop() {
int pirVal = digitalRead(ir);
Serial.println(pirVal);

  
if(pirVal==HIGH) {
  
if(c == -1){digitalWrite(relais,HIGH);}  //le relais était ouvert donc on le ferme
c=delai; //on remonte le décompteur au délai choisit tant qu'il y a du mouvement

}

else { // ici: pirval==LOW

if(c>0){c--;} //on décompte une fois
if(c==0) { // si le délai est écoulé
  Serial.println("delai écoulé");
  digitalWrite(relais,LOW); // on désactive le relais
  Serial.println(pirVal); //1*
  delay(10);
  Serial.println(pirVal);//2*
  c=-1; // on signal le relais comme ouvert
}
}

 delay(100);// un test toutes les 100ms
}

Le relais est donc censé s'activer en présence de mouvement nouveau et s'éteindre au bout d'un certain délai sans mouvement (ici 10 sec).

Or comme je l'ai expliqué lorsque le relais se désactive, 10ms plus tard je reçois un signal par le pin OUT du pir comme si il y avait un mouvement:

au 1*, j'ai : pirVal= 0
au 2*, j'ai : pirVal= 1

et cela sans aucun mouvement devant le capteur.

Nous en étions donc à discuter d'un problème d'alim,
mais j'aimerai rebondir là-dessus en prenant un autre code, celui ci n'est pas ce lui que j'aimerai utiliser mais permet uniquement de comparer pour mieux comprendre le problème :

Test d'un autre code d'exemple :

//pin relai:
const int relais= 5;


//pin capteur infra-rouge:
const int ir=6;

void setup() {
Serial.begin(9600);
pinMode(ir,INPUT);
pinMode(relais,OUTPUT);
digitalWrite(ir,LOW);
}
void loop() {

int pirVal=digitalRead(ir);
Serial.println(pirVal);
if(pirVal==HIGH) {
Serial.println("Mouvement");
digitalWrite(relais,HIGH);
}
else {
Serial.println("Pas de mouvement");
digitalWrite(relais,LOW);
Serial.println(pirVal); //1*
delay(10);
Serial.println(pirVal);//2*
}
delay(100);
}

Toujours uniquement par comparaison, ce code fonctionne dans le sens ou lorsque le relais se désactive, je ne reçois aucun signal indésirable dans le pin du pir :

au 1*, j'ai : pirVal= 0
au 2*, j'ai : pirVal= 0

Si il s'agissait vraiment d'un problème d'alimentation dans le cas de mon premier code, qui est celui que je souhaite utiliser car il possède un décompteur, alors ne devrait-il pas être aussi présent dans le cas de ce deuxième code d'exemple ?

Qu'est-ce qui change entre les deux situations ?
je ne comprend pas ..

Bonjour

J'ai exactement le même souci : le détecteur seul HC-SR505 fonctionne très bien
Dès que je déclenche un relais suite à une détection de mouvement, il faut que j'attende un délai avant d'avoir une lecture stabilisée de l'état du détecteur

Est ce que tu as pu résoudre ton souci ? si oui comment ?
Sinon, j'ai 3 pistes que je veux tester :

  • passer par une entrée analogique pour récupérer la valeur du détecteur
  • faire plusieurs tests de la valeur du détecteur à 10ms d'intervalle pour voir si la valeur est stable ou pas (mais bon, j'aime pas trop la fonction delay, ça met de la latence dans la détection)
  • mettre une resistance de pull down pour permettre à la valeur de revenir au point bas mais j'avoue que là, j'ai pas tout compris à quelle valeur de resistance il fallait prendre ni comment vraiment la brancher (et en plus, j'ai pas de résistance sous le coude pour tester)

Est ce que quelqu'un peut m'aiguiller ?
Par ce que à terme, j'aurais 10 relais à commander donc si j'ai des effets de rebond avec 1, qu'est ce que ça va être quand ils seront tous en fonction ...

Merci pour votre aide