[Résolu] RTC DS1307 blink ":" sec

Bonjour à tous,
Les problèmes se succedent mais ne se ressemblent pas.
On est sur un UNO 3 + Shield memoire DS1307 + Shield Deuligne .
Tout est presque dans le titre.
N'ayant pas besoin des secondes mais d'un rappel du bon fonctionnement de l'affichage j'ai placé un ":" entre heures et mn.
Le but est de faire clignoter ce double point au rhythme des secondes.
Certaines RTC ont une sortie interruption programmable. Là j'ai voulu faire simple avec le code qui suit.
J'ai volontairement placé le code de l'horloge dans une fonction car dans mon application principale c'est ainsi pour une question de clarté.
Ici je ne présente pour faire court que l'horloge.
Au départ tout va bien, la date et l'heure s'affichent, les ":" clignotent normalement mais au passage de la mn le caractère ":" se fige soit éteint soit visible mais reste bloqué. L'horloge continue à afficher normalement.
J'aurais pu aussi utliser l'instruction "millis" mais il m'a semblé plus logique de faire comme ça.
Si je place la routine de clignotement dans la fonction, ça ne fonctionne pas du tout.
A force je n'ai plus la tête claire et je fais appel à une âme charitable qui pourrait m'aider à débugger ou me proposer une solution plus fiable ou plus élégante voir intelligente. XD

/************************
* TEST DS1307
*
*
***********************************************************/
 #include <Wire.h>              // I2C library include
 #include <Deuligne.h>          // LCD library include
 #include <RTClib.h>            // Lib DS1307 horloge RTC
 //        ---------------------  Déclaration des objets  ------------------------
 Deuligne lcd;      // lcd object declaration  Déclare Deuligne
 RTC_DS1307 RTC;    // Déclare Horloge
 boolean flagS;     // flag cligot secondes
 byte currentsecond;
 
 //  ***********************  SETUP  ***********************
void setup() {
  Serial.begin(9600);
  Serial.print("JPJCB-V140414");
  lcd.init();          // LCD init
  lcd.clear();         // Clear Display
  lcd.backLight(true); // Backlight ON
  flagS = HIGH;
  // following line sets the RTC to the date & time this sketch was compiled
  // RTC.adjust(DateTime(__DATE__, __TIME__));
}
//  ***********************  MAIN LOOP  ***********************
void loop() { 
      // ----- gestion clignotement ":" secondes
       DateTime now = RTC.now(); Affich_heure();
   if (now.second() - currentsecond >= 1) { currentsecond = now.second();  
       if   (flagS == LOW) { flagS = HIGH; lcd.setCursor(12,0); lcd.print(":");
       } 
       else { flagS = LOW;  lcd.setCursor(12,0); lcd.print(" "); }
       }
    }
   //  ****************   Fin de boucle   ****************
   
   // -------------------  Fonction heure  ------------------  
void Affich_heure(void)
  {
     DateTime now = RTC.now(); 
     lcd.setCursor(3,0);          // Curseur col 0,  2ème ligne
     if (now.day() < 10) {lcd.print("0"); } // Affichage zéro
     lcd.print(now.day(), DEC);   // Affiche le jour du mois
     lcd.print("/");
     if (now.month() < 10) {lcd.print("0"); }
     lcd.print(now.month(), DEC); // Affiche le mois
     lcd.setCursor(10,0);         // Cursor row 10, line 2 
     //--------------------
     if (now.hour() < 10) {lcd.print("0"); }
     lcd.print(now.hour(), DEC); 
     lcd.setCursor(13,0);       //positionne le curseur pour le 0 
     if (now.minute() < 10)  { lcd.print("0"); } // Affichage du zero en dessous de dix.       
       lcd.print(now.minute(), DEC);// Affiche minutes
    }  
  // ************* Fin de programme  **************

Bonjour.

