Bonjour,

Je viens soumettre un problème à votre sagacité.

J'utilise des MHR1010 WiFi, car il ont un RTC à 32Khz, un adaptateur WiFi, et suffisament de mémoire pour contenir les programmes.

Ce que je fais,
Le MKR1010 sert à lire des capteurs (température) et à transmettre ces information à une DB via un client WEB.

J'ai une application ou je lis plusieurs capteurs via un multiplexeur I2C PCA9584A et pour éviter les plantages j'utilise la fonction Watchdog.

Jusque là, tous va bien...

Cependant, avec une nouvelle version de mon programme, je constate que le RTCzero dérive fortement dans le temps.
Après une journée, le RTC à perdu près de 30 minutes.
Malgrè des remise à l'heure via NTC, le problème reste.



Après de nombreuse recherche du pourquoi ce programme ne fonctionne pas(alors que d'autre programmes fonctionnent très bien sans dérive significative duRTC, j'en ai constaté ceci,

Dans mon setup, j'initialise le Watchdog en fin de setup:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
oid setup() {
  Serial.begin(9600);
  delay(2000);
  Serial.println(LIGNE);
  Serial.println(F("\tDebut setup"));
  Wire.begin();
  tps.begin();
  LitEpoch();
  SetDte(1);
  PrintWiFiStatus();
  sec = tps.getSeconds();
  //********         Initialisation du OLED     ***********************
  OledInit();
 
  //*********    Initialize Multiplexeur   ********************
  Serial.println(F("\n\tTst I2C"));
  mx.ScanMulti(IOsensor, 1);
  Serial.print(F("I found "));
  Serial.println(IOsensor[8]);
  for (byte i = 0; i < 9; i++) {
    Serial.print(IOsensor[i]);
  }
  Serial.println();
   // Declare les capteur SHT31en fonction des IO occupé. Adresse SHT31 =68
  if (IOsensor[8] != 0) {
    for (byte i = 0; i < 8; i++) {
      if (IOsensor[i] == 1) {
        mx.IO(i);
        sht[i].begin(68);
        Vmt[i].dTT = (sht[i].readTemperature());
        Vmt[i].dRH = (sht[i].readHumidity());
      }
    }
  }
  OledClear();
  OledAffMulti();
  OledPrepare();
  OledMesg(("Setup OK"));
  // initialize WDT
  MyWatchDoggy.attachShutdown(myshutdown);
  MyWatchDoggy.setup(WDT_HARDCYCLE16S);
 
  //**************   FIN DU SETUP   *********************************
  Serial.println();
  Serial.println(LIGNE);
  Serial.println(VERSION);
  Serial.println(NOMPRG);
  Serial.println(LIGNE);
}  //**************   FIN DU SETUP   *********************************
Le problème estprésent même si je commente les lignes tel que présenté ic.
mais, si je place les lignes
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
  MyWatchDoggy.attachShutdown(myshutdown);
  MyWatchDoggy.setup(WDT_HARDCYCLE16S);
en début de setup (comme dans les autres programme, la dérive n'existe plus.
Le setup devient:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 void setup() {
  Serial.begin(9600);
  delay(2000);
 
  // initialize WDT
  MyWatchDoggy.attachShutdown(myshutdown);
  MyWatchDoggy.setup(WDT_HARDCYCLE16S);
 
  Serial.println(LIGNE);
  Serial.println(F("\tDebut setup"));
 
  Wire.begin();
 
  tps.begin();
...........
}  //**************   FIN DU SETUP   *********************************
Le setup remis avec toutes les initialisations, et le programme avec toutes ces fonctionnalités,
la dérive du temps à disparu...


C'est un problème d'interruption ? autre ? ...

si quelqu'un à une idée....

Merci


Michel