Pb avec RTC Lib version 1.14

Bonjour,

Suite à la maj de RTC Lib Adafruit de 1.13 vers 1.14, plus aucun programme ne fonctionne, que ce soient les miens ou d'autres provenances.
Ca compile bien, le setup s'exécute bien mais la loop ne se lance pas et ca reboot sur le setup en boucle.
J'ai remis la version 1.13 et tout refonctionne très bien.

Tout ca sur une mega 2560, une DS3231 et un ecran tft.

Quelqu'un a eu le même problème ?

J'ai pas mis de code puisque quelque soit le code et sa provenance, avec la ver 1.14 ca marche pas si on utilise RTC Lib bien sûr

je viens de tester sur Arduino Mega avec l'exemple DS3231 et ça fonctionne comme il faut en 1.13 et 1.14... pas de reboot

avez vous bien connecté vos pins?

Oui oui je ne change rien du tout entre les deux versions.
J’ai regardé sur github et la nouvelle version est testée ok sur Mega avec pins 20 et 21.
Du coup je reste en version 1.13
Ça fonctionnera peut être avec la 1.15
:slightly_smiling_face:

il doit y avoir autre chose... pour moi ça fonctionne sans souci.

je vois défiler

2021/7/23 (Friday) 18:43:34
 since midnight 1/1/1970 = 1627065814s = 18831d
 now + 7d + 12h + 30m + 6s: 2021/7/31 7:13:40
Temperature: 32.25 C

2021/7/23 (Friday) 18:43:37
 since midnight 1/1/1970 = 1627065817s = 18831d
 now + 7d + 12h + 30m + 6s: 2021/7/31 7:13:43
Temperature: 32.25 C

2021/7/23 (Friday) 18:43:40
 since midnight 1/1/1970 = 1627065820s = 18831d
 now + 7d + 12h + 30m + 6s: 2021/7/31 7:13:46
Temperature: 32.25 C

(fait chaud)

Oui sûrement je vais regarder ça plus en détail

Juste une petite question pour guider ma recherche :
Qu.est ce qui pourrait faire rebooter le setup en boucle ? Plutôt un pb matériel ou de code.

je sais qu’en l’état ma question relève plus de la voyance mais comme je change rien au code

On est bien d'accord que vous avez 4 fils connectés :

RTC ➜ MEGA
GND ➜ GND
Vcc ➜ 5V
SDA ➜ 20
SCL ➜ 21

et rien d'autre de connecté à votre MEGA quand vous effectuez le test avec l'exemple DS3231

La ds3231 est bien connectée.
Par contre tout le reste est connecté également : l’écran tactile tft, les sondes ds18b20, les relais etc…..
Puisque tout fonctionne ensemble en version 1.13.
Je me doute bien que le pb est chez moi et pas dans la Lib mais là je peux rien déconnecter et ne laisser que l’heure sinon mes poissons seront pas contents du tout

vous pouvez voir les changements entre la 13 et 14 ici

principalement c'est le support d'une instance spécifique de TwoWire pour SAMD

Ok je regarde tout ça demain

Merci pour le renseignement

