DS1307 complètement Fou

Bonsoir à tous,
dans le cadre de la gestion de mon aquarium j'ai un problème avec la gestion de l'heure en utilisant un DS1307.
L'heure est correctement affiché puis d'un coup l'heure avance de plusieurs heures, puis recule de nouveau et ainsi de suite.
Il n'y a aucune logique dans ces changements.

C'est très problèmatique car je gère l'allumage et l'extinction de ma rampe leds en fonction de l'heure récupérée sur le DS1307.

Par contre j'ai remarqué que si j'éteins l'arduino, que je le rallume l'heure affichée est correcte.
Donc pour moi le DS1307 n'est pas en cause.

Mais quoi d'autre ???
Merci d'avance pour votre aide

mon_prog.pde (5.54 KB)

Salut, tes boutons sont des boutons poussoir ou des interrupteurs ?

sinon je remarque cela :

if ((((hour() > 0  && hour() < 17)) && (digitalRead(BP2)==LOW)) || 
    (((hour() > 21  && hour() < 24)) && (digitalRead(BP2)==LOW)) || 
    ((hour() == 0) && (digitalRead(BP2)==LOW))){
    analogWrite(pwm1, 150);  
  }
if ((hour() > 20) &&  (hour() < 24)) {   // de 21:00:00 à 23:59:59
    analogWrite(pwm2, 255);
  }
  else{
    analogWrite(pwm2, 0);
  }

Ces 2 lignes sont en conflit entre elles à mon sens quand BP2 est LOW

en effet si l'heure est de 22 ou 23, les 2 fonctions vont se réaliser donc pwm1 et pwm2.

Sauf que je ne sais pas si c'est ce que tu veux ou pas.

Sinon tu peux clarifier ton code en enlevant pleins de else if car il ne sont pas spécialement nécéssaires. De même les 2 if avec les analogRead pour BP2 et BP1 peuvent être allégées.

je te donne juste un exemple. Après tu fais comme tu veux.

//****************Day Lights**********************************************************************************
//
//  Les 3 conditions suivantes sont exclusives, elle ne peuvent jamais arriver en même temps
//  on peut donc supprimer les elseif et garder que les if
  if (hour() == 17)  { // entre 17:00:00 et 17:59:59
    analogWrite (pwm1, val_up); // allumage progressif
  }

  if (hour() == 21)  { // entre 21:00:00 et 21:59:59
    analogWrite (pwm1, val_down); // extinction progressive
  }   

  if ((hour() > 17 ) && (hour() < 21)) { // entre 18:00:00 et 20:59:59
    analogWrite(pwm1, 150);
  }

// dans les 2 conditions suivantes, l'état du BP qui satisfait la condition est toujours le même
// on peut donc alleger le code de la façon suivante
//
if (digitalRead(BP1)==LOW)
{
  if ( ( hour() > 0  && hour() < 17 )  || 
       ( hour() > 21  && hour() < 24 ) || 
       ( hour() == 0) 
     )
  {
    analogWrite(pwm1, 150);  
  }
} 

if (digitalRead(BP2)==HIGH)
{
  if ( ( hour() > 0  && hour() < 17 ) || 
       ( hour() > 21  && hour() < 24) || 
       ( hour() == 0) ) {
    analogWrite(pwm1, 0);  
  }
}

C'est juste pour info, chacun code il l'entend bien entendu. Sinon je ne vois pas pour le moment autre chose.

A+

merci pour la réponse.

Alors première réponse :
les boutons sont des interrupteurs

Pour pwm1 et pwm2 ce sont deux circuits indépendants. Donc cela ne pose pas de problème.

Pour ton code modifié je vais étudier ça.

Encore merci