Ignorer la navigation

Front montant

Capteurs / boutons poussoirs : prise en compte d’un front ou d’un niveau ?


Exemple et problématique

On veut compter le nombre de personnes qui passent devant un capteur.

On va essayer la problématique avec un bouton poussoir à la place du capteur


On utilise le programme suivant :

//**** début du programme *********//

#define ledorange 13
#define boutonPin 2

// définition des variables
int etat_bouton = 0; // variable de l'état du bouton poussoir
int nbr;

void setup() {
  Serial.begin(9600);
  pinMode(ledorange, OUTPUT); // definition de la sortie de la led//
  pinMode(boutonPin, INPUT); // définition de l'entrée du bouton (2) //
  nbr=0;

}

void loop(){
etat_bouton = !digitalRead(boutonPin); // lecture du bouton poussoir //

if (etat_bouton == HIGH) // test si le bouton est appuyé //
   {
   nbr=nbr+1;
   }
   Serial.print("nombre de personnes: ");
   Serial.println(nbr);
}

//**** fin du programme *********//

 

 

A chaque fois qu’une personne passe devant (le temps d’appui sur le BP), le nombre augmente de 8 ou 9!

 

 

 


Regardons ce qui se passe :


Pendant le temps de passage de la personne devant le capteur (durée minimum d’appui sur le bouton poussoir de notre prototype), la boucle Loop du programme a le temps de s’exécuter 8 fois donc le programme additionne 8 fois 1 comme s’il voyait 8 personnes.

Car, notre programme est mal fait. Il prend en compte le niveau 1 du capteur (ou du bouton poussoir dans notre essai). Pour que le programme fonctionne, il doit prendre en compte le front montant de la mesure du capteur (quand le capteur passe de 0 à 1).

  

La solution pour prendre en compte le front montant au lieu du niveau :

Algorigramme de la solution:

 

 
Le programme :

//**** début du programme *********//

#define ledorange 13
#define boutonPin 2

// définition des variables
boolean etat_bouton = 0; // variable de l'état du bouton poussoir
boolean memo_etat_bouton = 0; // variable de mémorisation de l’atat du bouton
int nbr;

void setup() {
   Serial.begin(9600);
   pinMode(ledorange, OUTPUT); // definition de la sortie de la led//
   pinMode(boutonPin, INPUT); // définition de l'entrée du bouton (2) //
   nbr=0;
}

void loop(){
etat_bouton = !digitalRead(boutonPin);    // lecture du bouton poussoir //

// comparaison de l'état actuel du bouton poussoir (etat_bouton) à l'état précédent mémorisé (memo_etat_bouton)
if (etat_bouton != memo_etat_bouton){ // si l'état du bouton poussoir a changé

    // on mémorise l'état courant du bouton poussoir pour les prochains passages dans la boucle loop
   memo_etat_bouton = etat_bouton;

   if (etat_bouton == HIGH)     // si ce nouvel état est passé à 1, on a un front montant.
   {
       nbr=nbr+1;
      Serial.print("nombre de personnes: ");
      Serial.println(nbr);
   }
}
} // fin du Loop

//**** fin du programme *********//

Créé avec eXeLearning (Nouvelle fenêtre)