// BIBLIOTHEQUE #include #include #include // INITIALISATION DES PINS // Pins Capteurs Températures #define DHT_1 10 #define DHT_2 12 // Pins Capteur CO2 #define MQ_135 A1 // Pins Leds #define led_Red_T 28 #define led_Yellow_T 31 #define led_Green 32 #define led_Yellow 35 #define led_Red 36 // Pins Ventilateurs (Pins PWM) #define Vent 8 // Pins Lampes Halogène (Pins PWM) #define Lamp_1 2 #define Lamp_2 4 #define Lamp_3 6 // Pins Boutons Poussoirs #define BP_1 39 // Pour faire défiler les infos sur l'écran LCD #define BP_2 40 // Pour activer le retournement des oeufs lorsqu'on est en mode manuel, = à faire toute les heures globalement // Pins Commutateurs #define Commu_1 47 // FOnctionnement normal ou démarrage #define Commu_2 48 // Fonctionnement en mode manuel ou automatique // Pins Capteur Ultrason #define Echo 24 #define Trig 27 // INITIALISATION DES COMPOSANTS //Initialisation écran LCD LiquidCrystal_I2C lcd(0x27, 16, 2); //16 Colonnes 2 Lignes //Initialisation Capteurs Temp. et Hum. DHT dht1 ( DHT_1, DHT22 ); DHT dht2 ( DHT_2, DHT22 ); //Utilisation de 2 DHT 22 // CONSTANTES #define tempo_1 300 // 5 minutes de délai pour l'ajustement du chauffage #define tempo_2 300 #define tempo_3 3600 // 1h de délai entre le basculement des plateaux #define tempo_4 1 // une seconde, délai pour les boutons poussoirs // VARIABLES // Variable Température et Humidité float temp_int_1; float temp_int_2; float temp_moyen = 0.0 ; //Moyenne des deux temp. float t_set = 37.5; float temp_limit_1 = 0.7; float temp_limit_2 = 1.9; // Les lampes ne fonctionnent pas à pleine capacité int chauffe_max = 170; // Variable Humidité float hum_1; float hum_2; float hum_moyen = 0.0 ; //Moyenne des deux hum. int hum_limit_1 = 40; int hum_limit_2 = 55; // Variable CO2 int CO2_value; int CO2_limit_1 = 5000; int CO2_limit_2 = 10000; // Variable Bouton Switch int BP_Switch_1 = 1; int BP_Switch_2 = 1; int BP_bool_1; int BP_bool_2; // Variable Statue Led int ledState = LOW; bool clignote = LOW; // Variable Position Plateau bool Fonctionnement; // ajout de ce mode pour le 2e commutateur --> Commu_1 bool Automatique; // associé au Commutateur 2 // Variable Capteur Position long lecture_echo; long cm; // Variable Démarrage int x = 1; // Variable de Temps //Temperatures clocks unsigned long t_temperature = 0; unsigned long t_bouton = 0; unsigned long t_humidity = 0; unsigned long time_t = 0; unsigned long t_motor = 0; //Leds clocks unsigned long previousMillis = 0; unsigned long currentMillis = 0; //////////////////////////////////////////////////////////////////////// void setup() { // INITIALISATION LCD lcd.init(); lcd.backlight(); // INITIALISATION DHT dht1.begin(); dht2.begin(); // INITIALISATION LAMPES ET VENTILATEURS pinMode(2, OUTPUT); pinMode(4, OUTPUT); pinMode(6, OUTPUT); pinMode(8, OUTPUT); // INITIALISATION LEDs pinMode(led_Red_T, OUTPUT); pinMode(led_Red, OUTPUT); pinMode(led_Yellow_T, OUTPUT); pinMode(led_Green, OUTPUT); pinMode(led_Yellow, OUTPUT); // INITIALISATION BPs pinMode(BP_1, INPUT); pinMode(BP_2, INPUT); // INITIALISATION Commutateurs pinMode(Commu_1, INPUT); pinMode(Commu_2, INPUT); // INITIALISATION Capteur Position //pinMode(Trig, OUTPUT); //pinMode(Echo, INPUT); //digitalWrite(Trig, LOW); // INITIALISATION MONITEUR POUR FAIRE LES TESTS Serial.begin(9600); } //////////////////////////////////////////////////////////////////////// void loop() { // FONCTION BLINK POUR TOUTES LES LEDS currentMillis = millis(); if (currentMillis - previousMillis >= 1000) { previousMillis = currentMillis; if (ledState == LOW) { ledState = HIGH; } else { ledState = LOW; } } if (digitalRead(Commu_1) == LOW) { // MODE DEMARRAGE digitalWrite(led_Red, HIGH); // Indicateur du mode démarrage Fonctionnement = LOW; // FONCTION DEMARRAGE //Allumage de la couveuse // Premiere Chauffe : montée jusque signal PWM = 170. Puis garder un chauffage constant jusqu'à atteindre T_set if ( x != chauffe_max ) { for ( x = 0; x < chauffe_max ; x++) { analogWrite(Lamp_1, x); analogWrite(Lamp_2, x); analogWrite(Lamp_2, x); } } if ( temp_moyen >= t_set ) { analogWrite(Lamp_1, 0); analogWrite(Lamp_2, 0); analogWrite(Lamp_3, 0); } } if (digitalRead(Commu_1) == HIGH) { // MODE NORMAL Fonctionnement = HIGH; // FONCTION TIME time_t = millis() / 1000; // RETOURNEMENT DES OEUFS : pour le moment non-fonctionnel //Capteur Position // pour le moment non-placé /* digitalWrite(Trig, HIGH); delayMicroseconds(10); digitalWrite(Trig, LOW); lecture_echo = pulseIn(Echo,HIGH); cm = lecture_echo /58; Serial.println(cm); */ //Moteur Memoire Position //Automatique if (digitalRead(Commu_2) == LOW) { Automatique = LOW; if ( time_t >= t_motor + tempo_3 ) { // attente de 1h entre les pivots // Commander le pivot du système dans le sens voulu : non-implémenté } t_motor = time_t; } //Manuel if (digitalRead(Commu_2) == HIGH) { Automatique = HIGH; if (BP_bool_1 == HIGH) { if (BP_Switch_1 == 1) { // Commander de tourner dans un sens } if (BP_Switch_1 == 2) { // Commander de tourner dans l'autre sens } } } // CONTRÔLE TEMPERATURE // Capteur température temp_int_1 = dht1.readTemperature(); temp_int_2 = dht2.readTemperature(); // Moyenne capteurs T° temp_moyen = (temp_int_1 + temp_int_2) / 2; // Fonction température if ( time_t >= t_temperature + tempo_1 ) { // ajuster toutes les 5 minutes if ( ( t_set - temp_moyen ) >= temp_limit_1 ) {// si la 1er limite inférieure est dépassé // Affichage led digitalWrite(led_Yellow_T, LOW); digitalWrite(led_Yellow_T, ledState); // clignote // Chauffe analogWrite(Lamp_1, 127); analogWrite(Lamp_2, 127); analogWrite(Lamp_3, 127); } if ( ( temp_moyen - t_set ) >= temp_limit_1 ) {// si la 1er limite supérieure est dépassé // Affichage led digitalWrite(led_Red_T, LOW); digitalWrite(led_Red_T, ledState); // clignote // Eteindre chauffage analogWrite(Lamp_1, 0); analogWrite(Lamp_2, 0); analogWrite(Lamp_3, 0); } } // Ajuster dès que ces limites problématiques sont dépassées if ( ( t_set - temp_moyen ) >= temp_limit_2 ) {// si la 2e limite inférieure est dépassée // Affichage led digitalWrite(led_Yellow_T, LOW); digitalWrite(led_Yellow_T, HIGH); // Mise en chauffe analogWrite(Lamp_1, 255); // Attention de pas monter d'un coup! analogWrite(Lamp_2, 255); analogWrite(Lamp_3, 255); } if ( ( temp_moyen - t_set ) >= temp_limit_2 ) {// si la 2e limite supérieure est dépassée // Affichage led digitalWrite(led_Red_T, LOW); digitalWrite(led_Red_T, HIGH); // Mise en chauffe analogWrite(Lamp_1, 0); analogWrite(Lamp_2, 0); analogWrite(Lamp_3, 0); } if (t_set == temp_moyen) { analogWrite(Lamp_1, 0); analogWrite(Lamp_2, 0); analogWrite(Lamp_3, 0); } t_temperature = time_t; // CONTRÔLE HUMIDITE // Capteur Humidité hum_1 = dht1.readHumidity(); hum_2 = dht2.readHumidity(); hum_moyen = ( hum_1 + hum_2 ) /2; // Fonction Humidité if (time_t >= t_humidity + tempo_2 ) { if ((hum_moyen >= hum_limit_1) && (hum_moyen <= hum_limit_2)) { // RàS, dans le range voulu digitalWrite(led_Green, LOW); clignote = LOW; } if ((hum_moyen > hum_limit_2)) { // LED allumée si RH trop élevé digitalWrite(led_Green, HIGH); clignote = LOW; } if ((hum_moyen < hum_limit_1)) { // LED clignote si RH trop faible clignote = HIGH; } t_humidity = time_t; } if (clignote == HIGH) { digitalWrite(led_Green, ledState); } // CONTRÔLE CO2 /!\ Capteur calibré mais ne semble pas très performant.. //Capteur CO2 CO2_value = analogRead(MQ_135); if ((CO2_value >= CO2_limit_1) && (CO2_value < CO2_limit_2)) { digitalWrite(led_Yellow, ledState); } if ((CO2_value >= CO2_limit_2)) { digitalWrite(led_Yellow, HIGH); } if ((CO2_value < CO2_limit_1)) { digitalWrite(led_Yellow, LOW); } // CONTRÔLE VENTILATEURS //Ventilateurs analogWrite(Vent, 127); // fonctionnent à moitié de leur puissance en permanence // CONTRÔLE AFFICHAGE LCD //Fonction Switch Bouton if ( time_t >= t_bouton + tempo_4 ) { // délai de 1 seconde pour la détecttion d'une pression sur le bouton-poussoir BP_bool_2 = digitalRead(BP_1); if (BP_bool_2 == HIGH ) { if (BP_Switch_2 >=5 ) { BP_Switch_2 = 0; } BP_Switch_2++; lcd.init(); } t_bouton = time_t; } BP_bool_2 = digitalRead(BP_1); if (BP_Switch_2 == 1) { lcd.setCursor(0, 0); lcd.print("Temp.Interieure:"); lcd.setCursor(0, 1); lcd.print(temp_moyen); lcd.setCursor(6, 1); lcd.print("°C"); } if (BP_Switch_2 == 2) { lcd.setCursor(0, 0); lcd.print("Humidite :"); lcd.setCursor(0, 1); lcd.print(hum_moyen); lcd.setCursor(6, 1); lcd.print("%"); } if (BP_Switch_2 == 3) { lcd.setCursor(0, 0); lcd.print("CO2 : "); lcd.setCursor(0, 1); lcd.print(CO2_value, DEC); lcd.setCursor(6, 1); lcd.print("PPM"); } if (BP_Switch_2 == 4) { lcd.setCursor(0, 0); lcd.print("Mode:"); lcd.setCursor(0, 1); if (Fonctionnement == LOW) { lcd.print("Démarrage"); } if (Fonctionnement == HIGH) { lcd.print("Normal"); } } if (BP_Switch_2 == 5) { lcd.setCursor(0, 0); lcd.print("Retournement:"); lcd.setCursor(0, 1); if (Automatique == LOW) { lcd.print("Automatique"); } if (Automatique == HIGH) { lcd.print("Manuel"); } } } }