[Résolu] Initialisation RTC PCF8523

Bonjour à tous,

J’utilise un arduino M0 avec un shield Adafruit datalogger comprenant un RTC PCF8523. En voulant vérifié le bon fonctionnement de l’horloge avec le programme d’exemple de la librairie RTClib.h, je vois que celui-ci indique que nous somme en 2000, et que cette date + 7jour, on arrive en 2043. Donc à moins que j’ai rêvé les 17 derniere année et que le temps ne s’écoule plus normalement du tout, je pense qu’il y a un soucis…

Voici le code que j’utilise :

// Date and time functions using a DS1307 RTC connected via I2C and Wire lib
#include <Wire.h>
#include <RTClib.h>

RTC_PCF8523 rtc;

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

void setup () {

  while (!SerialUSB) {
    delay(1);  // for Leonardo/Micro/Zero
  }

  SerialUSB.begin(57600);
  if (! rtc.begin()) {
    SerialUSB.println("Couldn't find RTC");
    while (1);
  }
  
  if (! rtc.initialized()) {
    SerialUSB.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  }
}

void loop () {
    DateTime now = rtc.now();
    
    SerialUSB.print(now.year(), DEC);
    SerialUSB.print('/');
    SerialUSB.print(now.month(), DEC);
    SerialUSB.print('/');
    SerialUSB.print(now.day(), DEC);
    SerialUSB.print(" (");
    SerialUSB.print(daysOfTheWeek[now.dayOfTheWeek()]);
    SerialUSB.print(") ");
    SerialUSB.print(now.hour(), DEC);
    SerialUSB.print(':');
    SerialUSB.print(now.minute(), DEC);
    SerialUSB.print(':');
    SerialUSB.print(now.second(), DEC);
    SerialUSB.println();
    
    SerialUSB.print(" since midnight 1/1/1970 = ");
    SerialUSB.print(now.unixtime());
    SerialUSB.print("s = ");
    SerialUSB.print(now.unixtime() / 86400L);
    SerialUSB.println("d");
    
    // calculate a date which is 7 days and 30 seconds into the future
    DateTime future (now + TimeSpan(7,12,30,6));
    
    SerialUSB.print(" now + 7d + 30s: ");
    SerialUSB.print(future.year(), DEC);
    SerialUSB.print('/');
    SerialUSB.print(future.month(), DEC);
    SerialUSB.print('/');
    SerialUSB.print(future.day(), DEC);
    SerialUSB.print(' ');
    SerialUSB.print(future.hour(), DEC);
    SerialUSB.print(':');
    SerialUSB.print(future.minute(), DEC);
    SerialUSB.print(':');
    SerialUSB.print(future.second(), DEC);
    SerialUSB.println();
    
    SerialUSB.println();
    delay(3000);
}

et ce qui s’affiche sur le moniteur série :

2000/0/0 (Sunday) 0:0:50
 since midnight 1/1/1970 = 2313941554s = 26781d
 now + 7d + 30s: 2043/5/7 6:2:40

2000/0/0 (Sunday) 0:0:51
 since midnight 1/1/1970 = 2313941555s = 26781d
 now + 7d + 30s: 2043/5/7 6:2:41

2000/0/0 (Sunday) 0:0:50
 since midnight 1/1/1970 = 2313941554s = 26781d
 now + 7d + 30s: 2043/5/7 6:2:40

2000/0/0 (Sunday) 0:0:51
 since midnight 1/1/1970 = 2313941555s = 26781d
 now + 7d + 30s: 2043/5/7 6:2:41

2000/0/0 (Sunday) 0:0:0
 since midnight 1/1/1970 = 2313941504s = 26781d
 now + 7d + 30s: 2043/5/7 6:1:50

Si quelqu’un a une idée de ce qu’il se passe ?

Personne ?

J'utilise la librairie disponible à cette adresse : Using the Real Time Clock | Adafruit Data Logger Shield | Adafruit Learning System

j'ai pas mon M0 sous la main

est-ce que vous utilisez le Adafruit Feather M0 Adalogger?

Dans votre code vous faites:

// calculate a date which is [color=red]7 days and 30 seconds[/color] into the future
DateTime future (now + TimeSpan([color=red]7, 12, 30, 6[/color]));

--> vous n'êtes pas 7 jours et 30 secondes plus tard avec ce TimeSpan. le constructeur est TimeSpan (int16_t days, int8_t hours, int8_t minutes, int8_t seconds);

avez vous essayé en séparant?

  const TimeSpan deltaT = TimeSpan(7, 0, 0, 30);
  DateTime future;
  future = now + deltaT;

juste histoire de s'assurer que le compilateur utilise bien le bon opérateur?

Non, j'utilise le [/url]Adafruit Data logger Shield

ça donne toujours le même résultat...

Après le TimeSpan ne m'interresse pas plus que ça, c'est surtout l'initialisation qui m'interresse pour que je puisse lire la date et l'heure d'aujourd'hui...

nathanv0:
Non, j'utilise le [/url]Adafruit Data logger Shield

ah... mais vous le branchez comment sur votre M0 en l'enfichant directement?

vous avez une pile dans le shield?

avez vous un UNO R3 pour tester?

Oui je l'enfiche directement sur la carte M0 et il y a bien une pile.

Pour le UNO, oui j'en ai un

nathanv0:
Oui je l'enfiche directement sur la carte M0 et il y a bien une pile.

est-ce bien la dernière version du design avec SDA/SCL qui sont lus au dessus la rangée des pins Digitales et pas A4/A5 et vous avez bien mis des broches à cet endroit? (sur le Zero A4 et A5 ne sont pas connectées à SDA/SCL)

nathanv0:
Pour le UNO, oui j'en ai un

ce serait bien de tester sur le UNO R3 pour voir si votre shield est fonctionnel.

J-M-L:
est-ce bien la dernière version du design avec SDA/SCL qui sont lus au dessus la rangée des pins Digitales et pas A4/A5 et vous avez bien mis des broches à cet endroit? (sur le Zero A4 et A5 ne sont pas connectées à SDA/SCL)

Oui il s'agit bien de cette version, les broches sont connecté et fonctionne puisque j'arrive à utiliser un afficheur LCD avec ce shield.

J'ai également essayé avec le UNO et le résultat est le même : une date à coté de la plaque...

2000/0/0 (Friday) 0:10:11
 since midnight 1/1/1970 = 2313942115s = 26781d
 now + 7d + 30s: 2043/5/7 6:12:1

2000/0/0 (Friday) 0:10:10
 since midnight 1/1/1970 = 2313942114s = 26781d
 now + 7d + 30s: 2043/5/7 6:12:0

2000/0/0 (Friday) 0:10:11
 since midnight 1/1/1970 = 2313942115s = 26781d
 now + 7d + 30s: 2043/5/7 6:12:1

vous ne l’avez jamais initialisé?

C'est justement la question de ce topic, pour moi l'initialisation du composant se fait en lui donnant une date et une heure à partir desquelles il peut se repérer avec la lignes de code suivante :

rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

Mais si c'est pas ça l'initialisation, ça expliquerai pourquoi ça ne marche pas.
Et donc comment est-ce qu'on initialise le composant ?

cette ligne de commande fonctionne si ces éléments sont fournis à la compilation (c'est la date et l'heure de la dernière compilation qui est injectée), je ne sais pas si c'est le cas dans cette architecture avec le Zero, ça fonctionne avec un UNO

essayez en mode plus direct:rtc.adjust(DateTime(2017, 7, 4, 15, 35, 0));

Idem...

2000/0/0 (Sunday) 0:40:40
 since midnight 1/1/1970 = 2313943944s = 26781d
 now + 7d + 30s: 2043/5/7 6:42:30

2000/0/0 (Sunday) 0:40:41
 since midnight 1/1/1970 = 2313943945s = 26781d
 now + 7d + 30s: 2043/5/7 6:42:31

Si vous utilisez cela sur votre UNO R3 ça donne quoi?

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

RTC_PCF8523 rtc;

