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:
Le problème estprésent même si je commente les lignes tel que présenté ic.
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 *********************************
mais, si je place les lignes
en début de setup (comme dans les autres programme, la dérive n'existe plus.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 MyWatchDoggy.attachShutdown(myshutdown); MyWatchDoggy.setup(WDT_HARDCYCLE16S);
Le setup devient:
Le setup remis avec toutes les initialisations, et le programme avec toutes ces fonctionnalités,
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 *********************************
la dérive du temps à disparu...
C'est un problème d'interruption ? autre ? ...
si quelqu'un à une idée....
Merci
Michel
Partager