Je ne sais pas si c'est un effet de copié-collé, mais la façon dont le code est mis en forme est une vrai horreur à suivre :slight_smile: Bref.

Si je comprends bien now.second() contient les secondes actuelles, et currentsecond contient les secondes à l'itération précédente. Si c'est bien ça, alors ce bout de code n'est pas un bon test pour vérifier que tu as changé de secondes :

if (now.second() - currentsecond >= 1)

Avec cette méthode, lorsque tu changes de minutes, now.second() va redescendre à zéro alors que currentsecond va lui rester bloqué à 59...
Du coup le test dans ton if va renvoyer [i]faux[/i] ad vitam æternam... et le caractère ne va plus clignoter, ce qui correspond assez bien à tes symptômes du reste :slight_smile:

Il serait probablement plus simple de juste vérifier si les deux valeurs sont égales :

if (now.second() != currentsecond) { ... }

jpjcb66:
Bonjour à tous,

Au départ tout va bien, la date et l'heure s'affichent, les ":" clignotent normalement mais au passage de la mn le caractère ":" se fige soit éteint soit visible mais reste bloqué. L'horloge continue à afficher normalement.

bonjour
rapide
lors du passage de 59 à zero la condition n'est plus verifée il me semble

pourquoi ne pas faire un simple test modulo 2 sur la seconde actuelle ?
et pour info , le ds1307 dispose d'une sortie qui bat le 1hz par defaut

Hélas ce n'est pas du copié-collé. C'est moi qui suis mauvais, mais je me soigne.
Si j'avais été bon j'aurais compris tout de suite et ne serais pas là. :grin:
Merci, on va essayer ça.

jpjcb66:
Hélas ce n'est pas du copié-collé. C'est moi qui suis mauvais, mais je me soigne.
Si j'avais été bon j'aurais compris tout de suite et ne serais pas là. :grin:
Merci, on va essayer ça.

Oui enfin je ne parlais pas de la « qualité » du code, mais de la façon dont il est mis en forme. Je pense que tu ne te rends pas service en « empilant » les instructions sur une même ligne de cette façon là. Note qu'il y a dans l'éditeur Arduino une fonction qui peut être pratique Outils -> Formatage automatique et qui permet de faire un peu de ménage dans la présentation du code. Essaie et je suis sûr que tu trouveras ça plus lisible après :smiley:

J'avais bien compris et ne suis pas vexé. :blush:
J'ai tassé ici pour gagner de la place en hauteur afin de ne pas faire trop long.
Sur l'IDE qui s'il est efficace n'est pas d'une convivialité redoutable c'est pareil ; en 15" l'écran n'est pas très haut .
Dans le bouquin de 1000 pages de Stroustrup (une réf.) c'est effectivement une instruction par ligne.
C'est aussi pour une question de lisibilité que j'ai tendance à faire des modules en dehors de la boucle.
Très bien "formatage auto". Le pire c'est qu'au départ j'avais fait un " if (now.second() != currentsecond) { ".
Mais comme j'avais fait une connerie à côté j'ai changé. Là ça marche. Merci.

Pour répodre à Artouste j'ai regardé rapidement mais ne suis pas certain qu'ils aient câblé la sortie 1 htz sur mon shield. La lecture/ecriture des registre passant par A4 et A5 le bus I2c.
Je ne sais pas non plus si la lib fournit quelque chose dans ce sens à part la sec BCD.
En plus cette lib m'a pris la tête il y a deux jours.
@+

jpjcb66:
...
Pour répodre à Artouste j'ai regardé rapidement mais ne suis pas certain qu'ils aient câblé la sortie 1 htz sur mon shield. La lecture/ecriture des registre passant par A4 et A5 le bus I2c.
Je ne sais pas non plus si la lib fournit quelque chose dans ce sens à part la sec BCD.
En plus cette lib m'a pris la tête il y a deux jours.
@+

peu de chances qu'il soit (pré)cablé
mais en cas de vrai besoin c'est facile à repiquer