Exercice : Commande d'une pompe en mode interruptif

Simulateur

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

Description et fonctionnement

On souhaite améliorer l'automatisation de la pompe de l'exercice précédent en gérant les deux capteurs en mode interruptif

Cuve équipée d'une pompe et de deux capteurs de niveauInformations[1]

Question

Modifiez la dernière version en introduisant le mode interruptif pour la gestion des deux capteurs. La boucle void loop(){} sera vide

Solution

1
//On reprend ici la première version de commande de pompe, adaptée à l'utilisation des capteurs en mode interruptif. Attention : le câblage a changé, les capteurs doivent nécessairement être connectés sur les ports 2 et 3 (les seuls à être utilisables en mode interruptif) :
2
3
#define POMPE 13
4
#define CAPTEUR_HAUT 3
5
#define CAPTEUR_BAS 2
6
7
//Déclaration des classes
8
class Sensor{
9
  private:
10
  	byte pinNumber;
11
  	bool state;
12
  public:
13
  Sensor(int);
14
  bool getState();
15
};
16
class Pump{
17
  private:
18
    byte pinNumber;
19
  	bool state;
20
  public:
21
  Pump(int);
22
  void setState(bool);
23
  bool getState();
24
};
25
26
// Programme principal
27
Sensor sensorHaut(CAPTEUR_HAUT);
28
Sensor sensorBas(CAPTEUR_BAS);
29
Pump pump(POMPE);
30
void setup(){
31
32
  attachInterrupt(digitalPinToInterrupt(CAPTEUR_HAUT), TraitementCapteurHaut, RISING );//déclenchement sur front montant du capteur haut
33
34
  attachInterrupt(digitalPinToInterrupt(CAPTEUR_BAS), TraitementCapteurBas, FALLING ); //déclenchement sur front descendant du capteur bas
35
36
}
37
void loop()
38
{
39
 //La boucle principale est maintenant vide !
40
}
41
// Objets : définition des fonctions membres
42
Sensor::Sensor(int pin){ //Constructeur
43
  	pinNumber = pin;
44
	pinMode(pinNumber, OUTPUT);  
45
};
46
bool Sensor::getState(){ //permet d'obtenir l'état d'un capteur
47
  state=digitalRead(pinNumber);
48
  return(state);
49
};
50
Pump::Pump(int pin){ //Constructeur
51
  pinNumber = pin;
52
  pinMode(pinNumber, OUTPUT);
53
  digitalWrite(pinNumber,LOW);
54
};
55
void Pump::setState(bool state){//Fixe l'état de la pompe
56
  this->state = state;
57
  digitalWrite(pinNumber,this->state);
58
};
59
bool Pump::getState(){//permet d'obtenir l'état de la pompe
60
  return(this->state);
61
}
62
63
// Traitement des interruptions
64
void TraitementCapteurHaut(){
65
  pump.setState(HIGH);
66
  return;
67
}
68
void TraitementCapteurBas(){
69
  pump.setState(LOW);
70
  return;
71
}