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

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
4
5
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
}