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
    Homme Profil pro
    Étudiant
    Inscrit en
    septembre 2019
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 19
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : septembre 2019
    Messages : 1
    Points : 1
    Points
    1
    Par défaut 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 éclairé
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    février 2013
    Messages
    293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : février 2013
    Messages : 293
    Points : 767
    Points
    767
    Par défaut
    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 régulier
    Homme Profil pro
    savant fou
    Inscrit en
    septembre 2019
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : savant fou

    Informations forums :
    Inscription : septembre 2019
    Messages : 44
    Points : 84
    Points
    84
    Par défaut
    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 averti

    Homme Profil pro
    Directeur de projet
    Inscrit en
    mai 2013
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : mai 2013
    Messages : 60
    Points : 401
    Points
    401
    Par défaut 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
    Membre éprouvé

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    novembre 2006
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Transports

    Informations forums :
    Inscription : novembre 2006
    Messages : 341
    Points : 1 038
    Points
    1 038
    Par défaut
    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
    Membre éprouvé

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    novembre 2006
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Transports

    Informations forums :
    Inscription : novembre 2006
    Messages : 341
    Points : 1 038
    Points
    1 038
    Par défaut
    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

Discussions similaires

  1. [XSLT] Comment procéder pour gérer des langues ?
    Par virgul dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 31/03/2005, 11h01
  2. Méthode simple pour gérer les collisions
    Par Hyoga dans le forum OpenGL
    Réponses: 2
    Dernier message: 19/02/2005, 13h43
  3. Une unité pour gérer des très grands nombres
    Par M.Dlb dans le forum Langage
    Réponses: 2
    Dernier message: 09/09/2003, 12h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo