Programmateur Aquarium "Simple"

Bonjour à tous,

Je suis un débutant en Arduino et je voudrais faire appel à vos connaissances. Voila j’ai fait un bout de code afin de gérer 5 relais qui s’activent / Déactive suivant l’heure. Le problème est qu’il ne s’allume pas toujours comme il faut. De plus il y a une gestion d’un ventilateur afin de refroidir l’eau quand la t°c monte au dessus de 28, mais j’aimerais que une fois que les ventilateurs sont allumés il reste 5 min sans mettre en suspend le reste du programme, j’ai essayé avec “delay(300000);” mais le programme s’arrête lorsque la température est audessus de 28°

Pouvez vous regarder mon code ci-dessous et m’apporter vos commentaires.

Merci d’avance de votre aide

Antony

#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal.h>

RTC_DS1307 RTC;

const int relais1=A0;
const int relais2=A1;
const int relais3=10;
const int relais4=11;
const int relais5=12;
const int SensorPin=A3;
const int Ventillo=A2;
const float BaseTemp = 20.0;

//const int inter=4;


LiquidCrystal lcd(8, 9, 4, 5, 6, 7);




void setup() {
     
  // set up LCD indication nb colonne et case: 
  lcd.begin(16, 2);
  lcd.clear();
  delay(10);
  // Print a message to the LCD.
  lcd.setCursor(2,0);
 lcd.print("Rock'n Roll");
 delay(1000);
  lcd.clear();
  lcd.setCursor(2,1);
  lcd.print("Rock'n Roll");
  delay(1000);
  lcd.clear();
  delay (10);
  
 pinMode (relais1, OUTPUT);
 pinMode (relais2, OUTPUT);
 pinMode (relais3, OUTPUT);
 pinMode (relais4, OUTPUT);
 pinMode (relais5, OUTPUT);
 pinMode (Ventillo, OUTPUT);
 pinMode (SensorPin, INPUT);

    Serial.begin(9600);
    Wire.begin();
    RTC.begin();

  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
}

  
  
 //RTC.adjust(DateTime(__DATE__, __TIME__));
  
  



  
void loop() {
 DateTime now = RTC.now();

 // Afficher l'heure sur la premiêre ligne du LCD
   
        lcd.setCursor(0, 0);       
        if (now.hour() < 10) {
          lcd.print("0");
        }  
        lcd.print(now.hour());
        lcd.print(":");
        if (now.minute() < 10) {
          lcd.print("0");
         }
       lcd.print(now.minute());
         lcd.print(":");
         if (now.second() < 10) {
         lcd.print("0");
         }
        lcd.print(now.second());
 

// programme
    
          lcd.setCursor(0,1);
          lcd.print("S:");

 // Rechercher si heure actuelle est dans dans la plage horaire de la voie 1
if ((now.hour() >= 11.30) && (now.hour() <= 21.40))  {
  digitalWrite (relais1,HIGH);
  lcd.setCursor(2,1);
  lcd.print("1");
}
else {
                lcd.setCursor(2,1);
                lcd.print("-");
                digitalWrite (relais1, LOW);
}

// Rechercher si heure actuelle est dans dans la plage horaire de la voie 2
if ((now.hour() >= 12.10) && (now.hour() <= 22.40)){// now.minute()<=40))  
  digitalWrite (relais2,HIGH);
  lcd.setCursor(3,1);
  lcd.print("2");
}
else {
lcd.setCursor(3,1);
               lcd.print("-");
               digitalWrite (relais2, LOW);

}
// Rechercher si heure actuelle est dans dans la plage horaire de la voie 3
if ((now.hour() >= 13.10) && (now.hour() <= 22.40))  {
  digitalWrite (relais3,HIGH);
  lcd.setCursor(4,1);
  lcd.print("3");
}
else {
                lcd.setCursor(4,1);
                lcd.print("-");
                digitalWrite (relais3, LOW);
}

// Rechercher si heure actuelle est dans dans la plage horaire de la voie 4
if ((now.hour() >= 13.30) && (now.hour() <= 21.40))  {
  digitalWrite (relais4,HIGH);
  lcd.setCursor(5,1);
  lcd.print("4");
}
else {
                lcd.setCursor(5,1);
                lcd.print("-");
                digitalWrite (relais4, LOW);
}


// Rechercher si heure actuelle est dans dans la plage horaire de la voie 4
if ((now.hour() >= 13.30) && (now.hour() <= 21.40))  {
  digitalWrite (relais5,HIGH);
  lcd.setCursor(6,1);
  lcd.print("5");
}
else {
               lcd.setCursor(6,1);
               lcd.print("-");
               digitalWrite (relais5, LOW);
}
//Capteur de température
int SensorVal = analogRead (SensorPin);
Serial.println (SensorVal);
float Temperature= (SensorVal * (172.6824 / 1024.0));

lcd.setCursor(10,0);
lcd.print("T:");
lcd.setCursor(12,0);
lcd.print(Temperature);
lcd.setCursor(14,0);
lcd.print((char)223);

//Affichage du v pour ventillateur
lcd.setCursor (10,1);
lcd.print("V:");

//Gestion Ventilateur
if(Temperature>=23) {
  digitalWrite (Ventillo,HIGH);
  lcd.setCursor (12,1);
  lcd.print("ON  ");

}
 else {
  lcd.setCursor (12,1);
  lcd.print("OFF"); 
 }



delay(1000);
}

