NODEMCU / ESP8266 und deepSleep - Genauigkeit?

Hallo,

ich möchte mit einem NODEMCU bzw. ESP8266 regelmäßige (alle 60 Sek.) Messungen machen. Zwischen den Messungen soll er schlafen um Strom zu sparen. Nach 60 Messungen sollen die Messwerte via GSM übertragen werden. Klappt so weit auch, allerdings sind mir die Zeitabstände nicht genau genug. Statt 60 sind es nur ca. 58 Minuten.
Zum testen habe ich mal einen Sketch ohne alles drumherum gemacht.

unsigned long nSleepZeit = 60000000;             // 1 Minute

// --------------------------------------------------------------------
void setup()
{
  Serial.begin(74880);


  for (int j = 0; j < 100; j++)            // macht etwas
  {
    delay(100);
  }
  nSleepZeit = nSleepZeit - micros();        // bisherige Laufzeit Programm


  Serial.println("Schlafen für " + String(nSleepZeit / 1e6, 5) + " Sekunden");
  ESP.deepSleep(nSleepZeit);
}
// --------------------------------------------------------------------
void loop()
{
}

Die Schleife soll 100 Messungen zu je 100 mS simulieren. Diese Laufzeit(ca. 10 Sek.) wird mit micros() erfasst und von der vorgegebenen SleepZeit abgezogen. Aber so komme ich nur auf ca. 57,5 Sekunden Abstand.

10:17:38.165 → ets Jan 8 2013,rst cause:2, boot mode:(3,6)
10:18:35.655 → ets Jan 8 2013,rst cause:2, boot mode:(3,6)
10:19:33.230 → ets Jan 8 2013,rst cause:2, boot mode:(3,6)

Wenn ich die Schleife und die Zeile mit der micros()-Korrektur auskommentiere sollten es ja 60 Sek. SleepZeit sein. Aber auch dann stimmt es um knapp 1 Sek. nicht.

10:35:30.992 → ets Jan 8 2013,rst cause:2, boot mode:(3,6)
10:36:30.139 → ets Jan 8 2013,rst cause:2, boot mode:(3,6)
10:37:29.406 → ets Jan 8 2013,rst cause:2, boot mode:(3,6)

Ist dieses deepSleep() so ungenau oder habe ich einen Denkfehler? Hat da jemand Erfahrung damit?

Hi

Der µC ist nicht als hoch präzise Atomuhr konzipiert - weshalb Er sich wohl auch nicht so genau an die Zeiten hält.
Mit einer RTC (z.B. DS3231) kommst Du auf wenige Sekunden im Jahr, kannst der RTC beibringen, alle x Sekunden einen Interrupt abzusondern und mit Deinem µC Diese zählen, oder wenn die Zwischenzeit genau passt, halt was machen.

Die Ungenauigkeiten kommen daher, daß der Quarz nicht temperaturstabilisiert ist - die RTC misst alle 64 Sekunden die Temperatur und passt den eigenen Zähler so an, daß Das ausgeglichen wird.

MfG

Hallo,

für eine RTC habe ich leider hardwaremäßig keinen Platz mehr, so wichtig ist mir das auch nicht.
Aber auch ohne Temperaturkompensation dürfte ein Quarz nicht so weit daneben liegen (1 Sek. Abweichung bei 60 Sek. Laufzeit sind 1,6 %). Und wieso hängt das noch von dem ab was im Programm passiert (mit der Schleife) ?

Hi

Naja - wenn Dein Quarz 16,16MHz liefe, wären Das 1% zu schnell.
Wenn der Quarz bei den vorhandenen Temperaturen eh zu schnell unterwegs ist, steigert sich der Fehler noch weiter.

Ggf. läuft Dein Quarz halt 'am oberen Limit' und die Temperatur tut das Übrige beisteuern.
Stell das Teil Mal in die Kühltruhe und schaue, ob Du von den 58 Sekunden weg kommst.

Hast Du 'keine Beine mehr', oder wieso passt die RTC nicht mehr rein?
Mit der Wichtigkeit widersprichst Du Dir aber jetzt schon etwas - zwei Posts vorher waren die 58 Sekunden (nahezu) unhaltbar, da erst alle Minute eine Messung kommen sollte.
(wobei man Das auch mit einer anderen Wartezeit regeln könnte)

Der Deep-Sleep - wird Der zufällig über den WatchDog abgehandelt?
Dessen Genauigkeit ist noch unterirdischer - Der soll (im Normalfall) ja auch nur dazwischen funken, wenn sonst Nichts mehr geht und sich nicht um den Sekundenzeiger kümmern.
(wobei ich irgendwo eine Seite hatte, Die sich die Differenzen zwischen WatchDog und Quarz/internem Takt (weiß nicht mehr) irgendwie zu Nutze machte)

MfG

MfG

uk1408:
Aber auch ohne Temperaturkompensation dürfte ein Quarz nicht so weit daneben liegen

Wir kommst du auf die lustige Idee, dass der Quarz des ESP weiter tickt, wenn du das Ding in den Tiefschlaf schickst?
Nee...
Das wird per RC Oszillator erledigt.

combie:
Wir kommst du auf die lustige Idee, dass der Quarz des ESP weiter tickt, wenn du das Ding in den Tiefschlaf schickst?
Nee…
Das wird per RC Oszillator erledigt.

Das war nicht meine Idee…
Wenn das ein simpler Oszillator ist kann ich das nachvollziehen.
Die Schaltung ist fertig aufgebaut und läuft. Und in das Gehäuse passt nichts mehr rein, deshalb keine RTC.
Und es hat mich einfach interessiert was der Grund für die Ungenauigkeit sein kann. ::slight_smile:

Das war nicht meine Idee....

Dann siehe hier: Table 1-1. Differences between 3 Sleep Modes

Denn oft macht es Sinn die Herstellerdokumentation zu befragen, wenn sie auch im Falle des ESP nicht unbedingt die schönste ist.
Wenn man da tiefer wühlt, finden sich auch (fadenscheinige) Angaben, welche nahe legen, dass man die RTC kalibrieren kann, dass sie vom Werk her schon kalibriert wurde.
Aber auf Grund der großen Temperatur abhängigen Drift, macht das alles herzlich wenig Sinn.