Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Nouveau Candidat au Club
    Gestion de 2 détecteurs PIR pour gérer un éclairage
    Bonjour à tous,

    Je souhaiterai avoir un peu d'aide sur un projet que je réalise actuellement et sur lequel j'ai un problème que je n'arrive pas à surmonter seul malgré de nombreux essais en vain.
    Voilà je suis actuellement entrain de fabriquer une commande avec arduino qui me permettrait de contrôler un relais (qui gère le ON/OFF de l'éclairage ) quand une personne serait détectée par un des deux capteurs PIR que j'ai installé à chaque entrée de mon allée. J'ai donc réussi à faire un code qui fonctionne avec un capteur PIR mais impossible de réussir à jumeler les deux et gérer le relais en fonction. Je suis totalement novice en codage C++ et je vous avouerai que je suis à cours de solutions pour résoudre ce problème.

    Voici la partie consacrée aux capteurs PIR dans mon code que j'utilise :
    IR1 et IR2 définissent mes capteurs PIR et relais 1 est le relais qui gère l'éclairage.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    if(digitalRead(IR1_output)==HIGH)
     
    { Serial.println("mouvement détecté PIR 1");
      digitalWrite(relais1, LOW ) ;}
     
          if(digitalRead(IR1_output)==LOW)
     
    {  Serial.println("pas de mouvement détecté PIR 1");
       digitalWrite(relais1, HIGH );    }
     
          if(digitalRead(IR2_output)==HIGH)
     
    {Serial.println("mouvement détecté PIR 2");
     digitalWrite(relais1, LOW ) ;}
     
         if(digitalRead(IR2_output)==LOW)
     
    { Serial.println("pas de mouvement détecté PIR 2");
        digitalWrite(relais1, HIGH ) ; }
     
      else 
    {  digitalWrite(relais1, HIGH ); }


    Lors de l’exécution de ce code j'obtiens des clignotements au niveau de l'éclairage le relais s'active et se désactive. Les capteurs ne détectent pas de présence non plus...la partie du code que je vous présente ci dessus est une option parmi toutes celles que j'ai pu essayer...

    Je vous serais vraiment très reconnaissant si quelqu'un pouvais me venir en aide. Je vous fournirais toutes les infos qui vous serons nécessaire.

    Je vous remercie par avance de l'aide que vous pourrez me fournir ! A bientôt !

    Clément

  2. #2
    Membre expérimenté
    Bonjour Clémentrs

    Pour comprendre ton programme, l'allumage se fait par un HIGH sur IR1_output et l'extinction par un HIGH sur IR2_output si l'invité entre
    et
    l'allumage se fait par un HIGH sur IR2_output et l'extinction par un HIGH sur IR1_output si l'invité sort

    Ou, simplement l'extinction se fait par un timer?

    Cordialement
    jpbbricole
    L'expérience est la seule chose qu'il ne faut acheter que d'occasion!

  3. #3
    Membre éprouvé
    Bonjour

    postez le code complet. pour voir comment tout est configuré d'un point de vue logiciel et décrivez aussi votre câblage (les GND connectés ?)

    Certains PIR peuvent nécessiter 30 secondes de "repos" (à mettre dans le setup()) avant d'être fonctionnels

    Certains ont une sortie analogique et une autre numérique (LOW ou HIGH), assurez vous d'être sur la sortie numérique

    ils ont tous un réglage de sensibilité (seuil de déclenchement) et la plupart du temps aussi un autre potentiomètre qui règle pendant combien de temps ils restent "actifs" après une détection --> comment est-ce réglé?

    commencez par faire un test simple avec 1 seul PIR et obtenir une lecture "claire" du signal et bâtissez à partir de là

  4. #4
    Membre éclairé
    Proposition
    Bonjour,

    J'ai ré-indenté ce code pour faire apparaître (outre des tests inutiles) qu'il n'est pas cohérent (voir le // ???) :

    Citation Envoyé par Clémentrs Voir le message

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    if(digitalRead(IR1_output)==HIGH)
    {
       Serial.println("mouvement détecté PIR 1");
       digitalWrite(relais1, LOW ) ;
    }
     if(digitalRead(IR1_output)==LOW)
    {  
       Serial.println("pas de mouvement détecté PIR 1");
       digitalWrite(relais1, HIGH );    
    }
    if(digitalRead(IR2_output)==HIGH)
    {
       Serial.println("mouvement détecté PIR 2");
       digitalWrite(relais1, LOW ) ;
    }
    if(digitalRead(IR2_output)==LOW)
    {
       Serial.println("pas de mouvement détecté PIR 2");
       digitalWrite(relais1, HIGH ) ;
    }
    else 
    {
       digitalWrite(relais1, HIGH );  // ???
    }

    En effet si le détecteur 2 est HIGH, le relais reçoit d'abord un ordre d'activation. Mais le test suivant teste le cas inverse. Il est suivi d'un else qui sera exécuté si digitalRead(IR2_output) n'est pas LOW (c'est à dire qu'il est HIGH). Or celui-ci donne un ordre d'inactivation au relais. Ce dernier n'aura pas le temps de basculer donc restera inactivé.
    Par ailleurs, il est préférable d'utiliser des "else" plutôt que de multiplier des couples de tests vrai/faux.

    Si l'objectif est de laisser l'allée allumée tant qu'au moins l'un des détecteurs est HIGH, le code minimal suivant devrait faire le job.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // Dans le Set up ~~~~~~~~~~~~~~~~~~~~~~~~ 
    StatutOld = Statut = 0;
     
    // Dans la boucle ~~~~~~~~~~~~~~~~~~~~~~~~
    Statut = (digitalRead(IR1_output) | digitalRead(IR2_output));    // 1 si au moins l'un des deux détecteurs voit quelque chose
    if(Statut != StatutOld) digitalWrite(relais1, ! Statut);          // Seules les transitions sont intéressantes (Hypothèse d'une détection continue)
    StatutOld = Statut;


    Cependant, il pourrait effectivement être très utile d'ajouter une temporisation pour éviter une réactivité un peu trop forte. Par exemple, quand une personne passe d'un détecteur à l'autre, la moindre perte de détection éteindra l'éclairage avant de la rétablir. Deux variables temps recevant un retour de la fonction millis() (par exemple T et Told) peuvent faire l'affaire. Il ne faut retarder que l'extinction.

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  5. #5
    Rédacteur

    Citation Envoyé par Clémentrs Voir le message

    Je suis totalement novice en codage C++ et je vous avouerai que je suis à cours de solutions pour résoudre ce problème.
    Pas facile pour un novice.
    En C++ (ou Java) on commencerait sans doute par une classe Eclairage qui contiendrait l'état du relais ... etc.
    Ensuite viendrait des événements des PIR avec des appels à des méthodes d'une instance de la classe Eclairage.
    Mais c'est peut-être du charabia pour toi.

    En C, je commencerais par une variable indiquant l'état du relais, donc de la lampe.
    Il faudra piéger les mouvements des PIR dans une (des) boucle(s) en continu et aussi y ajouter des délais d'attente.
    Deux threads me semble nécessaire.

    Une variable indiquant combien de temps cela reste allumé devrait être nécessaire et réinitialisée à chaque nouveau passage.

    Si ton design et ton programme sont bien faits, tu pourras alors facilement y ajouter un capteur de lumière pour ne pas activer l'éclairage inutilement.

    Je n'ai pas lu les autres réponses.
    Bon courage.

  6. #6
    Rédacteur

    Citation Envoyé par boijea Voir le message

    Deux threads me semble nécessaire.
    J'ai un peu cherché, mais je ne sais pas s'il est vraiment possible de faire du multithreading sur un Arduino.
    Je ne travaille qu'avec des ESP8266 et ESP32.
    L'ESP32 a deux core et j'y ai utilisé le multithreading.

    Quelque chose comme:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void loop(){
      val1 = digitalRead(inputPinPir1);
      val2 = digitalRead(inputPinPir2);
      if ((val1 == HIGH) || (val2 == HIGH) ){
        mouvement(val1, val2);  
      }
     
      delay(100);  //à voir pour la valeur
     
      //autre activités comme un capteur de lumière
    }


    devrait suffire.
    La fonction mouvement() identifiera par exemple si l'éclairage est déjà actif .... activera le relais ...etc ... et avec la fonctions millis() on fera les calculs d'intervalle de temps.
    Si la fonction mouvement() contient trop de code répétitif ou réutilisable, écrire des fonctions supplémentaires.

    Je n'ai plus écrit en C depuis plus de 20 ans, que du C++ et du Java où les classes rendent le code plus structuré et lisible.
    Je code en Python aussi sur le Raspberry Pi où mon expérience m'a amené a commencer par écrire de petites fonctions réutilisables (aussi pour d'autres projets).

    Utiliser des variables globales (comme l'état du relais ou le moment du dernier mouvement obtenu par millis()) n'est pas un problème en C .

    Dans Google search essaie: arduino 2 pir sensors

    Cordialement
    Bon travail

###raw>template_hook.ano_emploi###