Exercise 9: RTC and data logging

Introduction

The ESP32 has a real time clock implemented on chip. This will however only work as long as the ESP32 is powered. It may therefore be interesting to employ and external RTC like the DS1307, backed up with a battery, to keep time even when the ESP32 is powered off or in deep sleep mode.

Getting the current (GMT) time from the internet is easy when using the ntptime module. We can make use of this to setup our RTC with the correct time.

Exercise 1: Set the ESP32 to the current time read from the Internet

The module ntptime allows you to get the current UTC time from the NTP server. It's function settime() sets the time of the ESP32 real time clock. Write a module that connects to the Internet through Wifi and that sets up the ESP32 with the current UTC time

Check with the ESP32 RTC module that the time was correctly set.

Exercise 2: Set the ESP32 RTC manually

If you to not have Internet access you can still set up the ESP32 RTC manually.

Ask the user for the current date and time and set the real time clock in the ESP32 correspondingly. Read back the time a little later and print it out. Use a parser similar to the one we wrote in session 1, exercise 2, for the calculator to check the user input.

Be careful about the parameters passed into rtc.datetime((currentTime)). currentTime is a Python tuple with the following members: yyyy mm dd ww hh mm ss us where

  • yyyy: 4 digits for the year
  • mm: 2 digits for the month
  • dd: 2 digits for the day
  • ww: 2 digits for the day in the week. In fact these data do not seem to be used!
  • hh: the hour
  • mm: minutes
  • ss: seconds
  • us: microseconds (I always put these to 0)
You can actually calculate the ww parameter: the day in the week. You find the algorithm in
https://artofmemory.com/blog/how-to-calculate-the-day-of-the-week-4203.html

In my solutions I wrote a module esp32RTC with the following functions:

  • rtcSetUserTime(): This asks the user for date and in in the form yyyy mm dd hh mm ss
    It the calls parse, another function of the esp32RTC module checking user input and parsing it.
    rtcSetUserTime finally create a machine.RTC instance and sets the RTC with rtc.datetime()
  • rtcSetTime(year,month,day,hours,minutes,secs)
  • rtcGetTime() returning the current time as a tuple (yyyy,mm,dd,hh,mm,ss)
  • dayOfWeek(year,month,day) returning the code for the weekday (0=sun,6=sat)
  • dayOfWeekString(dayCode) returning a humanly readable string to the day of the week: "sun"..."sat"

Here is a screen dumps showing a session controlling the ESP32 RTC:

esp32RTC.png

Exercise 3: Set the DS1307 RTC

The disadvantage of getting the current time from the ESP32 RTC is that time is lost when the ESP32 is powered off. The DS1307 RTC however is batttery backed and time is kept even when the rest of the system is shut down.

Do the same thing with the DS1307 RTC

-- Uli Raich - 2020-05-06

Comments

Topic attachments
I Attachment History Action Size Date Who Comment
PNGpng esp32RTC.png r1 manage 43.5 K 2020-05-06 - 20:01 UliRaich  
Edit | Attach | Watch | Print version | History: r10 | r5 < r4 < r3 < r2 | Backlinks | Raw View | Raw edit | More topic actions...
Topic revision: r3 - 2020-05-07 - UliRaich
 
  • Edit
  • Attach
This site is powered by the TWiki collaboration platform Powered by PerlCopyright © 2008-2024 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback