//définition des dependances
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define DHTUP 10 // PIN capteur haut
#define DHTBOT 11 // PIN capteur bas
#define DHTTYPE DHT22 // DHT 22 (AM2302)
LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 20 chars and 4 line display
DHT dht_up(DHTUP, DHTTYPE);
DHT dht_bot(DHTBOT, DHTTYPE);
//Déclaration des timer
unsigned long Ventil_B;
unsigned long Ventil_Hygro;
unsigned long SCC_Timer; //Variable timer anti cycle court
unsigned long SCC_Timer_Start; // Variable de référence timer anti cycle court
unsigned long Door_Open_Timer;
unsigned long Door_Open;
// Déclaration des PINs
const int Door_Switch = 2;
const int Internal_Light = 3;
const int Compressor = 4;
const int Main_Ventil = 5;
const int Ventil_HRDown = 6;
const int Ventil_HRup = 7;
const int HRdown_Mod = 8;
const int HRup_Mod = 9;
const int Alarm_Buzzer = 13;
//Decalration des variabels
int Door_Alarm_Time = 10000; // Déclaration seuil alarme porte
int SCC_Timer_Treshold = 10000; // décalaration seuil anti cycle court (10 secondes pour les tests)
int Up_Delta = 2; // définition du seuil haut de déclenchement production de froid
int Down_Delta = 1; // définition du delta bas pour l'arrêt de la production de froid
int consigne_Temp = 12; // définition de la température de consigne
int Temp_Haute = consigne_Temp + Up_Delta;
int Temp_Basse = consigne_Temp - Down_Delta;
int Temp_Delta = 1; // Delta temp admissible entre capteur température haut et bas
float Temp_Calibration = 0.25;
// gestion des consgines hautes et basses de gestion hygrometrie
int consigne_HR = 70;
int HRup_Low_Delta = 5;
int HR_High_Delta = 5;
int Hygro_High = consigne_HR + HR_High_Delta;
int Hygro_Low = consigne_HR - HRup_Low_Delta;
byte Door_Status;
byte Door_Status_Mem;
float Temp_H;
float Temp_B;
float Hygro_H;
float Hygro_B;
float DHT_Ctrl_H;
float DHT_Ctrl_B;
enum Status {ON, OFF};
Status Comp = OFF;
Status Ventil = OFF;
Status HRup = OFF;
Status HRDown = OFF;
//------------------------------------------------------------------------------------------------
// DEMARRAGE DU SETUP
//------------------------------------------------------------------------------------------------
void setup() {
//Déclaration des types IO pins
pinMode(Door_Switch, INPUT);
pinMode(Internal_Light, OUTPUT);
pinMode(Compressor, OUTPUT);
pinMode(Main_Ventil, OUTPUT);
pinMode(Ventil_HRDown, OUTPUT);
pinMode(Ventil_HRup, OUTPUT);
pinMode(HRdown_Mod, OUTPUT);
pinMode(HRup_Mod, OUTPUT);
pinMode(DHTUP, INPUT);
pinMode(DHTBOT, INPUT);
pinMode(Alarm_Buzzer, OUTPUT);
//démarrage port série
Serial.begin(9600);
//intitialisation capteur de mesure temp & hygro
dht_up.begin();
dht_bot.begin();
//intialisation écran
lcd.init(); // initialize the lcd
lcd.backlight(); // Turns on the backlight Led (the lcd will operate even with Bklight Off)
// SPLASH SCREEN
lcd.setCursor(3,0);
lcd.print("CURING CABINET");
lcd.setCursor(1,2);
lcd.print("O'STEEN'S WORKSHOP");
delay(3000);
lcd.clear();
//init état des sorties
digitalWrite(Internal_Light, LOW);
digitalWrite(Compressor, LOW);
digitalWrite(Main_Ventil, LOW);
digitalWrite(Ventil_HRDown, LOW);
digitalWrite(Ventil_HRup, LOW);
digitalWrite(HRdown_Mod, LOW);
digitalWrite(HRup_Mod, LOW);
digitalWrite(Alarm_Buzzer, LOW);
//contrôle premier état porte pour éclairage
if (digitalRead(Door_Switch) == HIGH) {
digitalWrite(Internal_Light, HIGH);
}
Door_Status = digitalRead(Door_Switch);
Door_Status_Mem = Door_Status;
// démarrage compteur de référence anti cycle court
SCC_Timer = millis();
SCC_Timer_Start = SCC_Timer;
}
//------------------------------------------------------------------------------------------------
// DEMARRAGE DE LA BOUCLE
//------------------------------------------------------------------------------------------------
void loop() {
// Lecture des états des capteurs et siwtchs
Door_Status = digitalRead(Door_Switch);
SCC_Timer = millis();
//lecture des valeurs de températures et hygrométrie
Temp_H = dht_up.readTemperature();
Temp_B = dht_bot.readTemperature();
Hygro_H = dht_up.readHumidity();
Hygro_B = dht_bot.readHumidity();
DHT_Ctrl_H = dht_up.readTemperature(true);
DHT_Ctrl_B = dht_bot.readTemperature(true);
// Boucle de contrôle état des capteurs
if (isnan(Temp_H) || isnan(Hygro_H) || isnan(DHT_Ctrl_H)) {
Serial.println("Failed to read from upper DHT sensor!");
return;
}
if (isnan(Temp_B) || isnan(Hygro_B) || isnan(DHT_Ctrl_B)) {
Serial.println("Failed to read from lower DHT sensor!");
return;
}
//------------------------------------------------------------------------------------------------
// GESTION DE LA TEMPERATURE
//------------------------------------------------------------------------------------------------
//Correction du delta de valeur des deux capteurs
Temp_B = Temp_B + Temp_Calibration;
// si Température basse > consigne + seuil haut ==> démarrer compresseur
if (Temp_B > Temp_Haute && SCC_Timer - SCC_Timer_Start > SCC_Timer_Treshold && digitalRead(Compressor) == LOW) {
Temp_Reduce();
}
//consigne d'arrêt du compresseur
else if (Temp_B <= Temp_Basse + 2 && digitalRead(Compressor) == HIGH) {
digitalWrite(Compressor, LOW);
digitalWrite(Main_Ventil, LOW);
SCC_Timer_Start = millis();
}
//Gestion du brassage de l'air à l'intérieur de la cellule
if (Temp_B - Temp_H > Temp_Delta && digitalRead(Main_Ventil) == LOW) {
digitalWrite(Main_Ventil, HIGH); // démarrer brassage air
}
else if (Temp_B - Temp_H <= Temp_Delta && digitalRead(Main_Ventil) == HIGH) {
digitalWrite(Main_Ventil, LOW);
}
// si temp haute - temp basse =< 0 ==> arrêt brassage air
// si hygro haute > hygro_basse + x%, démarrage brassage air
//------------------------------------------------------------------------------------------------
// GESTION DE LA PORTE
//------------------------------------------------------------------------------------------------
//si porte ouverte ==>
if ( Door_Status != Door_Status_Mem && Door_Status == LOW) {
Door_Opened();
Door_Open = millis(); // timer porte ouverte
Door_Open_Timer = Door_Open;
Door_Status_Mem = Door_Status;
}
if (Door_Open - Door_Open_Timer >= Door_Alarm_Time) {
digitalWrite(Alarm_Buzzer, HIGH);
}
//Détection de la fermeture de la porte
if (Door_Status != Door_Status_Mem && Door_Status == HIGH) {
Door_Closed();
}
//------------------------------------------------------------------------------------------------
// GESTION DE L'HYGROMETRIE
//------------------------------------------------------------------------------------------------
if (Hygro_H > Hygro_High && digitalRead(HRdown_Mod) == LOW ) {
Reduce_Hygro();
}
else if (Hygro_H <= Hygro_Low + 2 && digitalRead(HRdown_Mod) == HIGH) {
digitalWrite(HRdown_Mod, LOW);
digitalWrite(Ventil_HRDown, LOW);
}
else if (Hygro_H < Hygro_Low && digitalRead(HRup_Mod) == LOW) {
Add_Hygro();
}
else if (Hygro_H >= Hygro_High - 2 && digitalRead(HRup_Mod) == HIGH) {
digitalWrite(HRup_Mod, LOW);
digitalWrite(Ventil_HRup, LOW);
}
// arrêt et initialisation timer deshygro
// si timer hygro == limite haute
// buzzer + alarme hygro haute
Serial.print(SCC_Timer);
Serial.print("\t");
Serial.print(SCC_Timer_Start);
Serial.print("\t");
//------------------------------------------------------------------------------------------------
// GESTION DE L'HYGROMETRIE
//------------------------------------------------------------------------------------------------
Display_Data();
}
void Door_Opened() {
digitalWrite(Internal_Light, HIGH); // - allumage éclairage
digitalWrite(Main_Ventil, LOW);
if (Ventil_HRDown == HIGH) { // - si deshumidification = high ==> arrêt
digitalWrite(Ventil_HRDown, LOW);
digitalWrite(HRdown_Mod, LOW);
}
if (HRup == true) { // - si humidification = high ==> arrêt
digitalWrite(Ventil_HRup, LOW);
digitalWrite(HRup_Mod, LOW);
}
// - si deshumdifiateur ON ==> arrêt ventilo hygrodown + peltier
// - si humdificateur ON ==> arrêt ventilo + module US
// - si porte ouverte plus de 1 min => buzzer + arrêt compresseur (démarrage timer anti cycle court)
}
void Door_Closed () {
digitalWrite(Internal_Light, LOW); // - allumage éclairage
digitalWrite(Main_Ventil, HIGH);
/*
Reste à décider s'il faut conserver les états précédents au moment de l'ouverture pour les réappliquer au moment de la fermeture de la porte
*/
}
void Reduce_Hygro() {
// si hygro DHT haut > consigne + seuil
digitalWrite(HRdown_Mod, HIGH);
digitalWrite(Ventil_HRDown, HIGH);
}
void Add_Hygro() {
digitalWrite(HRup_Mod, HIGH);
digitalWrite(Ventil_HRup, HIGH);
}
void Temp_Reduce() {
digitalWrite(Compressor, HIGH);
digitalWrite(Main_Ventil, HIGH);
}
void Display_Data() {
lcd.setCursor(0,0);
lcd.print("TEMPERATURE");
lcd.setCursor(0,1);
lcd.print(Temp_H);
lcd.setCursor(6,1);
lcd.print(char(223));
lcd.setCursor(7,1);
lcd.print("C");
lcd.setCursor(12,0);
lcd.print("CONSIGNE");
lcd.setCursor(12,1);
lcd.print(consigne_Temp);
lcd.setCursor(15,1);
lcd.print(char(223));
lcd.setCursor(16,1);
lcd.print("C");
//Hygro haut
lcd.setCursor(0,2);
lcd.print("HYGROMETRIE");
lcd.setCursor(12,2);
lcd.print("CONSIGNE");
lcd.setCursor(0,3);
lcd.print(Hygro_B);
lcd.setCursor(6,3);
lcd.print("%HR");
lcd.setCursor(12,3);
lcd.print(consigne_HR);
lcd.setCursor(15,3);
lcd.print("%HR");
}