Exercice : Contrôle des données

Simulateur

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

L'inconvénient de la classe précédente était que l'on accédait directement à l’attribut (ou variable membre) pinLed. Nous allons donc ajouter une fonction qui permette d'accéder à cette variable membre :

1
class Led{
2
  private:
3
  int pinLed;
4
  public:
5
  void setPinLed(int value){pinLed = value;};
6
};

Question

Modifiez le programme principal de l'exercice précédent pour qu'il fonctionne correctement.

Dans le programme principal, vous avez sans doute utilisé l'instruction similaire à la suivante :

1
led.setPinLed(3);

Un programmeur mal informé pourrait par mégarde saisir une instruction comme celle-ci sans que cela n'empêche la compilation du programme :

1
led.setPinLed(30);

Question

Modifiez la fonction membre setPinLed() pour limiter l'accès aux ports 2 à 8. En cas d'erreur, on initialisera le port à la valeur la plus faible.

Question

En cas d'erreur, il serait souhaitable que la fonction setPinLed() renvoie une information la signalant. On pourrait se contenter d'afficher un message sur le moniteur mais l'utilisateur final de votre classe préféra peut-être une autre solution, il faut donc lui laisser ce choix. Il vous est donc demandé de faire en sorte que la fonction renvoie un simple code d'erreur, par exemple 1 si il y a une erreur et 0 sinon, que l'on pourra ensuite exploiter à sa guise dans le programme principal.

Solution

1
2
#define PORT_LED 9
3
#define PORT_MIN 2
4
#define PORT_MAX 8
5
6
class Led {
7
  private:
8
    int pinLed;
9
  public:
10
    int setPinLed(int value) {
11
      if (value >= PORT_MIN && value <= PORT_MAX) {
12
        pinLed = value;//Valeur correcte
13
        return (0);
14
      }
15
      else {
16
        pinLed = PORT_MIN;//Valeur incorrecte
17
        return (1);
18
      }
19
    };
20
    int getPinLed() {
21
      return (pinLed);
22
    };
23
};
24
25
Led led;
26
int erreur;
27
28
void setup() {
29
  Serial.begin(9600);
30
  erreur = led.setPinLed(PORT_LED) ;
31
  if (erreur == 0) {
32
    pinMode(led.getPinLed(), OUTPUT);
33
  } else {
34
    Serial.println("Erreur de port");
35
  }
36
37
}
38
39
void loop() {
40
  if (erreur == 0) {
41
    digitalWrite(led.getPinLed(), HIGH);
42
    delay(1000);
43
    digitalWrite(led.getPinLed(), LOW);
44
    delay(1000);
45
  }
46
47
}
48
49
50