#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Bounce2.h>
#include <SD.h>
#define THERMISTOR_D1 A0
#define THERMISTOR_D2 A1
#define THERMISTOR_D3 A2
#define THERMISTOR_D4 A3
#define THERMISTOR_P1 A4
#define THERMISTOR_P2 A5
#define THERMISTOR_P3 A6
#define THERMISTOR_P4 A7
#define THERMISTOR_AMBIN A8
#define THERMISTOR_AMBOUT A9
#define THERMISTOR_HOOD A10
#define THERMISTOR_HEAT1 A11
#define THERMISTOR_HEAT2 A12
#define THERMISTOR_BOX A13
LiquidCrystal_I2C lcdD(0x27, 20, 4); // Premier écran
LiquidCrystal_I2C lcdP(0x26, 20, 4); // Deuxième écran
const int ledAPin = 23;
const int ledBPin = 25;
const int ledCPin = 27;
const int ledDPin = 29;
const int ledEPin = 31;
const int ledFPin = 33;
const int ledGPin = 35;
const int switchSingle = 9; // Interrupteur ON/OFF
const int switchAlternate = 8;
const int buttonPinDRIVER = 11;
const int buttonPinPASS = 10;
const int buttonHeat = 12;
const int buttonRecord = 13; // 11
const int ledHeat = 6;//12
const int ledRecord = 7;//10
const int ledAlternate = 4;
const int ledSingle = 5;
const int chipSelect = 53;
//const int buttonPin = 12; // Broche du bouton-poussoir lecture carte sd
int binaryCodeDRIVER = 0;
int binaryCodePASS = 0;
//int switchState2 = digitalRead(buttonRecord);
int switchState = digitalRead(switchSingle);
int switchState2 = digitalRead(switchAlternate);
int previousSwitchState2 = LOW;
File root;
File file;
bool displayFiles = false;
bool previousSwitchState = HIGH;
bool buttonWasPressedDRIVER = false;
bool buttonWasPressedPASS = false;
bool buttonWasPressedLED37 = false;
//bool buttonWasPressedLED39 = false;
Bounce button; // C'est pour le bouton-poussoir de la carte SD
Bounce buttonDRIVER;
Bounce buttonPASS;
//Bounce buttonLED37;
//Bounce buttonLED39;
float readTemperature(int thermistorPin) {
int rawADC = analogRead(thermistorPin);
float resistance = 10000.0 / ((1023.0 / rawADC) - 1);
float temperature = 1.0 / ((1.0 / 298.15) + (1.0 / 3950.0) * log(resistance / 10000.0)) - 273.15;
return temperature;
}
// Tableaux de messages pour les états du code binaire DRIVER en fonction de l'état de l'interrupteur ON/OFF
String messagesDRIVER_0[8] = {//Dual 1er
" (OFF) ",
"25% 1250ms(ON)/5sec ",
"50% 2500ms(ON)/5sec ",
"25% 250ms(ON)/1sec ",
"50% 500ms(ON)/1sec ",
" (OFF) 3",
" (OFF) 2",
" (OFF) 1"
};
String messagesDRIVER_1[8] = {//Single 1er
" (OFF) //",//État 000
"25%(5sec)//" ,//État 001
"50%(5sec)//",//État 010
"75%(5sec)//",//État 011
"25%(1sec)//",//État 100
"50%(1sec)//",//État 101
"75%(1sec)//",//État 110
" 100% ON //"//État 111
};
// Tableaux de messages pour les états du code binaire PASS en fonction de l'état de l'interrupteur ON/OFF
String messagesPASS_0[8] = {//Dual 2e
"",//État 000
"",//État 001
"",//État 010
"",//État 11
"",//État 100
};
String messagesPASS_1[8] = {//Single 2e
" (OFF) ",//État 000
"25%(5sec)" ,//État 001
"50%(5sec) ",//État 010
"75%(5sec) ",//État 011
"25%(1sec) ",//État 100
"50%(1sec) ",//État 101
"75%(1sec) ",//État 110
" 100% ON "//État 111
};
// Déclaration des variables de température
float TempD1;
float TempD2;
float TempD3;
float TempD4;
float TempP1;
float TempP2;
float TempP3;
float TempP4;
float TempAMBIN;
float TempAMBOUT;
float TempHOOD;
float TempHEAT1;
float TempHEAT2;
float TempBOX;
void setup() {
Serial.begin(9600);
pinMode(ledAPin, OUTPUT);
pinMode(ledBPin, OUTPUT);
pinMode(ledCPin, OUTPUT);
pinMode(ledDPin, OUTPUT);
pinMode(ledEPin, OUTPUT);
pinMode(ledFPin, OUTPUT);
pinMode(ledGPin, OUTPUT);
pinMode(ledHeat, OUTPUT);
pinMode(ledRecord, OUTPUT);
pinMode(ledSingle, OUTPUT);
pinMode(ledAlternate, OUTPUT);
pinMode(switchSingle, INPUT_PULLUP); // Lire l'interrupteur ON/OFF LUI OK
pinMode(switchAlternate, INPUT_PULLUP);
pinMode(buttonPinDRIVER, INPUT_PULLUP);
pinMode(buttonPinPASS, INPUT_PULLUP);
pinMode(buttonHeat, INPUT_PULLUP);
pinMode(buttonRecord, INPUT_PULLUP);//LUI fonctionne mal
buttonDRIVER.attach(buttonPinDRIVER);
buttonDRIVER.interval(5);
buttonPASS.attach(buttonPinPASS);
buttonPASS.interval(5);
//LCD DRIVER
lcdD.init();
lcdD.backlight();
lcdD.setCursor(0, 1);
lcdD.print(" D1:");
lcdD.setCursor (11,1);
lcdD.print(" D2:");
lcdD.setCursor(0, 2);
lcdD.print(" D3:");
lcdD.setCursor(11, 2);
lcdD.print(" D4:");
lcdD.setCursor(0, 3);
lcdD.print(" IN:");
//LCD PASSENGER
lcdP.init();
lcdP.backlight();
lcdP.setCursor(0, 1);
lcdP.print(" P1:");
lcdP.setCursor (11,1);
lcdP.print(" P2:");
lcdP.setCursor(0, 2);
lcdP.print(" P3:");
lcdP.setCursor(11, 2);
lcdP.print(" P4:");
lcdP.setCursor(0, 3);
lcdP.print("OUT:");
//FIN LCD
}
void loop() {
TempD1 = readTemperature(THERMISTOR_D1);
TempD2 = readTemperature(THERMISTOR_D2);
TempD3 = readTemperature(THERMISTOR_D3);
TempP1 = readTemperature(THERMISTOR_P1);
TempP2 = readTemperature(THERMISTOR_P2);
TempP3 = readTemperature(THERMISTOR_P3);
TempAMBIN = readTemperature(THERMISTOR_AMBIN);
TempAMBOUT = readTemperature(THERMISTOR_AMBOUT);
TempHEAT1 = readTemperature(THERMISTOR_HEAT1);
TempHEAT2 = readTemperature(THERMISTOR_HEAT2);
TempBOX = readTemperature(THERMISTOR_BOX);
//ÉCRITURE TEMPÉRATURE DRIVER + TEMP OUT + TEMP HOOD
lcdD.setCursor(4, 1);
lcdD.print(TempD1, 1);
lcdD.setCursor(15, 1);
lcdD.print(TempD2, 1);
lcdD.setCursor(4, 2);
lcdD.print(TempD3, 1);
lcdD.setCursor(15, 2);
lcdD.print(TempD4, 1);
lcdD.setCursor(4, 3);
lcdD.print(TempAMBOUT, 1);
//ÉCRITURE TEMPÉRATURE PASSENGER + TEMP IN
lcdP.setCursor(4, 1);
lcdP.print(TempP1, 1);
lcdP.setCursor(15, 1);
lcdP.print(TempP2, 1);
lcdP.setCursor(4, 2);
lcdP.print(TempP3, 1);
lcdP.setCursor(15, 2);
lcdP.print(TempP4, 1);
lcdP.setCursor(4, 3);
lcdP.print(TempAMBIN, 1);
/*
lcdP.setCursor(4, 0);
lcdP.print(TempD1, 1);
lcdP.setCursor(4, 1);
lcdP.print(TempD2, 1);
lcdP.setCursor(4, 2);
lcdP.print(TempD3, 1);
lcdP.setCursor(4, 3);
lcdP.print(TempAMBIN, 1);
lcdP.setCursor(14, 0);
lcdP.print(TempP1, 1);
lcdP.setCursor(14, 1);
lcdP.print(TempP2, 1);
lcdP.setCursor(14, 2);
lcdP.print(TempP3, 1);
lcdD.setCursor(4, 3);
lcdD.print(TempHEAT1, 1);
lcdP.setCursor(14, 3);
lcdP.print(TempHEAT2, 1);
lcdD.setCursor(14, 3);
lcdD.print(TempAMBOUT, 1);
*/
if (digitalRead(switchSingle) == HIGH) {
digitalWrite(ledSingle, HIGH);
// startRecording();
} else {
// stopRecording(); // Appel de la fonction pour arrêter l'enregistrement
digitalWrite(ledSingle, LOW);
}
if (digitalRead(switchAlternate) == HIGH) {
digitalWrite(ledAlternate, HIGH);
// startRecording();
} else {
// stopRecording(); // Appel de la fonction pour arrêter l'enregistrement
digitalWrite(ledAlternate, LOW);
}
//Boutton & led Record
if (digitalRead(buttonRecord) == HIGH) {
digitalWrite(ledRecord, HIGH);
// startRecording();
} else {
// stopRecording(); // Appel de la fonction pour arrêter l'enregistrement
digitalWrite(ledRecord, LOW);
}
// Bouton & led Heat
if (digitalRead(buttonHeat) == HIGH) {
digitalWrite(ledHeat, HIGH);
// startRecording();
} else {
// stopRecording(); // Appel de la fonction pour arrêter l'enregistrement
digitalWrite(ledHeat, LOW);
}
// Gestion du bouton-poussoir (broche 12) pour basculer entre l'affichage des fichiers et la lecture des températures
button.update();
if (button.fell()) {
displayFiles = !displayFiles;
}
// Lire l'état de l'interrupteur ON/OFF
int switchState = digitalRead(switchSingle);
int switchState2 = digitalRead(buttonRecord);
buttonDRIVER.update();
int buttonStateDRIVER = buttonDRIVER.read();
buttonPASS.update();
int buttonStatePASS = buttonPASS.read();
//buttonLED37.update();
//int buttonStateLED37 = buttonLED37.read();
// buttonLED39.update();
// int buttonRecord = buttonRecord.read();
// Vérifier si l'état de l'interrupteur a changé et réinitialiser les codes binaires si c'est le cas
if (switchState != previousSwitchState) {
binaryCodeDRIVER = 0;
binaryCodePASS = 0;
}
previousSwitchState = switchState;
// Led blanche pour sélection single ou alternate
if (switchState == LOW) {
digitalWrite(ledAPin, HIGH);
//lcdD.setCursor(0, 0);
//lcdD.print("ALTERN:");
//lcdP.setCursor(0, 0);
//lcdP.print("ALTERNATE");
} else {
digitalWrite(ledAPin, LOW);
//digitalWrite(ledAPin, LOW);
//lcdD.setCursor(0, 0);
//lcdD.print("SINGLE:");
//lcdP.setCursor(0, 0);
//lcdP.print("SINGLE:");
}
// Incrémenter le code binaire DRIVER lorsque le bouton est pressé (détection de front montant)
if (buttonStateDRIVER == LOW && !buttonWasPressedDRIVER) {
binaryCodeDRIVER++;
if (binaryCodeDRIVER > 7) {
binaryCodeDRIVER = 0;
}
buttonWasPressedDRIVER = true;
}
if (buttonStateDRIVER == HIGH) {
buttonWasPressedDRIVER = false;
}
// Incrémenter le code binaire PASS lorsque le bouton est pressé (détection de front montant)
if (buttonStatePASS == LOW && !buttonWasPressedPASS) {
binaryCodePASS++;
if (binaryCodePASS > 7) {
binaryCodePASS = 0;
}
buttonWasPressedPASS = true;
}
if (buttonStatePASS == HIGH) {
buttonWasPressedPASS = false;
}
//Affichage passenger
if (switchState == HIGH) {
lcdP.setCursor(0, 0);
lcdP.print(messagesPASS_1[binaryCodePASS]);
lcdD.setCursor(0, 0);
lcdD.print(messagesDRIVER_1[binaryCodeDRIVER]);
} else {
lcdP.setCursor(0, 0);
lcdP.print("ALTERNATE ");
lcdD.setCursor(0, 0);
lcdD.print(messagesDRIVER_0[binaryCodeDRIVER]);
}
/*
// Affichage du code binaire pour les LEDs DRIVER en fonction de l'état de l'interrupteur ON/OFF
if (switchState == LOW) {
lcdD.setCursor(0, 0);
lcdD.print(messagesDRIVER_0[binaryCodeDRIVER]);
lcdP.setCursor(0, 0);
lcdP.print("test");
//lcdP.print(messagesPASS_0[binaryCodePASS]);
} else {
lcdD.setCursor(0, 0);
lcdD.print(messagesDRIVER_1[binaryCodeDRIVER]);
}
// Affichage du code binaire pour les LEDs PASS en fonction de l'état de l'interrupteur ON/OFF
if (switchState == HIGH) {
lcdP.setCursor(0, 0);
//lc
lcdP.print(messagesPASS_0[binaryCodePASS]);
} else {
lcdD.setCursor(0, 0);
lcdD.print(messagesPASS_1[binaryCodePASS]);
}
*/
// Contrôle des LED BCD (ledBPin, ledCPin, ledDPin) en fonction du code binaire
digitalWrite(ledBPin, (binaryCodeDRIVER & 0x01));
digitalWrite(ledCPin, (binaryCodeDRIVER & 0x02) >> 1);
digitalWrite(ledDPin, (binaryCodeDRIVER & 0x04) >> 2);
// Contrôle des LED EFG (ledEPin, ledFPin, ledGPin) en fonction du code binaire
digitalWrite(ledEPin, (binaryCodePASS & 0x01));
digitalWrite(ledFPin, (binaryCodePASS & 0x02) >> 1);
digitalWrite(ledGPin, (binaryCodePASS & 0x04) >> 2);
}