Calcul de temps pour serre automatisée

Bonjour à tous

Voilà je lance mon premier post sur ce forum, j'ai besoin de vous !

Mon projet est une serre d'intérieur pour semis avec gestion automatisée de l'humidité, température éclairage et ventilation avec les valeurs affichées sur écran lcd.

matériel utilisé :

  • serre ikéa
  • arduino méga
  • DS3231 RTC
  • écran lcd 20x4
  • DHT 22
  • Shield 4 relais.
  • brumisateur
  • ventilateurs
  • ruban led

Mon projet fonctionne (je reviendrai certainement pour une optimisation de code qui a l'air bien confus!) mais étant curieux et débutant je coince sur une fonction de temps.

En effet j'allume les led de 8h à 20h mais je voulais afficher sur l'écran depuis combien de temps la led est allumée (ou éteinte) ... et là ... je n'y arrive pas. J'arrive à afficher l'état de la led ON ou OFF mais pas la durée.
voici mon code :

#include <Time.h>
#include <TimeLib.h>
#include <DS3232RTC.h>
#include <Wire.h>   // va avec ds3231
#include <LiquidCrystal_I2C.h> 
//#include <Adafruit_Sensor.h>
#include <DHT.h>

LiquidCrystal_I2C lcd(0x3F, 20, 4);
// DS3232RTC (SDA, SCL);

#define DHTPIN 9                      // Pin du DHT
#define DHTTYPE DHT22                 // DHT 22  (AM2302)

DHT dht(DHTPIN, DHTTYPE);

const int hum = 5;                     // pin du relais 1 (brumisateur)
const int vent = 6;                    // pin du relais 2 (ventilateur)
const int led = 7;                     // pin du relais 3 (Led)
const int vh = 8;                   // pin du relais 4 (non utilisé)
const int temps;


void setup()
{
  pinMode(hum, OUTPUT);             // on initialise la pin du relais en OUTPUT
  pinMode(vent, OUTPUT);            // on initialise la pin du relais en OUTPUT
  pinMode(led, OUTPUT);             // on initialise la pin du relais en OUTPUT
  pinMode(vh, OUTPUT);            // on initialise la pin du relais en OUTPUT
  dht.begin();
  Wire.begin();
  lcd.init();
  lcd.cursor_on();
  lcd.backlight();
  lcd.init(); // initialisation de l'afficheur

  {
   Serial.begin(9600);
    setSyncProvider(RTC.get);   // the function to get the time from the RTC
    if(timeStatus() != timeSet) 
        Serial.println("Unable to sync with the RTC");
    else
        Serial.println("RTC has set the system time"); 
//            Serial.print(hour());
//            Serial.print(minute());     
}

//setTime(11, 30, 00, 18, 2, 2018);   //set the system time to 23h31m30s on 13Feb2009
// RTC.set(now()); //set the RTC from the system time
//RTC.setTime(12, 0, 0);
//RTC.setDate(18, 2, 2018);
setTime(temps);
// 
}

void setRelay(int relay, int value)
{
  if (relay > 0 && relay < 5) digitalWrite((relay + 4), value);
}
void loop()

{
  delay(1000);                      // Délai avant lecture température

  float h = dht.readHumidity();
  float temp = dht.readTemperature();
  byte etat_vh = digitalRead(8);
  byte etat_led = digitalRead(7);
  byte etat_vent = digitalRead(6);
  byte etat_hum = digitalRead(5);
   
  if (isnan(temp) || isnan(h))         // check if returns are valid, if they are NaN (not a number) then something went wrong!
  {
    lcd.print("Erreur de lecture DHT");
  }
  else
  {
    lcd.setCursor(0, 0);            // position de début d'écriture
    lcd.print("Tmp: ");             // écrit Temp: à l'écran
    lcd.print(temp);                // écrit la température du DHT
    lcd.print(" C");
    lcd.setCursor(0, 1);
    lcd.print("Hum: ");
    lcd.print(h);
    lcd.print(" %");
    lcd.setCursor(0, 2);
    lcd.print("Vnt:");
       if (etat_vent == 1) lcd.print(" ON ");
       else lcd.print(" OFF");
    lcd.print(" Brume:");
       if (etat_hum == 1) lcd.print(" ON ");
       else lcd.print(" OFF");   
    lcd.setCursor(0, 3);
    lcd.print("Led: ");
       if (etat_led == 1) lcd.print("ON  ");
       else lcd.print("OFF ");
       setSyncProvider(RTC.get);
    lcd.print("(");           // depuis combien de temps led allumée ou éteinte
    lcd.print(hour());        // depuis combien de temps led allumée ou éteinte
    lcd.print("h");           // depuis combien de temps led allumée ou éteinte
    lcd.print(minute());      // depuis combien de temps led allumée ou éteinte
    lcd.print(")");           // depuis combien de temps led allumée ou éteinte
    
    
    Serial.print(hour());     // perso test pour verif heure et date sur serial
    Serial.print(' ');
    Serial.print(minute());
    Serial.print(' ');
    Serial.print(day());
    Serial.print(' ');
    Serial.print(month());
    Serial.print(' ');
    Serial.print(year()); 
    Serial.println(); 

}


    if (h < 80) setRelay(1, 1);     // déclenche brume si humidité <80%
      else setRelay(1, 0);          // sinon éteint
      
       if (h < 80) setRelay(4, 1);  // déclenche vent h si humidité <80%
      else setRelay(4, 0);          // sinon éteint

    if (temp > 30) setRelay(2, 1);  // déclenche vent  si température >30°
      else setRelay(2, 0);
    
      
    if (hour() > 8 & hour() < 20 ) setRelay(3, 1);    // allumé entre 8 et 20h
        else setRelay(3, 0);

  }

ici je voulais afficher la valeur heure en retirant 8 mais évidemment après minuit c'est faux et surtout pas de raz quand la led s'éteint.

lcd.print("(");           // depuis combien de temps led allumée ou éteinte
    lcd.print(hour()-8);        // depuis combien de temps led allumée ou éteinte
    lcd.print("h");           // depuis combien de temps led allumée ou éteinte
    lcd.print(minute());      // depuis combien de temps led allumée ou éteinte
    lcd.print(")");           // depuis combien de temps led allumée ou éteinte

Ou alors comment démarrer un chrono quand l'état de la LED change d'état?

merci d'avance pour vos lumières ! Ne soyez pas trop durs :wink:

hello
demande au modérateur de déplacer ton post dans la bonne rubrique

Ah mince je ne suis pas à la bonne place? ...
Désolé

utilse le lien " report to mederator" ci dessous

C'est fait !
merci

ok
je t'ai prepare ce petit bout de code
tu le charges et tu regarde ton moniteur en 115200 bauds

puis tu t'amuses à changer les valeurs des variables
regarde aussi le code en bas ( entre /* et */)

byte heure_depart=8;//heure depart leds ON
byte minute_depart=0;
byte seconde_depart=0;

et
heure_actuelle=15;
minute_actuelle=59;
seconde_actuelle=59;

byte heure_depart=8;//heure depart leds ON
byte minute_depart=0;
byte seconde_depart=0;
byte heure_actuelle=0;//heure actuelle
byte minute_actuelle=0;
byte seconde_actuelle=0;
byte h_on=0;
byte mn_on=0;
byte s_on=0;
byte h_off=0;
byte mn_off=0;
byte s_off=0;
boolean flag_chgt_led=false;
boolean memo_flag_chgt_led=flag_chgt_led;
void setup() {
Serial.begin(115200);
      flag_chgt_led=false;
      heure_actuelle=15;
      minute_actuelle=59;
      seconde_actuelle=59;

      if (seconde_depart>seconde_actuelle){seconde_actuelle=seconde_actuelle+60;}
      s_on=seconde_actuelle-seconde_depart;
      if (minute_depart>minute_actuelle){minute_actuelle=minute_actuelle+60;heure_depart++;}
      mn_on=minute_actuelle-minute_depart;
      if (heure_depart>heure_actuelle){heure_actuelle=heure_actuelle+24;}
      h_on=heure_actuelle-heure_depart;
    if(flag_chgt_led==true){
Serial.print("duree allumage = ");Serial.print(h_on);
Serial.print(" ");Serial.print(mn_on);
Serial.print(" ");Serial.println(s_on);
    }

    else
    {
Serial.print("duree extinction = ");Serial.print(h_on);
Serial.print(" ");Serial.print(mn_on);
Serial.print(" ");Serial.println(s_on);
      
      }
}

void loop() {
  /*
   
      
    if (hour() > 8 & hour() < 20 )  // allumé entre 8 et 20h
    {setRelay(3, 1);flag_chgt_led=true;}
    else {setRelay(3, 0);flag_chgt_led=false;}
    if(memo_flag_chgt_led!=flag_chgt_led)
     {
      memo_flag_chgt_led=flag_chgt_led;
      setSyncProvider(RTC.get);
      
        heure_d=hour();
        minute_d=minute();
        seconde_d=second();
       
      }
*/
}

Merci !

Je fais quelques tests, j'essaie d'intégrer ça dans mon sketch avec le RTC et je te dis. J'essaie de tout comprendre aussi mdr. J'ai un soucis avec la gestion du temps ... ça ne rentre pas!