Không cần thêm bất kỳ phần cứng nào ESP32 có thể lấy thời gian từ Internet với ESP32. Thời gian thực rất cần thiết trong việc lưu Log hay Timestamp trong việc đọc cảm biến. Bài viết này sẽ hướng dẫn các bạn lấy thời gian từ Internet với ESP32.
Để tiếp tục bài viết bạn cần cài đặt ESP32 add-on trên Arduino IDE.
Cài đặt thư viện NTP Client trên Esp32
Chúng ta sẽ lấy thời gian từ Internet thông qua NTP Server vì vậy ta cần cài đặt thư viện NTP Client. Để cài đặt làm theo các bước sau:
- Click để Download thư viện.
- Giả nén file .zip đã download bạn sẽ có NTPClient-master
- Thay đổi tên folder từ
NTPClient-masterthành NTPClient - Copy thư mục NTPClient tới thư mục chứa thư viện cài đặt của Arduino IDE (mặc định là C:\Users\{user}\Documents\Arduino\libraries\)
- Khởi động lại Arduino IDE
Code lấy thời gian từ Internet với ESP32 NTP Server
Dưới dây là code mẫu để lấy thời gian từ Internet với ESP32.
#include <WiFi.h> #include <NTPClient.h> #include <WiFiUdp.h> // Replace with your network credentials const char* ssid = "YOUR_WIFI_SSID"; const char* password = "YOUR_WIFI_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(); timeClient.setTimeOffset(+7*60*60); } 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); }
Bạn có thể xem thêm các ví dụ NTP trên Arduino IDE tại File > Examples > NTPClient.
Giải thích Code
Khai báo các thư viện cần dùng trong Sketch, gồm thư viện Wifi và NTP.
#include <WiFi.h> #include <NTPClient.h> #include <WiFiUdp.h>
Cài đặt SSID và Mật khẩu
Để có thể tạo kết nối tới NTP Server, trước tiên ESP32 cần kết nối với Wifi nhà bạn. Cung cấp SSID và Mật khẩu tại đây:
const char* ssid = "YOUR_WIFI_SSID"; const char* password = "YOUR_WIFI_PASSWORD";
Khai báo NTP Client
Khai báo kết nối UDP và NTP Client kết nối tới NTP Server.
WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP);
Sau đó, khởi tạo các biến lưu trữ thời gian.
String formattedDate; String dayStamp; String timeStamp;
Tại hàm setup(), cần khởi tạo Serial với tốc độ baud 115200.
Serial.begin(115200);
Tiếp theo, bắt đầu kết nối với Wifi và chờ đến khi ESP32 được cấp IP.
Serial.begin(115200); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected."); Serial.println("IP address: "); Serial.println(WiFi.localIP());
Bắt đầu khởi tạo NTP Client.
timeClient.begin();
Bạn có thể dùng hàm setTimeOffset() để thay đổi thời gian cho đúng Timezone, đơn vị là giây.
Ví dụ, Timezone tại Việt Nam là +7 sẽ là
timeClient.setTimeOffset(+7*60*60);
Hàm update() sẽ trả về true khi lấy được thời gian hợp lệ từ Server. Trong trường hợp trả về false chúng ta cần phải buộc NTP Server câp nhật gời gian bằng cách sử dụng hàm forceUpdate().
while(!timeClient.update()) { timeClient.forceUpdate(); }
Lấy ngày và giờ
Chúng ta sẽ cần chuyển đổi dữ liệu nhận được từ NTP Server thành ngày và giờ bằng hàm getFormattedDate().
formattedDate = timeClient.getFormattedDate();
Kết quả sẽ có dạng:
2018-04-30T16:00:13Z
Để tách được ngày và giờ chúng ta làm như sau:
int splitT = formattedDate.indexOf("T"); dayStamp = formattedDate.substring(0, splitT); Serial.println(dayStamp); timeStamp = formattedDate.substring(splitT+1, formattedDate.length()-1); Serial.println(timeStamp);
Chạy thử
Chọn đúng COM port và Upload sketch, sau đó mở Serial Monitor
Tổng kết
Bài viết đã hướng dẫn các bạn lấy thời gian từ Internet với ESP32, mong rằng sẽ giúp các bạn xây dựng dự án mủa mình một cách nhanh chóng. Hãy tiếp tục theo dõi các bài hướng dẫn về ESP32 của ESPITEK nhé!
Chúc các bạn thành công!