DS3231

Bonsoir,

J'ai fait l'acquisition de plusieurs DS3231 (module temps réel). J'ai suivi le tutoriel suivant : http://www.instructables.com/id/Real-time-clock-using-DS3231-EASY/?ALLSTEPS
Mais, il y a un décalage très visible de l'heure, en effet on perd environ une seconde par minute.
J'ai acquis ces modules en croyant résoudre les problème que j'avais avant sur mes modules DS1037 (mais peut-être est-ce le même problème ?).

Quelqu'un aurait-il une solution ?

J'ai plusieurs de ces modules - aucun pb similaire

Postez votre code et votre câblage devices votre installation, la pile est elle bonne etc?

Le code :

#include 
// Init the DS3231 using the hardware interface
DS3231  rtc(SDA, SCL);
void setup()
{
  // Setup Serial connection
  Serial.begin(115200);
  // Uncomment the next line if you are using an Arduino Leonardo
  //while (!Serial) {}
  
  // Initialize the rtc object
  rtc.begin();
  
  // The following lines can be uncommented to set the date and time
  //rtc.setDOW(WEDNESDAY);     // Set Day-of-Week to SUNDAY
  //rtc.setTime(12, 0, 0);     // Set the time to 12:00:00 (24hr format)
  //rtc.setDate(1, 1, 2014);   // Set the date to January 1st, 2014
}
void loop()
{
  // Send Day-of-Week
  Serial.print(rtc.getDOWStr());
  Serial.print(" ");
  
  // Send date
  Serial.print(rtc.getDateStr());
  Serial.print(" -- ");
  // Send time
  Serial.println(rtc.getTimeStr());
  
  // Wait one second before repeating :)
  delay (1000);
}

La library :

http://www.rinkydinkelectronics.com/library.php?id=73

Connection :

VCC -> Arduino 5V
GND -> Arduino GND
SCL -> A5
SDA -> A4

La pile est neuve... et étant donné que le module reste alimenté avec l'Arduino pour le moment, c'est pas un problème de pile.

C'est bizarre ...

J'ai essayé avec un deuxième module et l'erreur semble avoir disparu. Une erreur de fabrication ou un défaut...
Sinon, savez-vous comment on peut ajouté par exemple 10 secondes à l'heure ?

savez-vous comment on peut ajouté par exemple 10 secondes à l'heure ?

Vous avez une méthode de la librairie setTime(hour, min, sec);

Donc vous demandez l'heure, pour vous simplifiez la vie vérifiez que les secondes sont inférieures à 50 (sinon attendez 60-s secondes) et appelez la fonction setTime(h,m,s+10) (si vous êtes au desssus de 50 secondes vous passez à la minute suivante, peut être l'heure suivante, au jour suivant, au mois suivant, à l'année suivante, ça fait bcp de tests faire)

Sinon demander getUnixTime() qui est un temps en secondes, ajouter 10, régénérez la date et passez la à la RTC

Dans les setup, j'ai essayé ca ;

void setup()
{
Serial.begin(9600);

rtc.begin();
//rtc.setTime(h, m, s+10);
//rtc.getUnixTime (10);
}

