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 :

Gestion du temps (comptage entrée/sortie)


Sujet :

Arduino

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    octobre 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : octobre 2019
    Messages : 7
    Points : 3
    Points
    3
    Par défaut Gestion du temps (comptage entrée/sortie)
    Bonjour,

    Je suis un nouveau dans la programmation Arduino et ai donc besoin d'aide !

    Je cherche à créer, à l'aide de détecteurs de mouvements IR, un compteur d'entrée-sortie qui donnerait le nombre de personnes qui se trouve dans une piece.

    Pour ce faire, je place un capteur de chaque coté de la porte et regarde dans quel ordre ceux-ci vont s'allumer. (Si le premier s'allume puis le second, alors quelqu'un rentre dans cette piece (n=n+1). A l'inverse si le second s'active avant le premier, quelqu'un quitte la piece (n=n-1)
    Il me faut donc une variable de temps me permettant donner une période de temps sur laquelle le deuxième capteur peut s'allumer signifiant le passage d'une personne dans la pièce ; si le deuxième capteur ne s'allume pas durant cette période de temps, alors la valeur de n ne change pas : personne n'est rentré dans la pièce.

    Ci dessous le code que j'ai déjà écris. Ça serait chouette si vous pouviez m'aider à le faire marcher !!

    Merci de votre aide !!

    Cherlok avec un C


    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
    void setup() {
    int NombreDePersonne = 0;
    pinMode(A0, INPUT);
    pinMode(A1, INPUT);
    temps=millis();
    }
     
    void loop() {
     
     
    if(digitalRead(A0) == HIGH){
    t0=temps; //on cherche a donner à t0 la valeur du temps actuel
    while(temps<t0+500){ //ensuite, regarder la condition suivante pendant un certain intervalle de temps
    if(A1 == HIGH){
    NombreDePersonne=NombreDePersonne+1;
    }
    }
    }
     
    if(digitalRead(A1) == HIGH){
    t1=temps; //on cherche a donner à t1 la valeur du temps actuel
    while(temps<t1+500){ //ensuite, regarder la condition suivante pendant un certain intervalle de temps
    if(A0 == HIGH){
    NombreDePersonne=NombreDePersonne-1;
    }
    }
    }
     
    if(N<=0){
    N=0;
    digitalWrite(5 == LOW);
    }
     
    if(N>0){
    digitalWrite(5 == HIGH);
    }
    }

  2. #2
    Membre éclairé
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    février 2013
    Messages
    308
    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 : 308
    Points : 804
    Points
    804
    Par défaut
    Bonjour CypCherlok
    Citation Envoyé par CypCherlok Voir le message
    Ci dessous le code que j'ai déjà écris. Ça serait chouette si vous pouviez m'aider à le faire marcher !!
    Ah l'enthousiasme du débutant!!!.
    Tu est un peu parti "tête baissée" sans étudier, un peu, la structure d'un programme "Arduino". Regardes ici et .
    Ton problème (mais pas le seul), est la portée des variables, exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	int NombreDePersonne = 0;
    n'est "vue" que dans la structure setup() donc pas dans loop(), d'où erreur.
    Une variable qui se veut globale doit être déclarée "tout en haut", en dehors de toute structure.

    Tout ça ne va pas encore faire fonctionner ton programme, mais corriger quelques erreurs "fondamentales", fais les corrections, remets ton programme en ligne pour la suite.

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

  3. #3
    Membre confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    mai 2013
    Messages
    92
    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 : 92
    Points : 540
    Points
    540
    Par défaut Cassandre ?
    Bonjour,

    C'est un sujet intéressant mais en fait très difficile .

    La partie code est finalement la plus facile (tout est relatif). En fait le problème vient des faux positifs (détection sans objet, par exemple la main qui bouge de quelqu'un qui discute dans le chambranle de la porte sans la franchir) et des faux négatifs (pas vu pas pris).

    Ainsi les systèmes de sécurité utilisent des capteurs double technologie (BT : infra-rouge et HF) pour diminuer les faux. Cependant, les pompiers n'acceptent jamais les informations de vacuité fournies par ces systèmes qui restent très incertains. Le passage de 2 personnes accolées (affectueusement ou l'un soutenant l'autre) sera en général détecté comme un passage unique.

    Mais cela reste un très bon exercice de programmation.

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

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    octobre 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : octobre 2019
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par jpbbricole Voir le message
    Bonjour CypCherlok

    Ah l'enthousiasme du débutant!!!.
    Tu est un peu parti "tête baissée" sans étudier, un peu, la structure d'un programme "Arduino". Regardes ici et .
    Ton problème (mais pas le seul), est la portée des variables, exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	int NombreDePersonne = 0;
    n'est "vue" que dans la structure setup() donc pas dans loop(), d'où erreur.
    Une variable qui se veut globale doit être déclarée "tout en haut", en dehors de toute structure.

    Tout ça ne va pas encore faire fonctionner ton programme, mais corriger quelques erreurs "fondamentales", fais les corrections, remets ton programme en ligne pour la suite.

    Cordialement
    jpbbricole

    Merci beaucoup pour les références ! Je m'en vais de ce pas zieuter tout cela

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    octobre 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : octobre 2019
    Messages : 7
    Points : 3
    Points
    3
    Par défaut Episode 2
    Salut tout le monde ! Grace aux différentes références données et mes propres recherches, j'ai pu quelque peu modifier le code. Voilà ce que cela donne !

    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
    58
    59
    60
    int nombredePersonne = 0;
    int value = 0;
    int pirState = LOW;
    int value2 = 0;
    int pirState2 = LOW;
     
    int led = 13;
    //Pin où sera le sensor
    int pin = 2;
    int pin2 = 4;
     
    int temps = millis();
    int t0 = 0;
    int t1 = 0;
     
    void setup() {
     
      pinMode(led, OUTPUT);
      pinMode(pin, INPUT);
      Serial.begin(9600);
     
    }
     
     
     
    void loop() {
     
      value = digitalRead(pin);
      value2 = digitalRead(pin2);
      if (value == HIGH) {
        t0 = temps; //on cherche a donner à t0 la valeur du temps actuel
        while (temps < t0 + 500) { //ensuite, regarder la condition suivante pendant un certain intervalle de temps
          if (value2 == HIGH) {
            nombredePersonne = nombredePersonne + 1;
          }
        }
      }
     
      value = digitalRead(pin);
      value2 = digitalRead(pin2);
      if (value2 == HIGH) {
        t1 = temps; //on cherche a donner à t1 la valeur du temps actuel
        while (temps < t1 + 500) { //ensuite, regarder la condition suivante pendant un certain intervalle de temps
          if (value == HIGH) {
            nombredePersonne = nombredePersonne - 1;
          }
        }
      }
     
     
      if (nombredePersonne <= 0) {
        nombredePersonne = 0;
        digitalWrite(led == LOW);
      }
     
     
      if (nombredePersonne > 0) {
        digitalWrite(led == HIGH);
      }
    }


    Le logiciel m'indique qu'il y a un petit problème à la dernière ligne (même si je me doute qu'il doit y en avoir un peu partout ahah).
    Qu'en pensez-vous ?

  6. #6
    Membre éclairé
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    février 2013
    Messages
    308
    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 : 308
    Points : 804
    Points
    804
    Par défaut
    Bonjour CypCherlok
    Citation Envoyé par CypCherlok Voir le message
    .. et mes propres recherches, ...
    Alors, encore un petit effort
    digitalWrite(led == HIGH);

    et recherches quand utiliser = ou ==


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

  7. #7
    Membre régulier
    Homme Profil pro
    savant fou
    Inscrit en
    septembre 2019
    Messages
    48
    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 : 48
    Points : 96
    Points
    96
    Par défaut
    Attention aussi aux types:
    N’est pas bon - il faut un unsigned long

    Attention aussi aux débordements dans les calculs (dans 50 jours :-) y’a un peu le temps)
    on écrira donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     while (temps -  t0  < 500) {
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     while (temps < t0 + 500) {
    Car l’addition risque de déborder et retourner à zéro

    Et bien sûr quand on fait un while il vaudrait mieux que les éléments du test évoluent Sinon c’est la boucle infinie...

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    octobre 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : octobre 2019
    Messages : 7
    Points : 3
    Points
    3
    Par défaut Episode 3
    Grace à vous et de nouvelles recherches, voici ce que j'ai

    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
    58
    59
    60
    int nombredePersonne = 0;
     
    int inputPin = 2;               // PIR sensor
    int pirState = LOW;             // Au début, aucun mouvement
    int value = 0;                    // variable pin status
     
    int inputPin2 = 4;               // 2eme PIR sensor
    int pirState2 = LOW;             // Aucun mouvement
    int value2 = 0;                    // variable pin status
     
    void setup() {
      pinMode(inputPin, INPUT);     // sensor &#8594; input
      pinMode(inputPin2, INPUT);     // sensor &#8594; input
      Serial.begin(9600);
    }
     
    void loop() {
     
      value = digitalRead(inputPin);  // read input value
      value2 = digitalRead(inputPin2);  // read input value2
      if (value == HIGH) {            // Mouvement?
        if (pirState == LOW) {
          unsigned long started_waiting_at = millis();
          while (millis() - started_waiting_at > 3000) {
            if (value2 == HIGH) {      // check if the input 2 is HIGH
              if (pirState2 == LOW) {
                // we have just turned on
                Serial.println("Motion detected!");
                nombredePersonne = nombredePersonne + 1;
                Serial.println(nombredePersonne);
              }
            } else {
              if (pirState2 == HIGH) {
                // we have just turned of
                Serial.println("No Motion!");
                // We only want to print on the output change, not state
                pirState = LOW;
              }
            }
            // We only want to print on the output change, not state
            pirState = HIGH;
            Serial.println(nombredePersonne);
          }
        } else {
          if (pirState == HIGH) {
            // we have just turned of
            Serial.println("Motion ended!");
            // We only want to print on the output change, not state
            pirState = LOW;
            Serial.println(nombredePersonne);
          }
        }
     
        if (nombredePersonne <= 0) {
          nombredePersonne = 0;
        }
     
      }
     
    }

    Qu'en pensez vous ? :')

  9. #9
    Membre confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    mai 2013
    Messages
    92
    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 : 92
    Points : 540
    Points
    540
    Par défaut
    Bonjour,

    Je crois qu'il y aura encore quelques épisodes . Voir les commentaires en rouge.

    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
    int nombredePersonne = 0;
     
    int inputPin = 2;                 // PIR sensor
    int pirState = LOW;               // Au début, aucun mouvement
    int value = 0;                    // variable pin status
     
    int inputPin2 = 4;                // 2eme PIR sensor
    int pirState2 = LOW;              // Aucun mouvement
    int value2 = 0;                   // variable pin status
     
    void setup() {
      pinMode(inputPin, INPUT);       // sensor → input
      pinMode(inputPin2, INPUT);      // sensor → input
      Serial.begin(9600);
    }
     
    void loop() {
     
      value = digitalRead(inputPin);   // read input value
      value2 = digitalRead(inputPin2); // read input value2
      if (value == HIGH) {             // Mouvement?
        if (pirState == LOW) {
          unsigned long started_waiting_at = millis();
          while (millis() - started_waiting_at > 3000) {
            if (value2 == HIGH) {      // check if the input 2 is HIGH
              if (pirState2 == LOW) {
                // we have just turned on
                Serial.println("Motion detected!");
                nombredePersonne = nombredePersonne + 1; /// nombredePersonne++; suffit
                Serial.println(nombredePersonne);
              }
            } else {
              if (pirState2 == HIGH) {
                // we have just turned of
                Serial.println("No Motion!");
                // We only want to print on the output change, not state
                pirState = LOW;    /// Affectation sans effet car suivie par pirState = HIGH; 
              }
            }
            // We only want to print on the output change, not state
            pirState = HIGH;  
            Serial.println(nombredePersonne);
          }
        } else {                   /// ie pirState != LOW
          if (pirState == HIGH) {  /// Alors ce test est-il utile ?
            // we have just turned of
            Serial.println("Motion ended!");
            // We only want to print on the output change, not state
            pirState = LOW;
            Serial.println(nombredePersonne);
          }
        }
        if (nombredePersonne <= 0) { /// Quand est-ce que le nombre de personnes décroit ?
          nombredePersonne = 0;
        }
      }
    }
    Courage, ça avance.
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  10. #10
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    octobre 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : octobre 2019
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup TTwTT
    Alors j'ai compris pour le problème du pirState = High puis Low puis High (enfin je crois ). Par contre je ne comprends pas trop ce que vous voulez dire que vous écrivez "Ce test était-il utile?"

  11. #11
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    octobre 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : octobre 2019
    Messages : 7
    Points : 3
    Points
    3
    Par défaut Episode 4
    Le programme avance et donne des résultats de plus en plus proche de ce que je souhaite même si ce n'est clairement pas encore terminé. Un grand merci à vous !

    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    int nombredePersonne = 0;
    
    int inputPin = 2;               // Input pin du PIR sensor
    int pirState = LOW;             // Au début, aucun mouvement
    int value = 0;                  // variable pour lire le pin status
    
    int inputPin2 = 4;              // Input pin du 2ème PIR sensor
    int pirState2 = LOW;            // Au début, aucu mouvement
    int value2 = 0;                 // variable pour lire le pin status
    
    void setup() {
      pinMode(inputPin, INPUT);     // declare sensor as input
      pinMode(inputPin2, INPUT);     // declare sensor as input
      Serial.begin(9600);
    }
    
    void loop() {
    
      value = digitalRead(inputPin);  // lire la input value
      value2 = digitalRead(inputPin2);  // lire la input value2
      if (value == HIGH) {            // vérifier si l'input est HIGH (quelqu'un déclenche l'input en entrant)
        if (pirState == LOW) {
          unsigned long started_waiting_at = millis();
          while (millis() - started_waiting_at < 3000) {
            if (value2 == HIGH) {      // vérifier si l'input est HIGH (quelqu'un déclenche l'input 2 en entrant)
              if (pirState2 == LOW) {
                delay (500);
                // we have just turned on
                nombredePersonne++;
                Serial.println("Quelqu'un entre. Motion detected!");
                Serial.println(nombredePersonne);
              }
            } else {
              if (pirState2 == HIGH) {
                delay (500);
                // we have just turned of
                Serial.println("No Motion!");
              }
            }
            // We only want to print on the output change, not state
            pirState = HIGH;
            delay (500);
            Serial.println(nombredePersonne);
          }
        } else {
          if (pirState == HIGH) {
            // we have just turned of
            delay (500);
            Serial.println("Motion ended!");
            // We only want to print on the output change, not state
            pirState = LOW;
            delay (500);
            Serial.println(nombredePersonne);
          }
        }
      }
    
      if (value2 == HIGH) {            // vérifier si l'input2 est HIGH (quelqu'un déclenche l'input 2 en sortant)
        if (pirState2 == LOW) {
          unsigned long started_waiting_at2 = millis();
          while (millis() - started_waiting_at2 < 3000) {
            if (value == HIGH) {      // vérifier si l'input est HIGH (quelqu'un déclenche l'input en sortant)
              if (pirState == LOW) {
                delay (500);
                // we have just turned on
                Serial.println("Quelqu'un sort. Motion detected!");
                nombredePersonne--;
                Serial.println(nombredePersonne);
              }
            } else {
              if (pirState == HIGH) {
                delay (500);
                // we have just turned of
                Serial.println("No Motion!");
              }
            }
            // We only want to print on the output change, not state
            pirState2 = HIGH;
            delay (500);
            Serial.println(nombredePersonne);
          }
        } else {
          if (pirState2 == HIGH) {
            // we have just turned of
            delay (500);
            Serial.println("Motion ended!");
            // We only want to print on the output change, not state
            pirState2 = LOW;
            delay (500);
            Serial.println(nombredePersonne);
          }
        }
      }
    
      delay (2000);
    
      if (nombredePersonne <= 0) {
        nombredePersonne = 0;
      }
    }

    Maintenant le programme compte le nombre de sorties ! J'ai rajouté pas mal de délais un peu partout pour pouvoir lire plus facilement le programme dans le moniteur série. (sinon ça allait trop vite et quand quelqu'un entrait, ils étaient 30 a entrer à la suite ahah xD Maintenant ils ne sont plus autant (toujours plus que 1 par 1 mais c'est déjà ça..))). J'ai fais les modifications que vous m'aviez conseillées et que j'ai comprises.
    Qu'en pensez-vous ?

  12. #12
    Membre confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    mai 2013
    Messages
    92
    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 : 92
    Points : 540
    Points
    540
    Par défaut
    Bonjour,

    Citation Envoyé par CypCherlok Voir le message
    Alors j'ai compris pour le problème du pirState = High puis Low puis High (enfin je crois ). Par contre je ne comprends pas trop ce que vous voulez dire que vous écrivez "Ce test était-il utile?"
    Le else qui précède est l'alternative de if(pirState == LOW). Or le contraire de pirState == LOW est pirState == HIGH (car pirState ne peut avoir que deux états). Il s'ensuit que le test qui suit, if(pirState == HIGH), est toujours vrai donc inutile.

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

  13. #13
    Membre confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    mai 2013
    Messages
    92
    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 : 92
    Points : 540
    Points
    540
    Par défaut Episode N
    Bonjour (2),

    Citation Envoyé par CypCherlok Voir le message
    J'ai rajouté pas mal de délais un peu partout.
    Les 2 lectures d'états ont lieu en début de code. Aucune lecture dans le cœur du code. Or les retards n'ont un effet que sur les lectures. Aussi il est préférable de ne faire qu'un seul delay en fin de code. Le delay(2000) va très bien quitte à l'augmenter si nécessaire.

    Par ailleurs, il faut que je regarde le séquencement d'états car je le trouve un peu trop complexe pour le travail à faire. Mais je me trompe peut être.

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

  14. #14
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    octobre 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : octobre 2019
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup ! Je vais jouer sur les delais alors. Et pour les séquencements d'état je vous fais confiance.

  15. #15
    Membre confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    mai 2013
    Messages
    92
    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 : 92
    Points : 540
    Points
    540
    Par défaut
    Bonjour (3),

    Proposition de modifications ne s'intéressant qu'aux transitions (une refonte plus importante avec calcul de délais entre transitions permettrait un code plus court et plus sûr).

    Le code suivant n'a pas été testé, il y a peut être des scories.

    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 nombredePersonne = 0;
     
    int inputPin  = 2;                               // Input pin du PIR sensor
    int pirState  = LOW;                             // Au début, aucun mouvement
    int value     = 0;                               // variable pour lire le pin status
     
    int inputPin2 = 4;                               // Input pin du 2ème PIR sensor
    int pirState2 = LOW;                             // Au début, aucun mouvement
    int value2    = 0;                               // variable pour lire le pin status
     
    void setup() {
       pinMode(inputPin,  INPUT);                    // declare sensor as input
       pinMode(inputPin2, INPUT);                    // declare sensor as input
       Serial.begin(9600);
    }
     
    void loop() {                                    // Travailler plus par transition que sur état
       int i;
       value  = digitalRead(inputPin);               // lire l'entrée 1
       value2 = digitalRead(inputPin2);              // lire l'entrée 2
       if (value > pirState) {                       // HIGH > LOW  : quelqu'un déclenche 1 en entrant
          for(i = 0; ++i; (i < 6) && (pirState2 == LOW) {               
             if (value2 > pirState2) {               // HIGH > LOW  : quelqu'un déclenche 2 en entrant
                nombredePersonne++;                  // 
                Serial.println("Mouvement ! Quelqu'un entre.");
                Serial.println(nombredePersonne);
                pirState2 = HIGH;
             } else {
                delay (500);                         // 6 x 500 = 3000 => millis inutile ici
                value2 = digitalRead(inputPin2);     // relire l'entrée 2
             }
          }
       } else {
          if (value2 > pirState2) {                  // HIGH > LOW  : quelqu'un déclenche 2 en sortant
             for(i = 0; ++i; (i < 6) && (pirState == LOW) {               
                if (value > pirState) {              // HIGH > LOW  : quelqu'un déclenche 1 en sortant
                   nombredePersonne--;
                   if(nombredePersonne < 0) nombredePersonne = 0;
                   Serial.println("Mouvement ! Quelqu'un sort.");
                   Serial.println(nombredePersonne);
                   pirState = HIGH;
                } else {
                   delay (500);                      // 6 x 500 = 3000 => millis inutile ici
                   value = digitalRead(inputPin1);   // relire l'entrée 1
                }
             }
          }      
       }
       pirState  = value;
       pirState2 = value2;
       delay(2000);                                  // Peut être pas nécessaire
    }
    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

Discussions similaires

  1. STOCK : Intervalle de temps moyen entre sortie/entrée
    Par celinetcie dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 01/11/2014, 21h40
  2. Traitement son temps-réel entrée sortie
    Par studiobods dans le forum LabVIEW
    Réponses: 0
    Dernier message: 07/06/2008, 04h38
  3. Gestion des erreurs entre sorties sans la STL
    Par Djobird dans le forum SL & STL
    Réponses: 2
    Dernier message: 13/02/2007, 22h22
  4. gestion des entrées-sorties
    Par bandit_debutant dans le forum IO
    Réponses: 8
    Dernier message: 25/11/2006, 15h55
  5. [CR8.5] Temps machine entre Comptage et Comptage Distinct
    Par Etienne51 dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 13/10/2004, 14h26

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