IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Arduino Discussion :

Problème de sortie de veille avec capteur PIR.


Sujet :

Arduino

  1. #1
    Membre à l'essai
    Homme Profil pro
    chomeur
    Inscrit en
    Avril 2017
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : Avril 2017
    Messages : 23
    Points : 18
    Points
    18
    Par défaut Problème de sortie de veille avec capteur PIR.
    Bonjour,
    J'ai inclus le code pour le détecteur Pir dans l'exemple de sortie de veille : "powerDownWakeExternalInterrupt", le réveil se fait quand il y a un mouvement, mais ça reste bloquer que je ne sais pas faire afficher dans le moniteur : "mouvement détecté".



    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    // **** COMPREND *****
    #define IR_output 2
    #include "LowPower.h"
     
    // Utiliser la broche 2 comme broche de réveil
    const int wakeUpPin = 2; 
     
     
     
    void wakeUp()
    {
        // Juste un gestionnaire pour l'interruption de broche.
    }
     
    void setup(){
     
        // Configurez la broche de réveil comme entrée.
        // Cela consommera quelques uA de courant.
        pinMode(wakeUpPin, INPUT);   
     
    }
     
    void loop() 
    {
        // Autorise la broche de réveil à déclencher une interruption sur faible.
        attachInterrupt(0, wakeUp, LOW);
     
        // Entrez dans l'état de mise hors tension avec les modules ADC et BOD désactivés.
        // Réveillez-vous lorsque la broche de réveil est faible.
     
        LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF); 
     
        // Désactive l'interruption de la broche externe sur la broche de réveil.
        detachInterrupt(0); 
     
        // Faites quelque chose ici
        // Exemple : lecture du capteur, enregistrement des données, transmission des données.
        // Importe Pir
     
        pinMode(IR_output,INPUT);
     
        Serial.begin(9600);
     
     if(digitalRead(IR_output)==LOW){
       Serial.println("pas de mouvement detecte");
      }
     
     
     
     if(digitalRead(IR_output)==HIGH){
       Serial.println("mouvement detecte");
      }
     
    delay(200);
    }
    Fichiers attachés Fichiers attachés

  2. #2
    Membre à l'essai
    Homme Profil pro
    chomeur
    Inscrit en
    Avril 2017
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : Avril 2017
    Messages : 23
    Points : 18
    Points
    18
    Par défaut
    Pour être sur qu'on comprenne, le mouvement est détecté car l'affichage continu de"mouvement non détecté" s'interrompt, mais l'action du message dans le moniteur"mouvement détecté" ne se fait pas.

  3. #3
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    Peut-être commencez par testez votre PIR pour voir s'il envoie HIGH ou LOW lors de la détection et regardez aussi combien de temps cette pin reste activée et s'il y a des rebonds

  4. #4
    Membre à l'essai
    Homme Profil pro
    chomeur
    Inscrit en
    Avril 2017
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : Avril 2017
    Messages : 23
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par Jay M Voir le message
    Peut-être commencez par testez votre PIR pour voir s'il envoie HIGH ou LOW lors de la détection et regardez aussi combien de temps cette pin reste activée et s'il y a des rebonds
    Merci pour ta réponse, c'est HIGHT qui empêche l'action, malgré qu'il reçoit, et donc ça s'interromp 3 secondes l'affichage continu correspondant a Low.

    J'avais poter le sujet sur un autre Forum dédié qu'a l'Arduino, j'ai été au départ bloqué car premier message, ensuite engeulé sur ce forum car même sujet sur 2 forums, mais je suis inscrit au départ ici pour le Python et le Julia, je ferme le sujet sur l'autre Forum pour éviter plus de polémique, et je ne continue que ICI !

  5. #5
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    Vaut mieux éviter de poster a deux endroits, c’est effectivement mal vu…

    Mettez de côté pour l’instant ce code et faites juste un code qui affiche les changements d’états de la pin

    Un PIR a besoin aussi de 30s environ au boot pour se calibrer

  6. #6
    Membre à l'essai
    Homme Profil pro
    chomeur
    Inscrit en
    Avril 2017
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : Avril 2017
    Messages : 23
    Points : 18
    Points
    18
    Par défaut
    D'accord, mais pour le calibrage, il semble détecter bien le HIGH étant donné qu'il n'écrit momentanément plus ce qui correspond a LOW, j'ai même déjà utiliser CHANGE, c'est toujours pareil.

    Concernant changement d'états de la pin, autre chose que d'utiliser HIGH LOW CHANGE FALLING RISING ? Car j'ai tout essayé déja.

  7. #7
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    Postez le code de lecture simple / détection de changement d’état et dites nous ce que vous voyez

  8. #8
    Membre à l'essai
    Homme Profil pro
    chomeur
    Inscrit en
    Avril 2017
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : Avril 2017
    Messages : 23
    Points : 18
    Points
    18
    Par défaut
    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
     
    #define wakeUpPin 2
     
     
    void setup() {
      // put your setup code here, to run once:
     
    }
     
    void loop() {
      // put your main code here, to run repeatedly:
        pinMode(wakeUpPin,INPUT);   
     
        Serial.begin(9600);
     
     if(digitalRead(wakeUpPin)==LOW){
       Serial.println("pas de mouvement detecte");
      }
     
     if(digitalRead(wakeUpPin)==HIGH){
       Serial.println("mouvement detecte");
      }
     
    delay(200);
    }
    Je vois s'afficher "pas de mouvement detecte" en continu tant que rien détecter, et 10X "mouvement detecte" quand ça détecte pendant 3 secondes, ça correspond au réglage d'usine les 3 secondes.

  9. #9
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    OK (faut mettre le pinMode et le Serial.begin dans le setup et normalement un delay

    donc le capteur est LOW quand pas de mouvement et passe à HIGH en cas de mouvement

    --> votre ISR doit se déclencher sur front Montant, pas quand elle est à LOW...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     attachInterrupt(digitalPinToInterrupt(wakeUpPin), wakeUp, RISING)
    cf la doc: https://www.arduino.cc/reference/en/...tachinterrupt/

  10. #10
    Membre à l'essai
    Homme Profil pro
    chomeur
    Inscrit en
    Avril 2017
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : Avril 2017
    Messages : 23
    Points : 18
    Points
    18
    Par défaut
    Merci, bien qu'avec ta ligne proposée j'ai une erreur a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
    Je me suis donc contenté de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    attachInterrupt(0, wakeUp, RISING);
    Donc juste remplacer LOW par RISING et mis dans le setup ce que tu m'as dit, et j'obtiens quand il y a un mouvement, mais rien ne s'écrit quand il n'y en pas, c'est déjà beaucoup mieux, je comprendrais plus tard, c'est bon a 95% pour moi, reste plus qu'a savoir pourquoi c'est le LOW qui ne se met plus a présent. Mais donc comme ça je suis déjà bien content !

  11. #11
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    aviez vous déclaré la constante wakeUpPin ?

    mais rien ne s'écrit quand il n'y en pas
    l'arduino se met en veille non? donc rien ne va s'écrire

    Postez le code, ce sera plus simple pour comprendre ce que vous avez vraiment fait.

  12. #12
    Membre à l'essai
    Homme Profil pro
    chomeur
    Inscrit en
    Avril 2017
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : Avril 2017
    Messages : 23
    Points : 18
    Points
    18
    Par défaut
    J'ai également gardé qu'une seule variable pour la valeur 2.
    Voici le code

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    // **** COMPREND *****
    #include "LowPower.h"
     
    // Utiliser la broche 2 comme broche de réveil
    const int IR_output = 2; 
     
     
     
    void wakeUp()
    {
        // Juste un gestionnaire pour l'interruption de broche.
    }
     
    void setup(){
     
        // Configurez la broche de réveil comme entrée.
        // Cela consommera quelques uA de courant.
        pinMode(IR_output, INPUT); 
     
     
        Serial.begin(9600);  
     
    }
     
    void loop() 
    {
        // Autorise la broche de réveil à déclencher une interruption sur faible.
        attachInterrupt(0, wakeUp, RISING);
     
     
        // Entrez dans l'état de mise hors tension avec les modules ADC et BOD désactivés.
        // Réveillez-vous lorsque la broche de réveil est faible.
     
        LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF); 
     
        // Désactive l'interruption de la broche externe sur la broche de réveil.
        detachInterrupt(0); 
     
        // Faites quelque chose ici
        // Exemple : lecture du capteur, enregistrement des données, transmission des données.
        // Importe Pir
    #define IR_output 2 
     
     
     if(digitalRead(IR_output)==LOW){
       Serial.println("pas de mouvement detecte");
      }
     
     
     
     if(digitalRead(IR_output)==HIGH){
       Serial.println("mouvement detecte");
      }
     
    delay(200);
    }

  13. #13
    Membre à l'essai
    Homme Profil pro
    chomeur
    Inscrit en
    Avril 2017
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : Avril 2017
    Messages : 23
    Points : 18
    Points
    18
    Par défaut
    Maintenant que je comprend je pense que c'est résolu, donc j'attend ton approbation sur le code finale pour fermer.

  14. #14
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    ne répétez pas (différemment)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // Faites quelque chose ici
        // Exemple : lecture du capteur, enregistrement des données, transmission des données.
        // Importe Pir
    #define IR_output 2
    vous avez déjà défini IR_output valant 2 au début du code

    Quand vous vous réveillez, c'est que la transition LOW --> HIGH vient d'avoir lieu et donc pendant 3 secondes la lecture sera à HIGH, vous ne verrez donc jamais "pas de mouvement detecte"

    Il se peut qu'il faille donner un peu de temps pour que la ligne série se réveille juste en sortie de l'interruption. Essayez (avec le moniteur série à 115200 bauds)

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    #include "LowPower.h"
     
    // Utiliser la broche 2 comme broche de réveil
    const byte pinPIR = 2;
     
    // Juste un gestionnaire pour l'interruption de broche.
    void wakeUp() {}
     
     
    void setup() {
      // Configurez la broche de réveil comme entrée.
      // Cela consommera quelques uA de courant.
      pinMode(pinPIR, INPUT);
      Serial.begin(115200);
    }
     
    void loop()
    {
      // Autorise la broche de réveil à déclencher une interruption sur transition LOW -> HIGH (RISING)
      attachInterrupt(digitalPinToInterrupt(pinPIR), wakeUp, RISING);
     
      // Entrez dans l'état de mise hors tension avec les modules ADC et BOD désactivés.
      Serial.println(F("On s'endort")); Serial.flush();
      LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
     
      // Réveillez-vous lorsque la broche de réveil présente le front attendu
      // Désactive l'interruption de la broche externe sur la broche de réveil.
      detachInterrupt(digitalPinToInterrupt(pinPIR));
      // petite attente pour que le processeur soit bien réveillé :)
      delay(100);
     
      // Faites quelque chose ici
      // Exemple : lecture du capteur, enregistrement des données, transmission des données.
      Serial.println("mouvement detecte");
      // on s'assure que le message est bien parti
      Serial.flush();
    }

  15. #15
    Membre à l'essai
    Homme Profil pro
    chomeur
    Inscrit en
    Avril 2017
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : Avril 2017
    Messages : 23
    Points : 18
    Points
    18
    Par défaut
    Merci bien pour tout, je clôture.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de sortie de boucle avec les observer
    Par gaspasho dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 22/07/2020, 00h57
  2. Problème capteur PIR (avec Raspberry pi)
    Par MRdu75 dans le forum Raspberry Pi
    Réponses: 4
    Dernier message: 20/05/2016, 21h08
  3. Problème de sortie avec R 3.2.2 en console
    Par RomV007 dans le forum R
    Réponses: 3
    Dernier message: 27/10/2015, 10h33
  4. Problème sortie de veille CameraPreview
    Par Minifish57 dans le forum Android
    Réponses: 0
    Dernier message: 15/05/2013, 10h58
  5. Réponses: 3
    Dernier message: 20/03/2008, 13h53

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