I have a working Wemos D1 Mini setup measuring temperature and sending it over wifi to my server. Now I'm using a battery powered unit, and playing around with power consumption optimization and how to reduce it.

One thing I need is time (current, either epoch or DST) - so I implemented NTP, but everytime my ESP is waking up after deep-sleep, it needs to reconnect to wifi, gather time, measure temperature, send results.

This pdf states that ESP8266 has an internal clock. I'm having troubles finding anything beside "RTC shields on Wemos/Arduino" or "NTP on ESP8266" on the internet about something that is like an internal clock. There must be something, because otherwise it could not work (my understanding about clock and hardware is limited by now).

My question is: can I use NTP to update my internal clock, using it for some minutes (I think it will drift after some minutes), updating via NTP once in a while - to simply reduce network traffic and still use deep-sleep mode?

Any hints are welcome!

  • this is not an answer, but I want to show you how to simply get NTP time in esp8266 Arduino: github.com/jandrassy/TelnetStream/blob/… This will set the time in the internal RTC (there is no other way)
    – Juraj
    Aug 6, 2020 at 9:23

1 Answer 1


I think the answer to your question can best be summed up by one word: "Kinda".

The best reasoning is the NodeMCU Lua documentation which states:

Time keeping on the ESP8266 is technically quite challenging. Despite being named RTC, the RTC is not really a Real Time Clock in the normal sense of the word. While it does keep a counter ticking while the module is sleeping, the accuracy with which it does so is highly dependent on the temperature of the chip. Said temperature changes significantly between when the chip is running and when it is sleeping, meaning that any calibration performed while the chip is active becomes useless mere moments after the chip has gone to sleep. As such, calibration values need to be deduced across sleep cycles in order to enable accurate time keeping. [...]

So while it's called RTC it's not an RTC in the traditional sense - it's merely a timer that runs even when sleeping, but not with any degree of accuracy.

You can access the current RTC count with the Non OS SDK function

uint32_t system_get_rtc_time()

You can combine that with

uint32_t system_rtc_clock_cali_proc()

which gives you the number of uS per tick of the RTC timer.

There's no way to change the RTC timer count, so you will have to work out some "delta magic" to update your own internal time value (an epoch value is simplest) from the difference between successive calls to get the RTC count.

All somewhat tricky and the accuracy won't be great anyway, so you'll be wanting to use NTP to update that epoch value regularly.

But it could give you a "rough idea" of how long you've been asleep for, etc.

You would have to run some experiments to know how much the time drifts compared to the NTP value in real usage.

  • Kinda, if you don't call deepSleep. Quoting the 3.0.2 SDK API Reference, "If an external hardware reset the chip via EXT_RST or CHIP_EN (such as timed wakeup from Deep-sleep), the RTC timer will be reset." Arduino sketch ported from mentioned reference.
    – DWB
    Jan 28, 2022 at 22:38

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.