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 pour calculer la durée active d'un capteur


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2020
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2020
    Messages : 1
    Par défaut Problème pour calculer la durée active d'un capteur
    Bonjour à tous,

    En ce temps de confinement, j'espère trouver une âme charitable pour résoudre mon problème.
    Jeune encore dans la programmation, cela fait plusieurs jours que je bloque sur mon code...

    Mon projet final est un détecteur de présence. Je compte dans un second temps récupérer les données via un émetteur récepteur 433.
    Les données que je veux récupérer sont le nombre de détections ainsi que les durées de présences.

    Le code ci-dessous de cette première étape est casi fonctionnel...
    La gestion de la temporisation , led et compteur fonctionne parfaitement.


    Quant à la durée que je recherche...
    A ce stade et lors de chaque déclenchement du compteur, celui-ci calcul la durée du capteur actif + la totalité du temps inactif précédent le dernier état actif.
    Il ne reste donc plus qu'à arriver à déduire ce temps d'inactivité pour connaitre cette fameuse durée !!!

    Ne Pourrait-on pas dés que le processus est à l'état LOW arriver à déclencher un autre compteur pour connaitre la durée d'inactivité et ainsi et la déduire de mon résultat de l'heure actuelle ?

    Ça parait si simple !!!

    j'ai beau me creuser la tête mais là, ça commence à fumer sérieusement...!

    Ci-joint, le programme.
    Merci de m'aiguiller et de me corriger !
    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
     
     
    int capteur = 8; // Input for HC-S501
    bool etatCapteur = 1; // Place to store Valeur du capteur
    int dernierEtatCapteur = 0;
    int compteur = 0 ;
    unsigned long dureeAllumage = 0;
    unsigned long deb = 0;
     
     
    int tempoActive = 0; // État d'activation de la tempo
    unsigned long tempoDepart = 0; // Temps à l'activation de la tempo
     
    void setup() {
     
      pinMode(4, OUTPUT); // 4 (Gestion de la LED sur carte)
      Serial.begin(9600);
      deb = millis();
    }
     
    void loop() {
     
      etatCapteur = digitalRead(capteur);
      digitalWrite(pinMode, etatCapteur);
     
      if (( etatCapteur == HIGH) && (dernierEtatCapteur == LOW)) {
     
        tempoActive = 1; // Alors on active la temporisation
        tempoDepart = millis();
        digitalWrite(4, HIGH); // 4 (Gestion de la LED sur carte)
     
      }
      if ( tempoActive ) { // Si la temporisation est active,
        if ( ( millis() - tempoDepart ) >= 3000 ) { // Temps écoulé sans détection autorisé
          tempoActive = 0; // Et on désactive la temporisation pour ne pas afficher ce message une seconde fois
          digitalWrite(4, LOW); // 4 (Gestion de la LED sur carte)
     
          dureeAllumage = (millis() - deb);
          deb = millis();
     
     
     
          { compteur++;
            Serial.println(compteur);
            Serial.print(dureeAllumage / 1000);
            Serial.println (" secondes");
          }
          dernierEtatCapteur = etatCapteur;
     
        }
      }
    }

  2. #2
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Novembre 2006
    Messages
    503
    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 : 503
    Par défaut
    Bonjour nouveau candidat,

    Excellent ton message, j'adore!

    Dans le titre de ton message, tu as indiqué capteur! Capteur de quoi!
    J'ai dû aller dans ton code pour trouver le HC SR501.
    Nous avons donc affaire à un capteur de mouvement.

    Les deux premières choses à indiquer, c'est le terme de PIR (Passive Infra Red) qu'il est possible d'utiliser dans une recherche Google, pour trouver une pléthore d'articles et de sketches (du code) en y associant le terme Arduino, et aussi que le PIR est en principe monter avec deux boutons de réglage associés au temps et à la distance.

    Un grand bravo de se lancer en programmation avec un Arduino.
    C'est génial, ludique, etc, etc, ...

    Je n'ai pas vraiment regarder le code, mais je ferais beaucoup plus simple, mais avec une vraie LED, pas celle de la carte, et sans oublier la résistance associée.
    J'allumerai simplement la LED juste pour un certain temps.

    Ce que tu essaies de faire: je ne vois pas trop.
    Si tu veux simplement compter le nombre de passage, je ferais le moins compliqué possible.
    Il ne faut pas oublier que l'angle de détection peut avoir un impact.

    Mon premier Arduino date d'environ 10 ans et j'en ai eu un second quelques années plus tard.
    C'est un choix qui reste encore actuel ... mais!

    Tu parles d'un émetteur récepteur 433, c'est bien, tu as des idées: j'ai eu les mêmes et aussi cette combinaison avec le 433 ... que je n'ai jamais vraiment pu, voire utilisé.

    Mon premier PIR a été pour un Raspberry Pi et pour bien le comprendre, je l'ai évidemment connecté sur mon Arduino UNO et essayé avec un sketch trouvé sur le Web.
    J'ai d'autres PIRs, mais ils sont connectés sur des ESP8266 et ESP32, des circuits intégrés à microcontrôleur avec connexion Wi-Fi.
    Si je dis que ce sont des Arduinos bon marchés et avec WiFi ... car je vais me faire taper dessus par les spécialistes hardware ici (il y en a beaucoup, de très bons).
    Mais qu'en on a programmé avec un Arduino et son IDE, passer aux ESPs, c'est du gâteau, et avec le même outil (c'est pour cela que je dis souvent que ce sont des Arduinos).
    On ne sait même plus parfois si on est sur un ESP ou un Arduino.
    L'avantage des ESPs, c'est le WiFi et toutes les technologies Internet: pas besoin d'un protocole en 433.

    Bref.
    Continue avec ton Arduino pour bien maîtriser ton PIR, jouer avec, comprendre et éventuellement y ajouter un relais ... au lieu d'une LED.
    Dès que tu voudras passer dans le monde des objets connectés, tu achèteras alors un module WiFi pour ton Arduino (j'en ai pas!?!) ... ou un ESP.
    Je suis certain que si tu regardes mon Python Flask et SQLite pour le Raspberry Pi 3 ou 4 - exemples de communication avec des ESP32 ou ESP8266 sous IX. Schéma Fritzing – ESP32 – PIR et Buzzer (un répulsif pour chat, possible sur un Arduino sans WiFi), d'autres idées te viendront!

    Bonnes découvertes et bon travail
    Cordialement
    A+

  3. #3
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Novembre 2006
    Messages
    503
    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 : 503
    Par défaut
    Rebonjour, après un jour de plus de réflexion (oui, j'ai quand même dormi cette nuit)

    Citation Envoyé par Ibanezmarshall Voir le message
    A ce stade et lors de chaque déclenchement du compteur, celui-ci calcul la durée du capteur actif + la totalité du temps inactif précédent le dernier état actif.
    Il ne reste donc plus qu'à arriver à déduire ce temps d'inactivité pour connaitre cette fameuse durée !!!

    Ne Pourrait-on pas dés que le processus est à l'état LOW arriver à déclencher un autre compteur pour connaitre la durée d'inactivité et ainsi et la déduire de mon résultat de l'heure actuelle ?

    Ça parait si simple !!!
    Non, non, c'est pas simple du tout, à la limite de l'impossible.
    J'en rajoute un peu plus, car je ne sais pas vraiment ce que tu veux faire, comme des statistiques!

    Un PIR est en principe juste pour détecter un mouvement et ensuite on prend une action.
    Dans mon bouquin (Java et le Raspberry Pi), j'ai aussi intégré un exemple avec un capteur à ultrason pour mesurer une distance.
    Il y a plein d'exercices où l'on peut associer divers capteurs.
    J'y ai mentionné le cas d'une personne qui s'approche ou qui s'éloigne.
    Mon application qui détecte un mouvement la nuit, enclenche un relais pour disons une minute (le temps l'aller au WC).
    Il arrive parfois que je fais plus longtemps, le luminaire s'éteint, et donc se rallume immédiatement à ma sortie des WC, et pour la même durée.
    Je mentionne un exercice associé au capteur de distance, où je vérifierais le cas où je retourne dans la chambre à coucher.
    Je ne sais même pas si c'est faisable (car je peux aller à la cuisine, au salon ou même dehors), mais si la réponse est affirmative, je pourrais dans ce cas mettre un timer plus court.

    Citation Envoyé par Ibanezmarshall Voir le message
    Il ne reste donc plus qu'à arriver à déduire ce temps d'inactivité pour connaitre cette fameuse durée !!!
    Peut-être que je me trompe et que cette phrase signifie autre chose qui va plus loin pour ton application!

    Toutes ces "choses" sont géniales à programmer avec une foule de choix de techniques informatiques.
    Bien structurer son code va être nécessaire plus il y a de fonctions et de capteurs.
    Au début un simple setup() et loop() suffit ... mais pas bien longtemps.
    Il faudrait sortir le code du PIR hors de la boucle loop() où tout y est actuellement mélangé (led, PIR et temporisation).
    Si un nouveau mouvement vient, il faudrait sans doute remettre le timer à sa valeur initiale.
    A+

  4. #4
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 903
    Par défaut
    Il faudra voir quelle précision vous souhaitez avoir avec un HC SR501:

    La majorité des PIRs (passive infrared sensor) que l'on trouve sur le marché ont deux potentiomètres, le premier règle le seuil de sensibilité (à partir de quel niveau d'Infrarouge en mouvement le capteur déclenche un signal) et le second définit pendant combien de temps la ligne de signal restera active après détection.

    Certains PIR disposent aussi d'un petit cavalier (ou de pads à souder) dit de "Retriggering" .

    Nom : PIR.png
Affichages : 508
Taille : 423,9 Ko

    Il y a généralement un 'L' et un 'H' à choisir. Lorsque vous utilisez le réglage 'H' (souvent celui qui est câblé par défaut), vous verrez que la détection reste active lorsque vous vous déplacez ou pas devant le PIR (pendant une durée dépendant du réglage du potentiomètre).
    Le réglage 'L' (sans redéclenchement) enverra des signaux variables en fonction du mouvement détecté et est assez difficile à maîtriser car il ne signale pas de "présence" s'il n'y a pas de mouvement et est assez erratique suivant la fréquence d'échantillonnage de cette pin - donc à éviter.

    La granularité de votre fonction de présence sera donc celle du seuil minimum réglable par le potentiomètre sur votre PIR. Si c'est 5 secondes par exemple, vous aurez le signal HIGH pendant 5 secondes même si la personne n'est restée que 2 secondes dans la zone de détection.
    Certains PIR vont de 0,3s à 25s (Grove) mais d'autres qui sont plus fait pour activer une lampe sont de 30s à 3 minutes.

    D'autre part, si je reste plus de ces X secondes mais que je suis immobile, le capteur ne se re-déclenchera pas tant que je ne bouge pas et vous allez compter un second passage lorsque je bouge alors que finalement c'était la même personne / le même passage.

    Donc même si vous pouvez régler une durée assez petite (moins d'une seconde) il faudra quand même affiner un peu votre algorithme de détection de nombre de passages en essayant de regrouper les événements proches en un seul passage.

    Et bien sûr il est impossible de détecter deux passages simultanés - ils sont vu comme un seul événement, ou si une nouvelle personne arrive pendant que la signal est actif et que l'autre s'en va, vous aurez toujours l'impression que c'est la même personne sur place.


    Pour l'émission en 433, prenez la bibliothèque RH_ASK de la RadioHead Packet Radio library. Certains modules chinois (surtout le récepteur) pas chers sont de vraies daubes, donc à éviter - leur préférer des modules type "RXB6 433 Mhz Superhétérodyne" avec antenne, ceux qui ressemblent à cela:

    Nom : OK.png
Affichages : 473
Taille : 444,9 Ko

  5. #5
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Novembre 2006
    Messages
    503
    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 : 503
    Par défaut
    Je l'avais bien dit, il y a ici des cracs en électronique et en connaissance du matériel.

    Citation Envoyé par Jay M Voir le message
    D'autre part, si je reste plus de ces X secondes mais que je suis immobile, le capteur ne se re-déclenchera pas tant que je ne bouge pas et vous allez compter un second passage lorsque je bouge alors que finalement c'était la même personne / le même passage.
    Donc même si vous pouvez régler une durée assez petite (moins d'une seconde) il faudra quand même affiner un peu votre algorithme de détection de nombre de passages en essayant de regrouper les événements proches en un seul passage.
    Très bonne remarque sur l'immobilité, une pause téléphone ou Whatsapp. Je m'en rappelle lors de mes premiers pas avec mes PIRs.

    Lorsque qu'on travaille sur la conception d'un logiciel, il faut aussi considérer les cas limites, comme celui d'un petit rigolo (ou d'un enfant simplement) qui va lécher les murs hors capteur ou se glisser dessous (voir couché par terre), tout simplement pour jouer à détraquer les résultats attendus par l'application ... voire produire une division par zéro .
    Attention si tu as des chats, des chiens ou un perroquet sorti de sa cage!

Discussions similaires

  1. Problème de calcul de durée -MS project 2010-
    Par Nescencita dans le forum Project
    Réponses: 2
    Dernier message: 20/07/2011, 11h52
  2. [débutant]problème pour calculer une exponentielle
    Par sissi25 dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 11/10/2008, 20h43
  3. [8.5]Problème pour calculer le nombre des personnes d'une liste
    Par Gotch59 dans le forum SAP Crystal Reports
    Réponses: 9
    Dernier message: 21/06/2007, 09h47
  4. [MySQL] problème pour calculer âge - code erronné
    Par Christophe93250 dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 12/02/2007, 18h54
  5. [MySQL] Aide pour calculer une durée
    Par Sandara dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 19/06/2006, 17h00

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