DS1307RTC retard

Bonjour tout le monde,

Voilà, j’ai un petit soucis avec mon montage, mon shield DS1307 prend du retard, je pense savoir d’où cela vient mais je ne vois pas pourquoi.
Je m’explique, afin d’automatiser mes terrariums, j’ai utilisé un arduino uno avec une puce DS1307, une sonde DHT11 et un relais 2 modules (4 en fait mais je n’en utilise que 2) et un LCD 16x2. Lors de la phase de test, je n’ai eu aucun soucis en revanche depuis que j’ai tout installer avec le 220 dans les relais, j’ai des soucis à chaque déclenchements du relais pour le chauffage cela me fait un bug d’affichage et je pense que cela fait retarder l’heure de la puce DS1307.
Ce matin en me levant tout allait bien puis lorsque le terrarium est arriver en T° et que le chauffage se déclenche par intermittence l’heure est restée bloquée sur 10H12.

Montage :

Arduino uno R3 : alimentation sur secteur
DS1307 : pin A4 A5
DHT11 : pin 10
LCD : pin 2 3 4 5 11 et 12
Relais : seulement 2 pin relais 3 et 4 sur les pin 6 et 7

l’alimentation des modules se fait par les 5v et GND de l’arduino dupliquer sur une mini board

Programme :

le but est d’avoir la lumière allumée de 9h à 21h avec une température de 28°, et une température de 24° la nuit (21h à 9h)

voici le code

#include <LiquidCrystal.h>
#include "DHT.h"
#include <Wire.h>
#include <DS1307RTC.h>
#include <Time.h>

#define DHTPIN 10
#define DHTTYPE DHT11
#define RELAY3 6                   
#define RELAY4 7                   


int led3=16;
int led4=17;
int relaymode;

DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  Serial.begin(9600);
  dht.begin();
  pinMode(6, OUTPUT);  // relay 3   lumiere
  pinMode(7, OUTPUT);  // relay 4   chauffage  
  
  pinMode(led3,OUTPUT);
  pinMode(led4,OUTPUT);
  }
  
void loop() {
  float h=dht.readHumidity();
  float t=dht.readTemperature();
  tmElements_t tm;
   
  // Gestion de l'eclairage si HIGH = lumiere du jour si LOW = lumiere nocturne
  if ((RTC.read(tm))&&(tm.Hour>=9)&&(tm.Hour<21)){
      digitalWrite(6, HIGH);
      }
      else {
        digitalWrite(6, LOW);
        }  
  
  // gestion du chauffage  
  if ((RTC.read(tm))&&(tm.Hour>=9)&&(tm.Hour<21)&&(t<28)){          // Chauffage ON entre 9h et 21h si temp en dessous de 28
    digitalWrite(7, HIGH);
    }
    else if (t<24){      // Chauffage ON entre 21h et 9h si temp en dessous de 24  
      digitalWrite(7, HIGH);
      }
      else {
        digitalWrite(7, LOW);          // sinon chauffage OFF
        }
      
  if(isnan(t) || isnan(h)) {
    lcd.println("Sonde inactive");
    }
    else if (RTC.read(tm)){      
      lcd.begin(16,2);
      lcd.setCursor(4,0);
      lcd.print("Roberto");
      lcd.setCursor(5,1);
      print2digits(tm.Hour);
      lcd.write('H');
      print2digits(tm.Minute);
      delay(5000);
      
      // Affichage des Espèce
      lcd.clear();
      lcd.setCursor(2,0); 
      lcd.print("Pantherophis");
      lcd.setCursor(4,1);    
      lcd.print("Guttatus");
      delay(5000);
      
      // Affichage des conditions
      lcd.clear();
      lcd.print("Air : ");
      lcd.print(h);
      lcd.print(" %");
      lcd.setCursor(0,1);    
      lcd.print("Temp : ");
      lcd.print(t);
      lcd.print(" ");
      lcd.write(0b11011111);
      lcd.print("C");
      delay(10000);
      }
    }
 
 // Conversion de l'heure    
 void print2digits(int number) {
  if (number >= 0 && number < 10) {
    lcd.write('0');
  }
  lcd.print(number);

 // Gestion des led  
  relaymode=digitalRead(RELAY3);
   if(relaymode==LOW)
   { digitalWrite(led3,LOW);}
    else
    { digitalWrite(led3,HIGH);}  
  
  relaymode=digitalRead(RELAY4);
   if(relaymode==LOW)
   { digitalWrite(led4,LOW);}
    else
    { digitalWrite(led4,HIGH);}  
   
}

Voilà si quelqu’un à une idée, je suis tout ouïe :slight_smile:

Ah oui j'oubliai, je suis tout nouveau dans ce monde. J'ai fait un cube led 4x4x4 avant qui fonctionne très bien :).

Je suis arrivé dans l'arduino world en faisant des recherche justement pour domotiser mes terrariums

Bonjour la cause principale de retard/avance avec les ds1307 est quasi toujours due à la "qualité" du quartz employé.

Bonjour, En complément à la réponse d'Artouste, l'arrêt de l'horloge provient certainement des parasites générés par la commutation des relais. Il faut faire la chasse aux parasites ou mettre des relais statiques. @+

merci pour vos réponses, du coup, il est préférable que j’utilise ce type de relais

à la place de celui la?

Sinon concernant le code, est ce qu’il est plutot correct? pour limiter l’alumage du chauffage j’ai rajouter ce parametre :

// gestion du chauffage  
  if ((RTC.read(tm))&&(tm.Hour>=9)&&(tm.Hour<21)&&(t<26)&&(t<29)){          // Chauffage ON entre 9h et 21h si temp en dessous de 28
    digitalWrite(7, HIGH);
    }
    else if ((t<22)&&(t<25)){      // Chauffage ON entre 21h et 9h si temp en dessous de 24  
      digitalWrite(7, HIGH);
      }
      else {
        digitalWrite(7, LOW);          // sinon chauffage OFF
        }

afin qu’il ne fonctionne qu’entre 26 et 29, au lieu de fonctionner que jusqu’à 28°. Avec l’ancien paramètre, le chauffage se déclenchait toute les minutes environ…

Re, Le temps d'enclenchement de ton chauffage dépend uniquement des déperditions

Oui bien-sur, mais le fait de mettre une plage évite les ON/OFF toutes les minutes.

A la base j'avais un déclenchement jusqu'à 28°, donc à 28°, il se coupe et à 27° il se relance, on est en hiver donc j'avais un ON/OFF toute les 30s/1min.

Concernant le relais, suis je dans le bon?

Re, Pour le relais statique, il faudrait le lien vers les caractéristiques et la puissance de ta chaufferette. Pour les plages de fonctionnement cela correspond à l'hystérésis de ta commande. @+