RTC DS3231 Bug

Salut a tous j’aimerai faire une horloge en temps réel a l’aide du module RTC DS3231! Après un bon moment passé a chercher sur le net j’y suis parvenu à l’exception d’un BUG ! Voila donc j’arrive à afficher sur un écran lcd Le jour de la semaine, la date, le mois,l’année et l’heure complète ! jusque la vous me dirais tous marche niquel mais le problème est que l’on est Mercredi et que sa m’affiche Dimanche … j’ai beau changé l’ordre des jours dans mon programme je n’arrive pas a changer se dimanche … AIDEZ moi SVP !!

RTC_DS3231_Bug.ino (1.21 KB)

bonjour,
essayes avec

char weekDay[7][4] = {"Dim", "Lun", "Mar", "Mer", "Jeu", "Ven","Sam" };

es tu bien certain de la ref de ton rtc?

testes avec ce code http://tronixstuff.com/2014/12/01/tutorial-using-ds1307-and-ds3231-real-time-clock-modules-with-arduino/

Merci de cette réponse ! hélas sa n’a rien changé mais pour une raison inconnue j’ai remplacer par

char weekDay[7][4] = {“Mer”, “Jeu”, “Ven”,“Sam”,“Dim”, “Lun”, “Mar” };

(oui je ne sait pas mettre le code dans un onglet bizarre…) Et la même si avant sa n’avait rien fait sa marche il m’affiche mercredi !!
Par contre je suis confronter a un nouveau problème le code marche pour mon arduino UNO (chinoise) mais je n’arrive pas a le téléverser sur ma nano (chinoise aussi) (CH340G) il me donne cette erreur:

avrdude: ser_open(): can’t open device “/dev/cu.wchusbserial1410”: Resource busy
ioctl(“TIOCMGET”): Inappropriate ioctl for device

Je ne sait pas quoi faire … si tu peut m’aider se serai cool :wink: sinon je crée un nouveau topic :slight_smile:

et aujourd'hui va marquer encore mercredi?

tu ne réponds pas aux questions.

es tu bien certain de la ref de ton rtc?

testes avec ce code http://tronixstuff.com/2014/12/01/tutorial-using-ds1307-and-ds3231-real-time-clock-modules-with-arduino/

Un RTC ne gère pas la cohérence entre la date et le jour de la semaine.

Il dispose simplement d’un compteur “jour semaine” qu’il incrémente de 1 à chaque bascule de date (minuit).
Ce compteur varie de 1 à 7, puis repasse à 1.
Par convention, 1=Dimanche, 2 = Lundi, etc. 7 = Samedi

Extrait de ta lib Sodaq_DS3231     uint8_t dayOfWeek() const  { return wday;}  /*Su=1 Mo=2 Tu=3 We=4 Th=5 Fr=6 Sa=7 */

Donc déjà, si tu utilises la valeur retournée par dayOfWeek() pour lire un tableau dont l’indice va de 0 à 6, tu as un premier cas de bug.

Ensuite, quand on utilise une lib “exotique” trouvée sur github, il n’y a aucune garantie de bon fonctionnement.
Il vaut mieux soulever le capôt et vérifier ce qu’elle contient, avant de l’utiliser les yeux fermés.
“exotique” = pas une lib référencée un peu partout sur le net et réputée fiable.

Dans le .cpp, certaines fonctions utilisées pour mettre à jour le RTC contiennent     wday = 0;        // FIXME This is not properly initialized

Conséquence : lorsque l’on met à jour la date du RTC, le compteur “jour semaine” est mal initialisé.

Conclusion : deux options
a) tu adoptes une lib correcte pour gérer le RTC
b) tu conserves ton baril de lessive, mais tu dois gérer toi-même le calcul du jour de la semaine

option a1) utilise la RTClib (beurk <= opinion personnelle)
option a2) utilise la simpleRTC que tu trouveras dans les tutoriels de ce forum (exotique aussi, mais je la recommande :smiling_imp: )

option b)

uint8_t calculerJoursem(uint8_t annee, uint8_t mois, uint8_t jour)
{
  //annee sur deux chiffres uniquement (sans siècle)
  //valeur retournée : 0 Dim, 1 Lun, ..., 6 Sam
  uint8_t somme = annee + (annee >> 2) + jour;
  switch (mois)
  {
    case  2 :
    case  3 :
    case 11 : somme++;    break;
    case  6 : somme += 2; break;
    case  9 :
    case 12 : somme += 3; break;
    case  4 :
    case  7 : somme += 4; break;
    case  1 :
    case 10 : somme += 5; break;
    case  5 : somme += 6;
  }
  if (mois > 2 || (annee & 3)) somme++;
  return somme % 7;
}