0

Lấy thời gian từ Internet với ESP32 (NTP CLient)

5/5 - (2 bình chọn)

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:

  1. Click để Download thư viện.
  2. Giả nén file .zip đã download bạn sẽ có NTPClient-master
  3. Thay đổi tên folder từ NTPClient-master thành NTPClient
  4. 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\)
  5. 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 SSIDMậ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 Date and Time ESP32

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!

thanhbinh89

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *