В этом уроке мы покажем вам, как получить дату и время, используя ESP32 и Arduino IDE. Если ваш проект ESP32 имеет доступ к Интернету, вы можете получить дату и время, используя сетевой протокол времени (NTP) - вам не нужно никакого дополнительного оборудования.
Клиентская библиотека NTP
Самый простой способ получить дату и время с NTP-сервера - это использовать клиентскую библиотеку NTP. Для этого мы будем использовать клиентскую библиотеку NTP, форкнутую Taranais. Выполните следующие шаги, чтобы установить эту библиотеку в Arduino IDE:
- Нажмите здесь, чтобы загрузить клиентскую библиотеку NTP.
- Разархивируйте папку .zip, и вы должны получить папку NTPClient-master.
- Переименуйте вашу папку из NTPClient-master в NTPClient.
- Переместите папку NTPClient в папку библиотек установки Arduino IDE.
- Наконец, заново откройте вашу среду Arduino IDE.
Получение даты и времени с NTP-сервера
Здесь мы предоставляем пример кода для получения даты и времени с NTP-сервера. Этот код - немного изменённая часть одного из примеров библиотеки.
#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);
}
Чтобы получить больше примеров NTP, в Arduino IDE перейдите в меню File> examples> NTPClient.
Как работает код
Давайте кратко рассмотрим код, чтобы увидеть, как он работает. Сначала вы включаете библиотеки для подключения к Wi-Fi и получаете время и создаете NTP-клиента.
#include <WiFi.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
Установка SSID и пароля
Введите свои сетевые учетные данные в следующих переменных, чтобы ESP32 мог устанавливать подключение к Интернету и получать дату и время с NTP-сервера.
// Replace with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
Подготовка клиента NTP
Следующие две строки определяют клиента NTP для запроса даты и времени с сервера NTP.
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP);
Затем инициализируйте строковые переменные, чтобы сохранить дату и время.
String formattedDate;
String dayStamp;
String timeStamp;
В setup() вы инициализируете последовательную связь со скоростью 115200 бод, чтобы распечатать результаты:
Serial.begin(115200);
Эти следующие строки подключают ESP32 к вашему маршрутизатору.
// 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());
Затем инициализируйте клиент NTP, чтобы получить дату и время с сервера NTP.
timeClient.begin();
Вы можете использовать метод setTimeOffset (), чтобы настроить время для вашего часового пояса в миллисекундах.
timeClient.setTimeOffset(3600);
Вот несколько примеров для разных часовых поясов:
- GMT +1 = 3600GMT +8 = 28800GMT -1 = -3600GMT 0 = 0
Следующие строки гарантируют, что мы получим правильную дату и время:
while(!timeClient.update()) {
timeClient.forceUpdate();
}
Примечание: иногда NTP-клиент извлекает 1970-е годы. Чтобы этого не произошло, нам нужно принудительно установить обновление.
Получение даты и времени
Преобразуйте дату и время в читаемый формат с помощью метода getFormattedDate():
formattedDate = timeClient.getFormattedDate();
Дата и время возвращаются в следующем формате:
2018-04-30T16:00:13Z
Если вы хотите получить дату и время отдельно, вам нужно разделить эту строку. Буква «Т» отделяет дату от времени, поэтому мы можем легко разделить эту строку. Вот что мы делаем в следующих строках.
// 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);
Дата сохраняется в переменной dayStamp, а время - в переменной timeStamp. Время запрашивается и печатается каждую секунду.
Тестирование кода
Загрузите код в ESP32. Убедитесь, что вы выбрали правильную плату и COM-порт. После загрузки кода нажмите кнопку «Включить» на ESP32, и вы должны получать дату и время каждую секунду, как показано на следующем рисунке.
Завершение
В этом руководстве мы показали, как легко получить дату и время с ESP32 в Arduino IDE, используя NTP-сервер. Предоставленный код сам по себе бесполезен. Идея состоит в том, чтобы использовать пример, представленный в этом руководстве, в своих собственных проектах для отметки времени показаний датчиков.
Этот метод работает, только если ESP32 подключен к Интернету. Если у вашего проекта нет доступа к Интернету, вам нужно использовать другой метод. Вы можете использовать модуль RTC как DS1307.
Комментарии
Имя сервера
К какому серверу подключается esp? Как его поменять?
Имя сервера
Здравствуйте, Владимир,
по умолчанию подключается к серверу "pool.ntp.org",
Задать другой сервер вы можете при инициализации клиента, передав его вторым параметром.
NTPClient timeClient(ntpUDP, "europe.pool.ntp.org", 3600, 60000);
Спасибо большое вам за этот…
Спасибо большое вам за этот скетч. Я работаю на ESP8266 ESP_01, все работает как надо, только пришлось заменить в начале скетча библиотеку, #include на #include , а то не подключалось к сети Wifi.
Время в секундах
Как получить текущее время в секундах, что бы потом удобно работать с алгоритмом?
Добавить комментарий