// Lycée PE MARTIN
// Le 21/11/2023
// Titre : Aspiration de copeaux
// 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

#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;
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;

  // 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 (!P4 && !P3 && !P2 && !P1) {
      message = "P.Actif(s):aucun"; 
      num_msg = 0;
    }
    else if (!P4 && !P3 && !P2 && P1) {
      message = "Actif: Poste 1"; 
      num_msg = 1;
    }
    else if (!P4 && !P3 && P2 && !P1) {
      message = "Actif: Poste 2"; 
      num_msg = 2;
    }
    else if (!P4 && !P3 && P2 && P1) {
      message = "Actifs: P1,P2"; 
      num_msg = 3;
    }
    else if (!P4 && P3 && !P2 && !P1) {
      message = "Actif: Poste 3";
      num_msg = 4;
    }
    else if (!P4 && P3 && !P2 && P1) {
      message = "Actifs: P1,P3"; 
      num_msg = 5;
    }
    else if (!P4 && P3 && P2 && !P1) {
      message = "Actifs: P2,P3"; 
      num_msg = 6;
    }
    else if (!P4 && P3 && P2 && P1) {
      message = "Err. Simul: > 2P"; 
      num_msg = 7;
    }
    else if (P4 && !P3 && !P2 && !P1) {
      message = "Actif: Poste 4"; 
      num_msg = 8;
    }
    else if (P4 && !P3 && !P2 && P1) {
      message = "Actifs: P1,P4"; 
      num_msg = 9;
    }
    else if (P4 && !P3 && P2 && !P1) {
      message = "Actifs: P2,P4"; 
      num_msg = 10;
    }
    else if (P4 && !P3 && P2 && P1) {
      message = "Err. Simul: > 2P"; 
      num_msg = 7;
    }
    else if (P4 && P3 && !P2 && !P1) {
      message = "Actifs: P3,P4"; 
      num_msg = 12;
    }
    else if (P4 && P3 && !P2 && P1) {
      message = "Err. Simul: > 2P"; 
      num_msg = 7;
    }
    else if (P4 && P3 && P2 && !P1) {
      message = "Err. Simul: > 2P"; 
      num_msg = 7;
    }
    else if (P4 && P3 && P2 && P1) {
      message = "Err. Simul: > 2P"; 
      num_msg = 7;
    }
  }
  // Assure la stabilité de l'affichage
  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