hello
lorsque tu lances ton prg, imagine qu'un compteur de millisecondes démarre en même temps
et que ce compteur peut compter indéfiniment ( une quarantaine de jours).
tes 5 secondes vaudront 5000 millisecondes donc 5000 points du compteur.

dans ton prg, tu surveilles ta température
si elle est > à 28°, tu démarres le ventilo et tu relèves le compteur interne au programme
exemple: début_ventilation=millis(); ( imagine que debut_ventilation vaut maintenant 11000.

puis tu continues à exécuter ton prg, à la boucle suivante, tu regardes la valeur du compteur (qui a continué de compter les millisecondes) et tu vérifies si elle est > de 5000 par rapport à début_ ventilation
si c'est oui, tu stoppes le ventilo(imagine 16200-11000=5200)
si c'est non, tu continue ton prg (imagine 14900-1000=4900)

exemple:
if(millis()-début_ventilation>5000){ventilo stop}

Bonjour dfgh,

Merci beaucoup pour la piste, Je vais essayé de mettre ça en place et vous tient informé :slight_smile: .

Par contre aucune idée sur mes problèmes avec les relais? Pourquoi il ne s'allume pas à l'heure programmé?

if ((now.hour() >= 11.30) && (now.hour() <= 21.40))  {

ca ne te choque pas?
on est pas sur une montre en la regardant mais dans un programme :wink:

ca ne serait pas un truc dans ce style?

 now.hour() >= 11 && now.minute() >= 30

J'ai déjà essayé cette écriture mais ça ne ce déclenche pas comme je veux :confused:

Merci de ton aide

if (((now.hour() >= 11 && now.minute() >= 30)) && (now.hour() <= 21 && now.minute() >= 30))

Bonjour,

C’est indémerd compliqué de comparer heure et minutes. Pour faire ce que tu veux faire il faudrait écrire

if ((now.hour() > 11 || (now.hour()==11 && now.minute() >= 30)) && (now.hour() < 21 || (now.hour()==21 && now.minute() <=30)))

Il faut tout convertir en minutes et faire une comparaison des minutes.

kamill:
Bonjour,

C’est indémerd compliqué de comparer heure et minutes. Pour faire ce que tu veux faire il faudrait écrire

if ((now.hour() > 11 || (now.hour()==11 && now.minute() >= 30)) && (now.hour() < 21 || (now.hour()==21 && now.minute() <=30)))

Il faut tout convertir en minutes et faire une comparaison des minutes.

Merci Karmill, je test ce soir et te redis si ça fonctionne. Il faut vraiment que je bosse encore et encore pour améliorer ma programmation je suis que au début

Bonjour à tous,

C'est bon tout fonctionne parfaitement