// Lycée PE MARTIN
// Le 21/11/2023
// Titre : Aspiration centralisée V2
// Matériels : Arduino Uno, lcd 2x16 I2C, 2 led, 5 switchs et 2 boutons-poussoir
// sur Pull-Up interne
// Description : voir sujet du TP et https://bit.ly/2ysql1N
// Ressources
// bibliothèque : https://www.arduino.cc/reference/en/libraries/liquidcrystal/
// Vidéo : https://bit.ly/2ysql1N
// Bibliothèque
#include <LiquidCrystal_I2C.h>
// Entrées
#define E_P2 12
#define E_P3 10
#define E_P4 11
#define E_TP 9
#define E_P 8
#define E_BPM1 7
#define E_BPA1 6
// Sorties
#define S_LED_D1 3
#define S_LED_P1 2
#define I2C_ADDR 0x27
#define LCD_COLUMNS 16
#define LCD_LINES 2
// Constructeurs
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
// Variables globales
bool P1, X, Reset, Set, D1 = LOW;
int num_msg = 20;
int num_msg_1 = 30;
int pActifs = 0;
String message = "";
// Sous-programme
void Afficher(String message) {
lcd.clear();
lcd.print("Aspiration... ");
lcd.setCursor(0, 1);
lcd.print(message);
}
void setup() {
// Configuration des E/S
pinMode(E_P2, INPUT_PULLUP); pinMode(E_P3, INPUT_PULLUP);
pinMode(E_P4, INPUT_PULLUP); pinMode(E_TP, INPUT_PULLUP);
pinMode(E_P, INPUT_PULLUP); pinMode(E_BPM1, INPUT_PULLUP);
pinMode(E_BPA1, INPUT); pinMode(S_LED_D1, OUTPUT);
pinMode(S_LED_P1, OUTPUT);
lcd.init();
lcd.backlight();
lcd.print("Systeme ");
lcd.setCursor(0, 1);
lcd.print(" d'aspiration");
delay(3000);
lcd.clear();
lcd.print("Aspiration... ");
}
void loop() {
// Lecture des entrées
bool P2 = !digitalRead(E_P2);
bool P3 = !digitalRead(E_P3);
bool P4 = !digitalRead(E_P4);
bool TP = !digitalRead(E_TP);
bool P = !digitalRead(E_P);
bool BPM1 = !digitalRead(E_BPM1);
bool BPA1 = !digitalRead(E_BPA1);
// Traitement
X = (P2 && P3) || (P2 && P4) || (P3 && P4);
Reset = !BPA1 || TP || P;
Set = !X && BPM1;
P1 = (P1 || Set) && !Reset;
D1 = (X || TP || P) && BPM1;
// Conversion P4P3P2P1 -> pActifs
pActifs = 0; // Réinitialisé avant de faire le calcul
if (P1) pActifs = 1;
if (P2) pActifs = pActifs + 2;
if (P3) pActifs = pActifs + 4;
if (P4) pActifs = pActifs + 8;
// Ecriture sur les sorties
digitalWrite(S_LED_D1, D1);
digitalWrite(S_LED_P1, P1);
if (TP && P) {// Affichage des défauts prioritaire
message = "Vide & T. pleine";
num_msg = 102;
}
else if (P && !TP) { // Affichage des défauts prioritaire
message = "Vide trop pousse !";
num_msg = 100;
}
else if (TP && !P) { // Affichage défaut prioritaire
message = "Tremie pleine";
num_msg = 101;
}
else {
if (pActifs == 0) {
message = "P.Actif(s):aucun";
num_msg = 0;
}
else if (pActifs == 1) {
message = "Actif: Poste 1";
num_msg = 1;
}
else if (pActifs == 2) {
message = "Actif: Poste 2";
num_msg = 2;
}
else if (pActifs == 3) {
message = "Actifs: P1,P2";
num_msg = 3;
}
else if (pActifs == 4) {
message = "Actif: Poste 3";
num_msg = 4;
}
else if (pActifs == 5) {
message = "Actifs: P1,P3";
num_msg = 5;
}
else if (pActifs == 6) {
message = "Actifs: P2,P3";
num_msg = 6;
}
else if ((pActifs == 7) || (pActifs == 11) || (pActifs == 13) || (pActifs == 14) || (pActifs == 15)) {
message = "Err. Simul: > 2P";
num_msg = 7;
}
else if (pActifs == 8) {
message = "Actif: Poste 4";
num_msg = 8;
}
else if (pActifs == 9) {
message = "Actifs: P1,P4";
num_msg = 9;
}
else if (pActifs == 10) {
message = "Actifs: P2,P4";
num_msg = 10;
}
else if (pActifs == 12) {
message = "Actifs: P3,P4";
num_msg = 12;
}
}
// Affichage si le message envoyé est différent de celui affiché
if (num_msg != num_msg_1) {
Afficher(message);
num_msg_1 = num_msg;
}
}
P1
P2
P3
P4
P
TP
M1
A1
D1
R1
R2
R3
<< Aspiration centralisée V2 (Poste 1) >>
M1 : Activation de l'aspiration sur le Poste 1
A1 : Désactivation de l'aspiration sur le Poste 1
D1 : Défaut sur TP ou P
P1 : Etat de l'électrovanne du Poste 1
P2 : Simulation état électrovanne Poste 2
P3 : Simulation état électrovanne Poste 3
P4 : Simulation état électrovanne Poste 4
TP : Simulation trémie pleine sur Poste 1
P : Simulation vide trop poussé sur Poste 1
0
1