Получение даты и времени от ESP32 в Arduino IDE (NTP-клиент)

В этом уроке мы покажем вам, как получить дату и время, используя ESP32 и Arduino IDE. Если ваш проект ESP32 имеет доступ к Интернету, вы можете получить дату и время, используя сетевой протокол времени (NTP) - вам не нужно никакого дополнительного оборудования.

Клиентская библиотека NTP

Самый простой способ получить дату и время с NTP-сервера - это использовать клиентскую библиотеку NTP. Для этого мы будем использовать клиентскую библиотеку NTP, форкнутую Taranais. Выполните следующие шаги, чтобы установить эту библиотеку в Arduino IDE:

 

  1. Нажмите здесь, чтобы загрузить клиентскую библиотеку NTP.
  2. Разархивируйте папку .zip, и вы должны получить папку NTPClient-master.
  3. Переименуйте вашу папку из NTPClient-master в NTPClient.
  4. Переместите папку NTPClient в папку библиотек установки Arduino IDE.
  5. Наконец, заново откройте вашу среду 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.

 

Комментарии

Владимир (не проверено) ср, 05/06/2020 - 08:51

К какому серверу подключается esp? Как его поменять?

admin чт, 05/07/2020 - 01:09

Ответ на от Владимир (не проверено)

Здравствуйте, Владимир,
по умолчанию подключается к серверу "pool.ntp.org",
Задать другой сервер вы можете при инициализации клиента, передав его вторым параметром.
NTPClient timeClient(ntpUDP, "europe.pool.ntp.org", 3600, 60000);

Klekots_Denis; (не проверено) сб, 07/18/2020 - 10:58

Спасибо большое вам за этот скетч. Я работаю на ESP8266 ESP_01, все работает как надо, только пришлось заменить в начале скетча библиотеку, #include на #include , а то не подключалось к сети Wifi.

Ivan (не проверено) сб, 08/29/2020 - 23:03

Как получить текущее время в секундах, что бы потом удобно работать с алгоритмом?

Добавить комментарий

Restricted HTML

  • Допустимые HTML-теги: <a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • Строки и абзацы переносятся автоматически.
  • Адреса веб-страниц и email-адреса преобразовываются в ссылки автоматически.
CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.