// ==========================================================
// ÉTAPE 1 : LES DICTIONNAIRES (Inclusion des Bibliothèques)
// On donne à l'Arduino les manuels d'instruction pour
// comprendre l'écran LCD et les sondes de température.
// ==========================================================
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// ==========================================================
// ÉTAPE 2 : RÉPERTOIRE DU MATÉRIEL (Les branchements)
// On définit physiquement où chaque fil est branché.
// ==========================================================
LiquidCrystal_I2C lcd(0x27, 20, 4);
#define PIN_TEMP_1 A2
#define PIN_TEMP_2 A3
OneWire oneWire1(PIN_TEMP_1);
OneWire oneWire2(PIN_TEMP_2);
DallasTemperature sensors1(&oneWire1);
DallasTemperature sensors2(&oneWire2);
// Liste des 8 prises (Digital Pins) pour les relais
const int pinRelais[] = {11, 10, 9, 8, 7, 6, 5, 4};
// ==========================================================
// ÉTAPE 3 : MÉMOIRE DU SYSTÈME (Les variables)
// Les informations que l'Arduino doit surveiller en temps réel.
// ==========================================================
bool systemeActif = false;
unsigned long dernierHeartbeat = 0;
float t1 = 0, t2 = 0;
// ==========================================================
// ÉTAPE 4 : RÉVEIL DU SYSTÈME (Le Setup)
// Configuration initiale (s'exécute une seule fois).
// ==========================================================
void setup() {
// Configurer les prises des relais comme des sorties et les éteindre
for (int i = 0; i < 8; i++) { // Pour les 8 broches de relais
pinMode(pinRelais[i], OUTPUT); // On assigne le mode OUTPUT à chacune de ces 8 broches
digitalWrite(pinRelais[i], LOW); // On s'assure que chacune des broches est à LOW (éteinte (OFF))
}
Serial.begin(9600); // 9600 bauds, Vitesse du port
// Initialisation de l'écran LCD
lcd.init();
lcd.backlight(); // Active le rétro éclairage
lcd.setCursor(0, 0); // Place le curseur au début (en haut à gauche) de l'écran
lcd.print("CIPPAD 03 - READY"); // Affiche un titre
sensors1.begin(); // Démarre la sonde 1
sensors2.begin(); // D.marre la sonde 2
// On envoie l'ID pour que le logiciel de l'ordinateur nous reconnaisse
delay(500);
// confirmation que Processing est bien en relation avec l'arduino...
Serial.println("CIPPAD_03"); // Réponse à la question de Processing (WHO ARE YOU?)
}
// ==========================================================
// ÉTAPE 5 : LA BOUCLE DE VIE (Le Loop)
// Le cerveau vérifie tout en boucle (plusieurs fois par seconde).
// ==========================================================
void loop() {
// SÉCURITÉ : Si on n'entend plus le PC depuis 3 secondes, on coupe tout
if (systemeActif && (millis() - dernierHeartbeat > 3000)) {
couperTout();
}
// ÉCOUTE : On regarde si l'ordinateur nous envoie un ordre
if (Serial.available() > 0) {
String cmd = Serial.readStringUntil('\n');
cmd.trim();
if (cmd == "WHO_ARE_YOU") {
Serial.flush();
Serial.println("CIPPAD_03");
systemeActif = true;
dernierHeartbeat = millis();
}
else if (cmd == "H") {
dernierHeartbeat = millis();
}
else if (cmd.startsWith("R")) {
int id = cmd.substring(1).toInt();
if (id >= 0 && id < 8) {
digitalWrite(pinRelais[id], !digitalRead(pinRelais[id]));
}
dernierHeartbeat = millis();
}
}
// ==========================================================
// ÉTAPE 6 : ENVOI DES DONNÉES AU PC
// Toutes les secondes, on mesure et on transmet.
// ==========================================================
if (systemeActif) {
static unsigned long lastUpdate = 0;
if (millis() - lastUpdate > 1000) {
sensors1.requestTemperatures();
sensors2.requestTemperatures();
t1 = sensors1.getTempCByIndex(0);
t2 = sensors2.getTempCByIndex(0);
Serial.print(t1, 1);
Serial.print(",");
Serial.println(t2, 1);
mettreAJourLCD();
lastUpdate = millis();
}
}
}
// ==========================================================
// ÉTAPE 7 : LES FONCTIONS DE SERVICE
// Actions spécifiques appelées par le programme principal.
// ==========================================================
void mettreAJourLCD() {
lcd.setCursor(1, 1); lcd.print("T1:"); lcd.print(t1, 1); lcd.print("C ");
lcd.setCursor(11, 1); lcd.print("T2:"); lcd.print(t2, 1); lcd.print("C ");
lcd.setCursor(0, 3); lcd.print("STATUS: EN LIGNE ");
}
void couperTout() {
systemeActif = false;
for (int i = 0; i < 8; i++) digitalWrite(pinRelais[i], LOW);
lcd.setCursor(0, 3);
lcd.print("SECURITE: PC_LOST ");
}Relais
Vibreur
Relais
Granules
Lcd_Menu