#include <LiquidCrystal.h>
// LCD 16x2
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// Pins
int ledVert = 6;
int ledJaune = 7;
int ledRouge = 8;
int buzzer = 9;
int boutonReset = 10;
int tempPin = A0; // potentiomètre température
int vibPin = A1; // potentiomètre vibration
// Variables
float temperature;
int vibration;
bool defaut = false;
bool machineON = true;
// Temps
unsigned long previousMillis = 0;
unsigned long previousLedMillis = 0;
unsigned long tempsON = 0;
unsigned long tempsAlerte = 0;
unsigned long debutDefaut = 0; // pour calculer 10s avant arrêt machine
// Durées
const unsigned long intervalleMesure = 1000; // 1s pour mesure
const unsigned long intervalleLED = 500; // 500ms pour clignotement
const unsigned long dureeArretMachine = 10000; // 10s avant arrêt
void setup() {
lcd.begin(16, 2);
pinMode(ledVert, OUTPUT);
pinMode(ledJaune, OUTPUT);
pinMode(ledRouge, OUTPUT);
pinMode(buzzer, OUTPUT);
pinMode(boutonReset, INPUT_PULLUP);
lcd.print("Systeme Pret");
delay(2000);
}
void loop() {
unsigned long currentMillis = millis();
// Lecture capteurs simulés
temperature = analogRead(tempPin) * 5.0 / 1023.0 * 100;
vibration = analogRead(vibPin);
// 🔹 Reset défaut
if (digitalRead(boutonReset) == LOW) {
beep(2000, 200);
defaut = false;
machineON = true;
tempsON = 0;
tempsAlerte = 0;
debutDefaut = 0;
}
// 🔹 Calcul temps chaque seconde (non-blocking)
if (currentMillis - previousMillis >= intervalleMesure) {
previousMillis = currentMillis;
if (!defaut) {
if (temperature < 40 && vibration < 500) tempsON++;
else if (temperature >= 40 && temperature < 60) tempsAlerte++;
}
}
// 🔹 Logique
if (temperature < 40 && vibration < 500 && !defaut) {
machineON = true;
debutDefaut = 0;
etatNormal();
}
else if ((temperature >= 40 && temperature < 60) && !defaut) {
machineON = true;
debutDefaut = 0;
etatAlerte();
}
else {
if (!defaut) debutDefaut = millis();
defaut = true;
// Arrêt machine après 10s
if (millis() - debutDefaut >= dureeArretMachine) machineON = false;
etatDefaut();
}
}
// ===== Fonctions =====
void etatNormal() {
digitalWrite(ledVert, HIGH);
digitalWrite(ledJaune, LOW);
digitalWrite(ledRouge, LOW);
noTone(buzzer);
lcd.setCursor(0,0);
lcd.print("NORMAL ON: "); // clear line
lcd.print(tempsON);
lcd.print("s");
lcd.setCursor(0,1);
lcd.print("Temp: ");
lcd.print((int)temperature);
lcd.print(" C "); // espace pour effacer anciens chiffres
}
void etatAlerte() {
digitalWrite(ledVert, LOW);
digitalWrite(ledJaune, HIGH);
digitalWrite(ledRouge, LOW);
// Buzzer intermittent
if ((millis() / 1000) % 2 == 0) tone(buzzer, 800);
else noTone(buzzer);
lcd.setCursor(0,0);
lcd.print("ALERTE: "); // clear line
lcd.print(tempsAlerte);
lcd.print("s");
lcd.setCursor(0,1);
lcd.print("Temp: ");
lcd.print((int)temperature);
lcd.print(" C ");
}
void etatDefaut() {
unsigned long currentMillis = millis();
// Clignotement LED Rouge + buzzer continu
if (currentMillis - previousLedMillis >= intervalleLED) {
previousLedMillis = currentMillis;
digitalWrite(ledRouge, !digitalRead(ledRouge));
tone(buzzer, 1000);
}
digitalWrite(ledVert, LOW);
digitalWrite(ledJaune, LOW);
lcd.setCursor(0,0);
if (!machineON) lcd.print("MACHINE STOP ");
else lcd.print("DEFAUT ACTIF ");
lcd.setCursor(0,1);
if (debutDefaut > 0 && machineON) {
int reste = (int)((dureeArretMachine - (millis() - debutDefaut)) / 1000);
if (reste < 0) reste = 0;
lcd.print("Stop in: ");
lcd.print(reste);
lcd.print(" s ");
} else {
lcd.print("Temp: ");
lcd.print((int)temperature);
lcd.print(" C ");
}
}
// ===== Fonction beep courte =====
void beep(int freq, int duree) {
tone(buzzer, freq);
delay(duree);
noTone(buzzer);
}