In this tutorial we’ll show you how to get date and time using the ESP32 and Arduino IDE. Getting date and time is especially useful in data logging to timestamp your readings. If your ESP32 project has access to the Internet, you can get date and time using Network Time Protocol (NTP) – you don’t need any additional hardware.
Note: there’s an easier and updated guide to get date and time with the ESP32 with the pre-installed time.h library: ESP32 NTP Client-Server: Get Date and Time (Arduino IDE).
Before proceeding with this tutorial you should have the ESP32 add-on installed in your Arduino IDE. Follow one of the following tutorials to install the ESP32 on the Arduino IDE, if you haven’t already.
- Installing ESP32 Board in Arduino IDE 2 (Windows, Mac OS X, Linux)
- Installing ESP8266 NodeMCU Board in Arduino IDE 2 (Windows, Mac OS X, Linux)
NTP Client Library
IMPORTANT: we’re not using the default NTPClient library. To follow this tutorial you need to install the library we recommend using the following steps.
The easiest way to get date and time from an NTP server is using an NTP Client library. For that we’ll be using the NTP Client library forked by Taranais. Follow the next steps to install this library in your Arduino IDE:
- Click here to download the NTP Client library. You should have a .zip folder in your Downloads
- In your Arduino IDE, go to Sketch > Include Library > Add . ZIP library…
- Select the .ZIP file of the library you just downloaded.
- The library will be installed after a few seconds.
Getting Date and Time from NTP Server
Here we provide a sample code to get date and time from the NTP Server. This example was modified from one of the library examples.
/*********
Rui Santos
Complete project details at https://randomnerdtutorials.com
Based on the NTP Client library example
*********/
#include <WiFi.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
// Replace with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
// Define NTP Client to get time
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP);
// Variables to save date and time
String formattedDate;
String dayStamp;
String timeStamp;
void setup() {
// Initialize Serial Monitor
Serial.begin(115200);
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
// Print local IP address and start web server
Serial.println("");
Serial.println("WiFi connected.");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
// Initialize a NTPClient to get time
timeClient.begin();
// Set offset time in seconds to adjust for your timezone, for example:
// GMT +1 = 3600
// GMT +8 = 28800
// GMT -1 = -3600
// GMT 0 = 0
timeClient.setTimeOffset(3600);
}
void loop() {
while(!timeClient.update()) {
timeClient.forceUpdate();
}
// The formattedDate comes with the following format:
// 2018-05-28T16:00:13Z
// We need to extract date and time
formattedDate = timeClient.getFormattedDate();
Serial.println(formattedDate);
// Extract date
int splitT = formattedDate.indexOf("T");
dayStamp = formattedDate.substring(0, splitT);
Serial.print("DATE: ");
Serial.println(dayStamp);
// Extract time
timeStamp = formattedDate.substring(splitT+1, formattedDate.length()-1);
Serial.print("HOUR: ");
Serial.println(timeStamp);
delay(1000);
}
To get more NTP examples, in the Arduino IDE, go to File > Examples > NTPClient.
How the Code Works
Let’s take a quick look at the code to see how it works. First, you include the libraries to connect to Wi-Fi and get time and create an NTP client.
#include <WiFi.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
Setting SSID and password
Type your network credentials in the following variables, so that the ESP32 is able to establish an Internet connection and get date and time from the NTP server.
// Replace with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
Preparing NTP Client
The following two lines define an NTP Client to request date and time from an NTP server.
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP);
Then, initialize String variables to save the date and time.
String formattedDate;
String dayStamp;
String timeStamp;
In the setup() you initialize the Serial communication at baud rate 115200 to print the results:
Serial.begin(115200);
These next lines connect the ESP32 to your router.
// Initialize Serial Monitor
Serial.begin(115200);
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
// Print local IP address and start web server
Serial.println("");
Serial.println("WiFi connected.");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
Next, initialize the NTP client to get date and time from an NTP server.
timeClient.begin();
You can use the setTimeOffset() method to adjust the time for your timezone in seconds.
timeClient.setTimeOffset(3600);
Here are some examples for different timezones:
- GMT +1 = 3600
- GMT +8 = 28800
- GMT -1 = -3600
- GMT 0 = 0
These next lines ensure that we get a valid date and time:
while(!timeClient.update()) {
timeClient.forceUpdate();
}
Note: sometimes the NTP Client retrieves 1970. To ensure that doesn’t happen we need to force the update.
Getting date and time
Then, convert the date and time to a readable format with the getFormattedDate() method:
formattedDate = timeClient.getFormattedDate();
The date and time are returned in the following format:
2018-04-30T16:00:13Z
If you want to get date and time separately, you need to split that string. The “T” letter separates the date from the time, so we can easily split that String. That’s what we do in these next lines.
// Extract date
int splitT = formattedDate.indexOf("T");
dayStamp = formattedDate.substring(0, splitT);
Serial.println(dayStamp);
// Extract time
timeStamp = formattedDate.substring(splitT+1, formattedDate.length()-1);
Serial.println(timeStamp);
The date is saved on the dayStamp variable, and the time on the timeStamp variable.The time is requested and printed in every second.
Testing the Code
Upload the code to the ESP32. Make sure you have the right board and COM port selected. After uploading the code, press the ESP32 “Enable” button, and you should get the date and time every second as shown in the following figure.
Wrapping Up
In this tutorial we’ve shown you how to easily get date and time with the ESP32 on the Arduino IDE using an NTP server. The code provided is not useful by itself. The idea is to use the example provided in this guide in your own projects to timestamp your sensor readings.
This method only works if the ESP32 is connected to the Internet. If your project doesn’t have access to the internet, you need to use other method. You can use an RTC module like the DS1307.
We have other tutorials related with ESP32 that you may also like:
- Learn ESP32 with Arduino IDE Course
- ESP32 Data Logging Temperature to MicroSD Card
- ESP32 Publish Sensor Readings to Google Sheets
- Build an All-in-One ESP32 Weather Station Shield
- Getting Started with ESP32 Bluetooth Low Energy (BLE)
- ESP32 with LoRa using Arduino IDE
Thanks for reading.
Thanks for this and all of your tutorials, they are great and easy to follow. You provide a great service for all of us hobbyist that love to make projects with the Arduino but don’t have a lot of programming skills. Again thanks.
Hi Ruis, thanks for explaining.
But I get a compilation error:
/home/hans/Arduino/CV_temperatuurmeter__NTPClient/CV_temperatuurmeter__NTPClient.ino: In function ‘void loop()’:
CV_temperatuurmeter__NTPClient:96: error: ‘class NTPClient’ has no member named ‘getFormattedDate’
formattedDate = timeClient.getFormattedDate();
Can you tell me whatÅ› going wrong ? Because getFormattedDate() is mentioned within the library
never mind….. the old conflicts between small letters and capitals…. pffff
I have the same problem, so what is the solution? should I change the capital letters with the small letters?
Don’t know if you’re still having an issue, gaga, but I found this.
github.com/arduino-libraries/NTPClient/issues/36
and found that while the getFormattedDate() is in the .h file, it was absent from the .cpp. I ended up using their additions and adding this to NTPClient.cpp
String NTPClient::getFullFormattedTime() {
time_t rawtime = this->getEpochTime();
struct tm * ti;
ti = localtime (&rawtime);
uint16_t year = ti->tm_year + 1900;
String yearStr = String(year);
uint8_t month = ti->tm_mon + 1;
String monthStr = month tm_mday;
String dayStr = day tm_hour;
String hoursStr = hours tm_min;
String minuteStr = minutes tm_sec;
String secondStr = seconds < 10 ? "0" + String(seconds) : String(seconds);
return yearStr + "-" + monthStr + "-" + dayStr;
and this to NTPClient.h
String getFullFormattedTime();
int getYear();
int getMonth();
int getDate();
Hopefully that helps!
Hi Marshall.
Thank you for sharing your solution.
I’ll have to take a look through this.
Regards,
Sara
Your solution doesn’t address the issue mentioned, that is getFormattedDate() does not exist. I copied your code into the cpp file and still get the same compilation error.
Hi.
Make sure you use the NTP Client library we mention in the tutorial and follow the suggested installation method.
Regards,
Sara
But what if the Internet connection goes down? The solutioncould be using TimeLib library as backup.
And NTP server to update TimeLib from time to time.
I did that for ESP8266 but for ESP32 I had no success.
Thanks, Rui!
I get the date and time from my router using
client.print(“GET / HTTP/1.1\r\n Host: 192.168.1.254 \r\nConnection: close\r\n\r\n’ | nc 192.168.1.254 80” );
which returns the local time.
Hi Colin.
We haven’t tried that method.
But it seems very practical! Thank you for sharing.
Regards,
Sara 🙂
It wasn’t so good when I changed my router and it no longer works. Having to use your method now.
It would great to go one step further, by writing the time to ds3132/ds1307 and reading from ds3132/ds1307 every 6 hours.
Hi.
Yes, that is a great idea. We intend to make a tutorial on how to use the DS1307 RTC with the ESP32.
Regards,
Sara 🙂
I have the same issue, what NTPClient Library are you using please?
Seems some of them do not support the Date
Hi Anthony.
We’re using the NTP library forked by Taranais.
Here is the github page: github.com/taranais/NTPClient
I hope this helps.
Regards,
Sara 🙂
Hi, I really appreaciate that you provided all that information for us. Thanks!
I am currently working on a project and I need to timestamp some sensor readings, as you exemplified. I’m not quite sure on how to do that, though. Any help would be awesome!!! Could you give me some tips?
Thanks again.
Hello Angelo,
This project gives you the time and date (which are the timestamps), you just need to save those values in the SD card…
Regards,
Rui
I posted a one line GET that gets the local date time from my router. The post was deleted for some reason. If you want I can send it to you later when I have access to my code. Assuming this gets through !
Hi Colin.
We receive a lot of comments everyday, so it’s a bit difficult to manage all comments.
Your post wasn’t deleted. It was waiting for approval.
I was able to find your comment, and it is now approved.
I’m sorry for the inconvenience.
Regards,
Sara 🙂
Sorry, I misjudged you. Thought you didn’t like any competition !
We’re always open to new ways to make things and learn more.
So, all opinions are welcome.
Thank you 🙂
please colin send to me , thank you. [email protected]
Hello,
when I set the ip, it stops syncing with the ntp server. What can be?
Thank you!
Hi.
I have no idea.
You need to provide more information.
Regards,
Sara 🙂
Cannot declare variable ‘ntpUDP’ to be of abstract type ‘WiFiUDP’
Line 10.
The problem came when compiling for esp8266, Wemos D1mini. Anyone having the same problem or anyone who know how to fix this
Hi Nicholas.
Please double check that you’ve installed this library and see if it solves your problem: https://github.com/taranais/NTPClient
Regards,
Sara
Have you checked to be sure you don’t have the library or header file in another location in you Libraries folder? Delete all other occurrences in the folder, close your IDE and try again.
all in all it shows how sick this is: esp8266 provides hundreds of working examples for getting the time from an ntp server out there.
For esp32 you’ll find as many examples that DON’T do. If we can’t
Please don’t get me wrong: I really approciate your help but if the foundation is wrong with both, esp’s as well as the i-net itself, it won’t solve the general issue.
Hello,
First of all, thank you very much for the article! It’s really nice.
I realised this method doesn’t take in count summer time change, so it is necessary to change the time manually twice every year.
Is there any example or server to get the time from, and which takes into account this summer time change?
Thank you very much in advance,
Xabi
Hi.
This doesn’t take into account summer time change.
In the following link, people suggest that you verify the date and make the changes accordingly: github.com/arduino-libraries/NTPClient/issues/40
I hope this helps.
Regards,
Sara
Hey.
How can I change the date display from (Y-M-D) 2019-10-6 to 6-10-2019 ( D-M-Y). Because that is the European way of representation.
Thank you for your beautiful and educational work.
Greetings from Bert in the Netherlands.
Hi Bert.
The method we use here gets the date in that format.
You may cut the string to save the month, year and day on different variables and then concatenate the variables in your desired order.
Regards,
Greetings from Portugal 😀
Is There an Example of Converting Date Format?
Thank you.
Yes i now, but don’t know how to do that, I didn’t succeed, sorry. Can you explain briefly how to do it?
I was in Tavira 12 years ago, too hot !! haha
Winter now here.
Hi Bert.
You can use the substring() method to get a substring of a string.
So, for example, to get the year, month and day on different strings, you can add the following to your code.
String year = dayStamp.substring(0,4);
String month = dayStamp.substring(5,7);
String day = dayStamp.substring(8);
Learn more about the substring method here: https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/substring/
I hope this helps.
Regards,
Sara
(Autumn here, but still warm :D)
I was looking for an example Thank you. You guys are great.
Very usable sample tutorial!
More power to you Rui and Sara!
Thanks a lot!
Thanks 😀
Thanks
I can not get the date for this program. If I change the command “getFormattedDate” for getFormattedTime” works fine but it does not give me the date. I changed the library NTPClient for the one suggested here. However it does not work. To see if the problem was the IDE , I re installed the last version in a very a neat way removing upto arduino15 files. Howver, the problem continues. I would be very thankfull if you give me any clue to solve the problem. I add the compilation print out.
Sincerely yours
washington
Arduino:1.8.12 (Windows 10), Tarjeta:”ESP32 Wrover Module, Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS), QIO, 80MHz, 921600, None”
C:\Users\washington\MIS_ARDUINO_FILES\PROYECTO_RIEGO_AUTOM\ESP32_WEB_SD\ESP32_WEB_SD.ino: In function ‘void getTimeStamp()’:
ESP32_WEB_SD:161:30: error: ‘class NTPClient’ has no member named ‘getFormattedDate’
formattedDate = timeClient.getFormattedDate();
Se encontraron varias bibliotecas para “SD.h”
Usado: C:\Users\washington\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.4\libraries\SD
No usado: C:\Program Files (x86)\Arduino\libraries\SD
Se encontraron varias bibliotecas para “WiFi.h”
Usado: C:\Users\washington\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.4\libraries\WiFi
No usado: C:\Program Files (x86)\Arduino\libraries\WiFi
exit status 1
‘class NTPClient’ has no member named ‘getFormattedDate’
Hi.
You say that the getFormattedTime doesn’t give you the time. What do you get instead?
Regards,
Sara
I also have the same issue. the sketch keep showing error when i use getFormattedDate. Then i change to getFormattedTime, but i can’t get the date, only time available. Do you have any idea what’s going on?
Regards
Hi!
What error do you get?
I’ve tested the example today and it is working as expected.
Are you sure you’re using the library we recommend https://github.com/taranais/NTPClient? It is not available to install through the Arduino Libraries Manager.
You need to download the library .zip file and include it in the Arduino IDE libraries folder.
Regards,
Sara
Hi,
I had the same issue, and indeed it was because I had it mixed up with others NTPclient libraries that doesn’t include the getFormattedDate.
maulana be sure to delete all your other NTP libraries and restart from scratch.
Thanks a lot Sara for sharing this
Regards
Mael
Hi.
Meanwhile, we’ve published a new tutorial about getting date and time from NTP server that doesn’t require libraries.
Here’s the tutorial: https://randomnerdtutorials.com/esp32-date-time-ntp-client-server-arduino/
I hope this helps.
Regards,
Sara
The code below was tested on an ESP01 (black).
There is a very easy way to get a tm structure using and NTP server:
#include
#include
#include "time.h"
NTPClient timeClient(ntpUDP, NTP_ADDRESS, NTP_OFFSET, NTP_INTERVAL);
unsigned long nowLong;
struct tm * ptm;
vois setup() {
timeClient.begin();
}
void loop() {
timeClient.update();
nowLong = timeClient.getEpochTime();
ptm = gmtime ((time_t *)&nowLong);
Serial.printf("monthday=%d, month=%d,wdayno=%d, hour=%d, minute=%d, second=%d\r\n",
ptm->tm_mday,
ptm->tm_mon,
ptm->tm_wday,
ptm->tm_hour,
ptm->tm_min,
ptm->tm_sec
);
}
The libraries were dropped. Include
NTPClient.h
WiFiUdp.h
time.h
We’ve just published an updated version of this article for the ESP32 (easier version without having to install libraries)
https://randomnerdtutorials.com/esp32-date-time-ntp-client-server-arduino/
Regards,
Sara
Go to https://github.com/taranais/NTPClient and download the NTPClient library modified by taranais.
Unzip and place the folder on
C: \ Users \\ Documents \ Arduino \ libraries
🙂
The code can be further improved by loading the retrieved(from NTP) into the local inbuilt RTC of the 8266 with the following code, but it is recommended to update from internet at least daily as the inbuilt RTC is not dead accurate(Depends on application). Furthermore, it seems to take about 30 secs for the update of the inbuilt RTC to take effect, which is why the print is not done until the year changes from the default 70.
The code to set the local RTC:
unsigned long nowLong;
timeval tv;
timeClient.update();
nowLong = timeClient.getEpochTime();
tv.tv_sec=nowLong;
tv.tv_usec = 0;
settimeofday(&tv, 0);
The code to retrieve from local RTC:
struct tm * ptm;
nowLong = time(nullptr);
ptm = gmtime ((time_t *)&nowLong);
//only printf after time has been initialised
if (ptm->tm_year != 70) {
Serial.printf("monthday=%d, month=%d,wdayno=%d, hour=%d, minute=%d, second=%d, year=%d\r\n",
ptm->tm_mday,
ptm->tm_mon,
ptm->tm_wday,
ptm->tm_hour,
ptm->tm_min,
ptm->tm_sec,
ptm->tm_year + 1900
);
Yes, it works!
Um beijo.
for india the offset is GTM+5:30=15500 ………
Thank you. That lifted a bit of the fog for me, trying to use NTP for the first time.
BTW, you have a typo: Time offset is seconds, not mS 🙂
Hi.
Thanks, I’ve fixed the typo.
We also have this tutorial about date and time: https://randomnerdtutorials.com/esp32-date-time-ntp-client-server-arduino/
Regards
Sara
I appreciate your tutorial very much. It is very helpful. I have a question about extracting the timestamp with milliseconds as a unit, since I would like to measure acceleration using ESP32 and a sensor. What I was able to find as to this issue were examples limited to seconds as a unit. I appreciate very much if you would give a advice or references I should see.
Best Regards,
S.K. from Japan
Hello Rui and Sara; first, thanks for the tutorial.
I have a similar clock sketch that uses NTP Client to show Hours, Minutes and Seconds and also Year, Month and Day but since I live in Brazil the sequence would be Day, Month and Year so I would like your help to change this sequence, therefore, part of the code below:
void Date_time_weather_Display()
{
formattedDate = timeClient.getFormattedDate();
//Ano, Mês e Dia
//Serial.println(formattedDate);
int splitT = formattedDate.indexOf(“T”);
int N_year = formattedDate.indexOf(“-“);
String N_year1 = formattedDate.substring(0, N_year);
String N_month = formattedDate.substring(5, 7);
String N_day = formattedDate.substring(8, 10);
tft.setTextColor(TFT_MAGENTA, TFT_BLACK);
tft.setTextSize(2);
tft.setCursor( 20, 20 );
tft.println(N_year1);
tft.drawBitmap(74, 20, title[18], 16, 16, TFT_WHITE); //ano
tft.setCursor( 106, 20 );
tft.println(N_month);
tft.drawBitmap(138, 20, title[17], 16, 16, TFT_WHITE); //mês
tft.setCursor( 170, 20 );
tft.println(N_day);
tft.drawBitmap(202, 20, title[10], 16, 16, TFT_WHITE); //dia
//Dia da Semana
tft.drawBitmap(234, 20, title[14], 16, 16, TFT_WHITE); //Estrela
tft.drawBitmap(250, 20, title[11], 16, 16, TFT_WHITE); //期
if (Week_check != timeClient.getDay())
{
tft.fillRect(266, 10, 16, 16, TFT_BLACK);
Week_check = timeClient.getDay();
}
tft.drawBitmap(282, 20, title[timeClient.getDay()], 16, 16, TFT_MAGENTA);
//Hora agora
timeStamp = formattedDate.substring(splitT + 1, formattedDate.length() – 1);
tft.setTextColor(TFT_YELLOW, TFT_BLACK);
tft.setTextSize(6);
tft.setCursor( 15, 180 );
tft.println(timeStamp);
}
Thanks and Greetings from Brazil
Aguardando por uma resposta!
Has anyone managed to display the time on the web panel? Maybe an example?
When I compile the code I’m getting the following error message.
I’m using the using the NTP Client library forked by Taranais.
Please advise, thank you, Martin
Arduino: 1.8.19 (Linux), Board: “NodeMCU 1.0 (ESP-12E Module), 80 MHz, Flash, Disabled (new aborts on oom), Disabled, All SSL ciphers (most compatible), 32KB cache + 32KB IRAM (balanced), Use pgm_read macros for IRAM/PROGMEM, 4MB (FS:2MB OTA:~1019KB), 2, v2 Lower Memory, Disabled, None, Only Sketch, 115200”
‘class NTPClient’ has no member named ‘getFormattedDate’; did you mean ‘getFormattedTime’?
159 | Serial.println(timeClient.getFormattedDate());
| ^~~~~~~~~~~~~~~~
| getFormattedTime
‘class NTPClient’ has no member named ‘getFormattedDate’; did you mean ‘getFormattedTime’?
Hi.
It seems that the getFormattedDate method is outdated.
Now, you should use getFormattedTime. I need to review and update this post.
Thanks for your comment.
Regards,
Sara
I used NTPClient on my ESP32 for over a year. It was on a monitor that ran 24/7. The time code ran once a day. It worked great until it didn’t. About the beginning of April 2022 it just quit working. It would just time out (maximum of 20 tries in the loop). This happened both on the remote unit and at home on a different ESP32 and different WiFi. I posted the issue on https://github.com/arduino-libraries/NTPClient/issues/172 but no comments. I gave up and now retrieve what I want from a webpage using the powerful php time functions so I am happy but also curious about what is going on.
By the way, I never would have gotten my project running without the excellent tutorials on this site. Thank you for that. The only suggestion I would have is always put a counter in your while loops so they are guaranteed to exit.
Hello,
I tried this code but with Ethernet module ENC28J60 using EthernetENC Library.
It’s just shows 1970-1-1 and time 00:00:00.
also tried configtime, but ithink config time will work with wifi only
I have an ESP8266 system running a Finate Sate Machine and depending on the hour of the day it will perform different routines. However, I have only been able to compare values using the Hour timeClient.getHours(). How can I check if time is say 21:30hrs? Can I somehow add timeClient.getHours() with timeClient.getMinutes()?
I have got this error. What can I do?
That mean’s “getFormattedDate” is no member named in class NTPClient..
G:\키재기\Arduino Nodemcu v2\Naver Blog\NodeMCU Get Real Time\NodeMCU Get Real Time.ino: In function ‘void loop()’:
G:\키재기\Arduino Nodemcu v2\Naver Blog\NodeMCU Get Real Time\NodeMCU Get Real Time.ino:95:28: error: ‘class NTPClient’ has no member named ‘getFormattedDate’; did you mean ‘getFormattedTime’?
exit status 1
Compilation error: ‘class NTPClient’ has no member named ‘getFormattedDate’; did you mean ‘getFormattedTime’?
Hi.
You probably installed the wrong library.
Please install the library shown in the tutorial using the method we describe.
Regards,
Sara
Compilation error: invalid conversion from ‘const char‘ to ‘char‘ [-fpermissive]
error in code
Hi.
Make sure you’re using the same library as ours.
We recommend the NTPCLient forked by Taranais, which is different from the “regular” NTPClient library.
Regards,
Sara
Thanx, i installed this library but same problem.
Check that you have the ESP32 boards updated.
Tools > Board > Boards Manager, search for ESP32 and if there is any update.
Regards,
Sara
Thank you for your help to any project . You are top in this field.
I would like to ask a specific question. If a have a device , based on esp32, and upload the code of the current page what going on if the time change to the summer time ? The NTP server will continue to give me the winter time(wrong time) or will automaticly change to the summer time. Do i need change something in the code? Thank you very much for your help
Hi.
This code doesn’t update the time automatically.
We have another tutorial that does that and that I recommend you follow: https://randomnerdtutorials.com/esp32-ntp-timezones-daylight-saving/
I hope this helps.
Regards,
Sara
Code give a error
Compilation error: invalid conversion from ‘const char‘ to ‘char‘ [-fpermissive]
Hello good day,
First of all:
I have read several of your tutorials and find them all quite excellent, especially the very good explanation of how each code section is explained. Big compliments!!!
I use the above code as a function in several different sketches and it always works everywhere until today.
As of today, I am getting the following error message in a single sketch when compiling; all other sketches continue to work fine.
c:/users/manfr/appdata/local/arduino15/packages/esp32/tools/xtensa-esp32-elf-gcc/esp-2021r2-patch5-8.4.0/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../xtensa-esp32-elf/bin/ld.exe: C:\Users/manfr\AppData\Local\Temp\arduino\sketches\46F94ADC69DD0F0DD6FDE98911FFD337\sketch\time_acquisition_temp_read-store.ino.cpp.o:(.literal._Z10Date_Timev+0x2c): undefined reference to
NTPClient::getFormattedDate(unsigned long)'
date_time()’:c:/users/manfr/appdata/local/arduino15/packages/esp32/tools/xtensa-esp32-elf-gcc/esp-2021r2-patch5-8.4.0/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../xtensa-esp32-elf/bin/ld.exe: C:\Users\manfr\AppData\Local\Temp\arduino\sketches\46F94ADC69DD0F0DD6FDE98911FFD337\sketch\time_acquisition_temp_read-store.ino.cpp.o: in function
C:\Users\manfr\Documents\Arduino\time_acquisition_temp_read_stores/time_acquisition_temp_read_stores.ino:218: undefined reference to `NTPClient::getFormattedDate(unsigned long)’
collect2.exe: error: ld returned 1 exit status
exit status 1
The call and the code are absolutely the same in all sketches. In all of them the variable ‘formattedDate’ is declared in the preprocessing as follows:
// Variables to save date and time
String formattedDate;
String dayStamp;
String timeStamp;
Can you help me to find and fix my error?
Thank you in advance for your efforts
Manfred Prefi
translated from German with DeepL
From previous posts on this thread it seems
getFormattedDate(..)
has been replaced with
getFormattedTime(…)
Hi,
Yes, also I got once at the error message when compiling the suggestion to enter getFormattedTime(…) instead of getFormattedDate(..), but that didn’t work, I got only the time (without date).
My new sketch works now – see my reply to Sara Santos.
Thanks for the answer.
Manfred
Hi.
Make sure you have the recommended library mentioned in the tutorial installed.
Regards,
Sara
All libraries were installed correctly, and the code for time reading in a separate sketch worked fine too.
I have now re-edited my entire sketch and it works fine now.
I don’t know what error was in the original code, maybe a missing statement.
Thanks for the help and best regards to Porto.
Manfred
Thanks 😀
Hallo,
I have again the same problem with the above mentioned scetch, which worked fine until now, that I just wanted to flash to another boaed.
With the following statement comes an error when compiling:
formattedDate = timeClient.getFormattedDate();
The error message is:
Compilation error: ‘class NTPClient’ has no member named ‘getFormattedDate’; did you mean ‘getFormattedTime’?
I compared again with your code and could not find any discrepancy.
I am working with the same machine and the same libraries.
What could be the reason for this?
Thanks for your help
There’s no need for any additional library, simply load “time.h” like this
//Ok, a quick and brief tutorial upon NTP with Arduino:
//First, in the global section, have
#include "time.h" // we'll need that later on
char Result[8]; // placeholder, string for what we request from NTP
// We use the old "uint" declaration mostly for heritage
uint32_t targetTime = 0; // Universal Counter
uint8_t hh, mm, ss; // We want hours, minutes and seconds in the first place, expand to your demands
// Definitions for the latter to use "configTime" function of "time.h"
const char* ntpServer = "192.168.178.1"; // local NTP-Server in my case, here inside LAN; use any of "pool.ntp.org" a. s. o.
const long gmtOffset_sec = 3600; // CET vs. UTC
const int daylightOffset_sec = 0; // Fiddle around with tzData()
// Core function: "Void()" for being in the global scope
void syncNTP() {
struct tm timeinfo;
// "timeinfo" now is of the strucrure "tm"
// filled with getLocalTime() will provide us with more than we expect
if(!getLocalTime(&timeinfo)){
return; // we don't care: Success on success, fail on fail; next try only 60 min away
}
hh = timeinfo.tm_hour;
mm = timeinfo.tm_min;
ss = timeinfo.tm_sec;
}
void setup(void) {
WiFi.mode(WIFI_STA); //connect WiFi
WiFi.begin(ssid, password);
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer); // Here, our NTP-client role starts off!
targetTime = millis() + 1000;
syncNTP();
}
void loop() {
if (targetTime < millis()) {
targetTime += 1000;
ss++; // Advance second
if (ss==60) {
ss=0;
mm++; // Advance minute
if(mm>59) {
mm=0;
hh++; // Advance hour
if (hh>23) {
hh=0;
}
syncNTP(); // NTP-update hourly, edit for own needs
}
}
sprintf(Result, "%02d:%02d:%02d", hh, mm, ss);
// From here, print/use $Result wherever you want?
}
}
Hi.
Yes.
At the beginning of the tutorial, we recommend checking this new tutorial that uses that method: https://randomnerdtutorials.com/esp32-date-time-ntp-client-server-arduino/
Regards,
Sara
Hi, Sara,
thank you for answering.
My main point in my comment was that, in the named example code, the main focus is on the representation of the members of “&timeinfo” as char().
For use with MCUs, it is far more common to get the values as numeric int. Although that’s pretty trivial, the tutorial shows how to print the NTP-result as a formatted string, but not how to easily get the values as ints to process them. So if you’re not too familiar with the tm structure, this may seem a bit, say, “complicated”.
Hence the comment.
Thanks again, have nice holidays!
Yes. You’re right.
Thanks for the clarification.
Regards,
Sara
Hi, can this project be used in the Wi-Fi Manager project (AsyncWebServer library) https://randomnerdtutorials.com/esp32-wi-fi-manager-asyncwebserver/