const char * daysOfTheWeek[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

void setup () {

  Serial.begin(115200);
  if (! rtc.begin()) {
    Serial.println("RTC introuvable");
    while (true);
  }

  if (! rtc.initialized()) {
    Serial.println("ajustement de l'heure");
    rtc.adjust(DateTime(2017, 7, 4, 17, 20, 0));
  }
}

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

  Serial.print(now.year(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.print(now.day(), DEC);
  Serial.print(" (");
  Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
  Serial.print(") ");
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.print(now.minute(), DEC);
  Serial.print(':');
  Serial.print(now.second(), DEC);
  Serial.println();

  Serial.print(" since midnight 1/1/1970 = ");
  Serial.print(now.unixtime());
  Serial.print("s = ");
  Serial.print(now.unixtime() / 86400L);
  Serial.println("d");

  // calculate a date which is 7 days and 30 seconds into the future
  DateTime future;
  const TimeSpan deltaT = TimeSpan(7, 0, 0, 0);
  future = now + deltaT;

  Serial.print(" Dans 7 jour ");
  Serial.print(future.year(), DEC);
  Serial.print('/');
  Serial.print(future.month(), DEC);
  Serial.print('/');
  Serial.print(future.day(), DEC);
  Serial.print(' ');
  Serial.print(future.hour(), DEC);
  Serial.print(':');
  Serial.print(future.minute(), DEC);
  Serial.print(':');
  Serial.print(future.second(), DEC);
  Serial.println();

  Serial.println();
  delay(3000);
}

et si vous pouviez poster une photo de face et de dos de votre shield - juste pour voir à quoi il ressemble (pour voir où SDA et SCL sont pris pour être routés vers votre RTC)

Ca donne toujours la même chose...

2000/0/0 (Friday) 0:41:41
 since midnight 1/1/1970 = 2313944005s = 26781d
 Dans 7 jour 2043/5/6 18:13:25

2000/0/0 (Friday) 0:50:50
 since midnight 1/1/1970 = 2313944554s = 26781d
 Dans 7 jour 2043/5/6 18:22:34

2000/0/0 (Friday) 0:51:51
 since midnight 1/1/1970 = 2313944615s = 26781d
 Dans 7 jour 2043/5/6 18:23:35

Pour les photos, vous les trouverez en pièce jointe. Après je ne sais si vous arriverez à voir grand chose vu que j'ai fait un montage sur le shield. Mais je suis sur que le I2C fonctionne puisque j'arrive à communiquer avec un écran LCD.

Je vous mets aussi le lien vers le site adafruit du shield:

Pas d'idée ?

J'ai essayé plein de bibliothèques différentes mais aucune ne semble marcher...
Je commence à désespérer...

essayez avec cela une fois pour forcer la mise à l’heure de votre RTC

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

RTC_PCF8523 rtc;

const char * daysOfTheWeek[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

void setup () {

  Serial.begin(115200);
  if (! rtc.begin()) {
    Serial.println("RTC introuvable");
    while (true);
  }

  Serial.println("ajustement de l'heure");
  rtc.adjust(DateTime(2017, 7, 10, 8, 50, 0)); // <<-- mettre ici l'heure exacte
}



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

  Serial.print(now.year(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.print(now.day(), DEC);
  Serial.print(" (");
  Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
  Serial.print(") ");
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.print(now.minute(), DEC);
  Serial.print(':');
  Serial.print(now.second(), DEC);
  Serial.println();

  Serial.print(" since midnight 1/1/1970 = ");
  Serial.print(now.unixtime());
  Serial.print("s = ");
  Serial.print(now.unixtime() / 86400L);
  Serial.println("d");

  // calculate a date which is 7 days and 30 seconds into the future
  DateTime future;
  const TimeSpan deltaT = TimeSpan(7, 0, 0, 0);
  future = now + deltaT;

  Serial.print(" Dans 7 jour ");
  Serial.print(future.year(), DEC);
  Serial.print('/');
  Serial.print(future.month(), DEC);
  Serial.print('/');
  Serial.print(future.day(), DEC);
  Serial.print(' ');
  Serial.print(future.hour(), DEC);
  Serial.print(':');
  Serial.print(future.minute(), DEC);
  Serial.print(':');
  Serial.print(future.second(), DEC);
  Serial.println();

  Serial.println();
  delay(3000);
}

et ensuite chargez à nouveau le code mais en ayant mis en commentaire les 2 lignes

  Serial.println("ajustement de l'heure");
  rtc.adjust(DateTime(2017, 7, 10, 8, 50, 0)); // <<-- mettre ici l'heure exacte

Toujours le même résultat...

Alors soit votre composant est endommagé soit vous avez mal connecté le shield

OK, et du coup comment est ce que je pourrais tester que le shield est bien connecté ?