J'ai comparé les deux RTC Lib pour l'instant et sauf erreur de ma part je ne vois que pour la partie DS 3231 (c'est pareil pour 1307 et pcf) les différences suivantes :

Version 1.14 :

class RTC_DS3231 {
public:
  boolean begin(TwoWire *wireInstance = &Wire);

et plus loin

protected:
  TwoWire *RTCWireBus; 

Version 1.13 :

class RTC_DS3231 {
public:
  boolean begin(void);

Mais là j'avoue que je ne sais pas quoi faire

S'il n'y a que cette différence, je ne vois pas le problème. Wire est l'instance par défaut de l'interface I2C.
La version 1.13 utilise Wire.
La version 1.14 utilise Wire par défaut, mais permet de spécifier une autre instance, afin de pouvoir utiliser une autre paire SDA SCL.
Par exemple, l'ESP32 en possède plusieurs. Actuellement, c'est une constante chez AdaFruit de faire évoluer ses librairies I2C pour qu'elles puissent fonctionner sur différentes interfaces I2C (exemple : Adafruit_SSD1306).

Avec plus d'attention de ma part voici d'autres différences :
Version 1.13 :

static void adjust(const DateTime &dt);

static DateTime now();
  static Ds3231SqwPinMode readSqwPinMode();
  static void writeSqwPinMode(Ds3231SqwPinMode mode);

static float getTemperature(); // in Celsius degree

Version 1.14 :

void adjust(const DateTime &dt);

 DateTime now();
  Ds3231SqwPinMode readSqwPinMode();
  void writeSqwPinMode(Ds3231SqwPinMode mode);

float getTemperature(); // in Celsius degree

Je n'ai pas regardé le RTC Lib.cpp pour l'instant

Déclarer les méthodes static ne va pas créer le souci de reboot

Comme tout fonctionne correctement avec les 2 versions sur une MEGA "nue", je serai tenté de regarder sur le reste de votre code et montage. La modification de la bibliothèque a peut être simplement déplacé un peu les données en mémoire et un débordement que vous aviez précédemment pas remarqué vient peut-être maintenant mettre le bazar.

Si vous activez tous les warning à la compilation, en avez vous pour votre code?

La transformation des anciennes méthodes de classe (static) en méthodes d'instance va dans le sens de plus de rigueur, et aussi avoir la possibilité de travailler sur plusieurs instances.
Pour un DS3231 cela offre peu d'intérêt, mais pour d'autres composants c'est un plus.

C'est une possibilité en effet.

Charger un exemple de la librairie ne durera pas assez longtemps pour engendrer une perturbation. Aucun besoin de tout débrancher.

J'ai mis à jour ma librairie en version 1.14, et compilé / rechargé un projet de porte automatisée en fonction de l'heure.

ResolveLibrary(RTClib.h)
  -> candidates: [RTClib@1.14.0]

Aucun problème.

Très étonnant par contre.

@J-M-L
J’ai quelques avertissements mais uniquement pour l.écran et j.utilise 11% de mémoire programme et 15% de dynamique.

@hbachetti
Je vais essayer un exemple de la lib 1.14 sans rien débrancher.

Je vous direz ce qu.il en est

oui mais ça n'empêche pas un débordement de tableau qui écraserait une autre variable par exemple
c'est juste une hypothèse bien sûr

Bonjour,
je déterre mon sujet car j'ai un peu de temps pour résoudre ce problème. J'ai réduit le code à sa plus simple expression en gardant la partie incriminée.
Tout fonctionne très bien jusqu'à la version 1.13 de la RTClib d'Adafruit. L'heure et la date s'affichent correctement sur le lcd.
Dès que je mets à jour la librairie de 1.14 jusqu'à 2.01, plus rien de s'affiche sur l'écran. Aucun avertissement à la compilation et le téléversement se déroule normalement.

Ci-dessous le dessin Fritzing de l'ensemble.

Le code :

#include <RTClib.h>
#include <OneWire.h>

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);

// Variables et broches pour la RTC DS3231 & la gestion du temps
RTC_DS3231 rtc; // Pour DS3231
int aaaa, mm, jj, jourSemaine, hh, mn, sec;
char jourDeLaSemaine[7][4] = {"Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam"};
char moisDeLAnnee[12][9]  = {"Janvier", "Fevrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Aout", "Septembr", "Octobre", "Novembr", "Decembr"};

// Variables pour le programme
int heureProg; // variable Heure pour programme: Hx100 + minutes
int jdM;

const int interval2 = 5000;  const int interval3 = 11000;
const int interval4 = 20000;
unsigned long dureeAffich;
int etatAlarmeChauffage = 0; int etatAffich = 0;


void setup() {

  lcd.begin();
  Serial.begin(115200);

  //if (rtc.lostPower()) {
  //rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // régle la date et l'heure automatiquement au moment de la complation
  //}
  //rtc.adjust(DateTime(2021, 11, 17, 14, 59, 0)); // régle la date et l'heure définie par l'utilisateur

}


void loop() {

  // Calcul heureProg
  DateTime now = rtc.now();
  aaaa = now.year(); mm = now.month() - 1;
  jj = now.day(); jourSemaine = now.dayOfTheWeek();
  hh = now.hour(); mn = now.minute(); sec = now.second();

  // Affichage de la date et de l'heure en alternance sur la premiére ligne du lcd

  // Affichage de la date, de l'heure et des températures

  // Affichage 1 : date, eclairage led et temp rtc ou air ou eau
  {
    if (millis() - dureeAffich < interval2) {
      if (!etatAlarmeChauffage) {
        affichDate();
      }
    }
    // Affichage 2 : heure, eclairage PP , Sec et temp rtc ou air ou eau
    if ((millis() - dureeAffich >= interval2) && (millis() - dureeAffich < interval3)) {
      if (!etatAlarmeChauffage) {
        affichHeure();
      }
    }

    // Affichage 3 : heure, eclairage PP, Sec et temp rtc ou air ou eau
    if ((millis() - dureeAffich >= interval3) && (millis() - dureeAffich < interval4)) {
      if (etatAlarmeChauffage == 0) {
        affichHeure();
      }
    }
    if (millis() - dureeAffich >= interval4) {
      dureeAffich = millis();
    }
  }
}

// Affichage de l'heure et de la date

void affichHeure() {
  lcd.setCursor(0, 0); lcd.print("      ");
  if (hh < 10) {
    lcd.print(" ");
  }
  lcd.print(hh);
  lcd.print(":");
  if ((mn) < 10) {
    lcd.print("0");
  }
  lcd.print(mn);
  lcd.print(":");
  if (sec < 10) {
    lcd.print("0");
  }
  lcd.print(sec); lcd.print("      ");
}

void affichDate() {
  lcd.setCursor(0, 0); lcd.print(jourDeLaSemaine[jourSemaine]); lcd.print(" ");
  lcd.print(jj); lcd.print(" ");
  lcd.print(moisDeLAnnee[mm]); lcd.print(" "); lcd.print(aaaa);
}

si quelqu'un a une petite idée, cela m'aiderait bien

Merci