Exercice : Accesseur de lecture

Simulateur

Cet exercice est à réaliser avec le simulateur en ligne Wokwi

Nous allons maintenant ajouter un bouton poussoir. Nous souhaitons le fonctionnement suivant : lorsqu'on lance le programme, il ne se passe rien tant qu'on n'a pas appuyé sur le bouton poussoir. Tant que le bouton est enfoncé, le cycle de clignotement de la diode s'exécute. Il s'arrête si on relâche le bouton.

Montage du bouton poussoir : ne pas oublier une résistance de tirage sur la masse

Lorsque l'interrupteur est ouvert, la broche d'entrée du micro-contrôleur est « en l'air » : il est donc nécessaire de fixer le potentiel à 0 via une résistance reliée au 0v.

Question

Modifiez le projet précédent pour introduire le fonctionnement du bouton poussoir pour lequel on définira une classe Bp en s'inspirant de la classe Led précédente. Vous prévoirez un assesseur de lecture pour connaitre l'état du bouton.

Question

Testez la classe Bp seule dans un premier temps puis incorporez-la au programme précédente pour répondre au cahier des charges.

Solution

Programme principal
1
#define PORT_LED 7
2
#define PORT_BP 6
3
#include "Led.h"
4
#include "Bp.h"
5
6
Led diode;
7
Bp bouton;
8
9
//Programme principal
10
void setup() {
11
  diode.setPinLed(PORT_LED);
12
  bouton.setPin(PORT_BP);
13
}
14
15
void loop() {
16
  //Lire Bp et allumer Led si Bp enfoncé, éteindre sinon
17
  if(bouton.getBpState()){diode.setOn();}
18
  else{diode.setOff();}
19
}
Led.h
1
class Led{
2
 private:
3
    int pinLed;
4
 public:
5
  void setPinLed(int);
6
  void setOn();
7
  void setOff();
8
};
9
Led.ino
1
void Led::setPinLed(int port_number){
2
  /*Avant d'affecter la valeur du port à pinLed, il faut
3
  vérifier que cette valeur est conforme*/
4
  if(port_number >=2 && port_number <=8){
5
      pinLed = port_number;
6
  }
7
  else{
8
    pinLed = 2;//En cas d'erreur, on peut par exemple utiliser une valeur par défaut
9
  }
10
  pinMode(pinLed, OUTPUT);
11
}
12
void Led::setOn(){
13
  digitalWrite(pinLed, HIGH);
14
}
15
void Led::setOff(){
16
  digitalWrite(pinLed, LOW);
17
}
18
Bp.h
1
class Bp{
2
  private:
3
    int pinBp;
4
  public:
5
    void setPin(int);
6
    bool getBpState();
7
};
8
9
Bp.ino
1
#define PORT_MIN 5
2
#define PORT_MAX 7
3
4
void Bp::setPin(int value){
5
  if(value >= PORT_MIN && value <= PORT_MAX){
6
        pinBp = value;
7
            pinMode(pinBp, INPUT);
8
9
      }
10
  else{
11
    Serial.println("Erreur");
12
  }
13
}
14
bool Bp::getBpState(){
15
  return(digitalRead(pinBp));
16
}