Pour le premier, on me retourne un msg d'erreur comme quoi h n'existe pas (si j'allais plus loin on m'aurait dit que m et n'existe pas).

J'ai essayé le deuxième mais comme je m'y attendais getUnixTime n'existe pas non plus dans la librairie que j'ai installée. Après c'est l'histoire de générer l'heure au début que j'ai pas comprise.

Sérieusement ? Faut détailler à ce point là?

Lisez l'heure dans une variable
Prenez l'heure dans une variable h
PRenz les minutes dans une variable m
Prenez les secondes dans une variable s
Testez s pour voir si < 50
Si oui appelez la fonction avec s+10

J-M-L:
Prenez l'heure dans une variable h

Comment on fait ceci ?
Comment affiche t'on t.hour ?
Je ne trouve pas ce bout de code.

Regardez un exemple qui affiche la date et l'heure...

Je ne sais pas afficher que les minutes, ou que les heures, ou que les secondes.

J'utilise des fonctions qui regroupent plusieurs paramètres, et j'ai pas envie de modifier les librairies.

void loop()
{
  Serial.print(rtc.getDOWStr());
  Serial.print(" ");

  Serial.print(rtc.getDateStr());
  Serial.print(" -- ");

  Serial.print(rtc.getTimeStr());
  Serial.print(" -- ");

  Serial.println(rtc.getMonthStr());
}

Résultat dans le moniteur série :

Dimanche 08.01.2017 -- 23:14:38 -- January
Dimanche 08.01.2017 -- 23:14:39 -- January

Quelles autres fonctions existent ?
Faut-il faire quelque chose pour rtc.getUnixTime () car, ca ne marche pas.

Dans le post #2 vous donnez un lien sur la librairie - il y a une doc associée...
Vous l'avez lue?


Au début de la doc il parle d'une structure

Variables: hour, min, sec: For holding time-data date, mon, year: For holding date-data
dow: Day-of-the-week with Monday being the first day
Usage:Time t; // Define a structure named t of the Time-class

Un peu plus loin dans les fonctions de la librairie il y a une fonction getTime()

Get current data from the DS3231.
Parameters: None
Returns: Time-structure
Usage: t = rtc.getTime(); // Read current time and date.
---
Savez vous ce qu'est une structure en C ou C++ ? je vous suggère de creuser ce concept et de regarder les exemples de code qui sont aussi dans la librairie

Je connais les bases en C et C++, et je sais de quoi parle la librairie.
Mais, c'est ici les usages du code que je ne comprends pas.
J'ai écrit au début du code Time t; et j'ai écrit

t = rtc.getTime();
  t=t+10;

Mais il y a un message d'erreur.

Je voudrais juste ajouter 10 secondes, c'est tout con mais je n'y parviens pas.
Et oui j'ai lu ce que j'ai trouvé (documentation et internet).

C'est quoi le type de la variable t dans votre code ci dessus?

Je ne sais pas vraiment, j'ai écrit Time t; en dessous du define.
Mais repartons à zéro, dans mon code du début, que dois je rajouter pour afficher juste les secondes.

Bonjour,

Tout simplement:

  Time t=rtc.getTime();
  Serial.print(t.sec);

Bon, kamill a craqué :slight_smile:

Time comme dit dans la doc est une structure (struct). Comme toute structure elle contient donc des éléments accessibles par leur nom de variables qui sont donnés dans la doc (cf mon post #10)

Variables:
hour, min, sec: For holding time-data
date, mon, year: For holding date-data
dow: Day-of-the-week with Monday being the first day

Donc

Time t; // Define a structure named t of the Time-class
...
t = rtc.getTime(); // Read current time and date.
// ici t.sec, t.min, t.hour, t.year, t.mon, t.date, t.dow sont initialisés

Quand on dit que la doc arduino est insufisante et qu'il faut AUSSI lire des tuto de C de niveau débutant !

Merci, mais pourquoi ce code ne marche pas :

void loop()
{
  Time t=rtc.getTime();
  int x =0;
  x=x+1;
  Serial.print(rtc.getDOWStr());
  Serial.print(" ");

  Serial.print(rtc.getDateStr());
  Serial.print(" -- ");

  Serial.print(rtc.getTimeStr());
  Serial.println(" -- ");

  if( x=1 ) {t.sec=t.sec-14;}
}

Et c'est supposé faire quoi?

Merci, mais pourquoi ce code ne marche pas :

Parce qu'il n'y a pas de fonction setup()? :slight_smile:

moi je pense qu'il fonctionne. il ne fait sans doute pas ce que vous voulez, mais il fait ce que vous lui avez dit de faire...