Получение Epoch/Unix времени на ESP32 (Arduino)

Это краткое руководство показывает, как получить epoch/unix время, используя плату ESP32 с Arduino IDE. Получение epoch времени может быть полезно для создания временных меток ваших показаний, присвоения уникальных имён файлам и других приложений. Мы будем запрашивать текущее epoch время с NTP-сервера, поэтому ESP32 должен иметь подключение к интернету.

Получение Epoch Unix времени на ESP32 Arduino

Если вы хотите получить дату и время в читаемом формате, мы рекомендуем следующее руководство:

Что такое epoch время?

Epoch время (также известное как Unix epoch, Unix время, POSIX время или Unix временная метка) — это количество секунд, прошедших с 1 января 1970 года (полночь UTC/GMT), без учёта високосных секунд (в формате ISO 8601: 1970-01-01T00:00:00Z).

NTP (Network Time Protocol)

NTP расшифровывается как Network Time Protocol (протокол сетевого времени) — это сетевой протокол для синхронизации часов между компьютерными системами. Другими словами, он используется для синхронизации времени компьютерных часов в сети.

ESP32 NTP Network Time Protocol сервер - как это работает

Существуют NTP-серверы, такие как pool.ntp.org, которые любой может использовать для запроса времени в качестве клиента. В данном случае ESP32 является NTP-клиентом, который запрашивает время у NTP-сервера (pool.ntp.org).

Функция получения Epoch/Unix времени на ESP32

Для получения epoch/unix времени на ESP32 вы можете использовать следующую функцию getTime():

// Function that gets current epoch time
unsigned long getTime() {
  time_t now;
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) {
    //Serial.println("Failed to obtain time");
    return(0);
  }
  time(&now);
  return now;
}

Эта функция возвращает текущее epoch время. Продолжайте чтение для полного примера.

Пример получения Epoch/Unix времени на ESP32

Скопируйте следующий код в вашу Arduino IDE. Этот код подключается к интернету и запрашивает время у NTP-сервера (pool.ntp.org).

/*
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/epoch-unix-time-esp32-arduino/

  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files.

  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
*/

#include <WiFi.h>
#include "time.h"

// Replace with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

// NTP server to request epoch time
const char* ntpServer = "pool.ntp.org";

// Variable to save current epoch time
unsigned long epochTime;

// Function that gets current epoch time
unsigned long getTime() {
  time_t now;
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) {
    //Serial.println("Failed to obtain time");
    return(0);
  }
  time(&now);
  return now;
}

// Initialize WiFi
void initWiFi() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.print("Connecting to WiFi ..");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print('.');
    delay(1000);
  }
  Serial.println(WiFi.localIP());
}

void setup() {
  Serial.begin(115200);
  initWiFi();
  configTime(0, 0, ntpServer);
}

void loop() {
  epochTime = getTime();
  Serial.print("Epoch Time: ");
  Serial.println(epochTime);
  delay(1000);
}

Просмотреть исходный код

Вставьте ваши сетевые учётные данные в следующие переменные, и код будет работать сразу:

// Replace with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

Как работает код

Давайте кратко рассмотрим, как работает код.

Библиотеки

Сначала вам нужно подключить библиотеку WiFi для подключения ESP32 к вашей локальной сети; и библиотеку time для работы со структурами времени.

#include <WiFi.h>
#include "time.h"

Сетевые учётные данные

Вставьте ваши сетевые учётные данные в следующие переменные, чтобы ESP32 мог подключиться к вашей сети.

// Replace with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

NTP-сервер

Мы будем запрашивать время у pool.ntp.org — это кластер серверов времени, которые любой может использовать для запроса времени.

const char* ntpServer = "pool.ntp.org";

Функция getTime()

Функция getTime() получает и возвращает текущее epoch время. Если она не может получить время, то возвращает 0.

// Function that gets current epoch time
unsigned long getTime() {
  time_t now;
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) {
    //Serial.println("Failed to obtain time");
    return(0);
  }
  time(&now);
  return now;
}

Функция initWiFi()

Функция initWiFi() инициализирует Wi-Fi и подключает ESP32 к вашей локальной сети.

void initWiFi() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.print("Connecting to WiFi ..");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print('.');
    delay(1000);
  }
  Serial.println(WiFi.localIP());
}

setup()

В функции setup() инициализируйте Serial Monitor на скорости 115200 бод.

Serial.begin(115200);

Вызовите функцию initWiFi() для инициализации Wi-Fi:

initWiFi();

Настройте время с помощью функции configTime(). Первый и второй аргументы соответствуют смещению по GMT и переходу на летнее время. Однако, поскольку нас интересует получение epoch времени, эти аргументы должны быть равны 0. Последний аргумент — это NTP-сервер (ntpServer):

configTime(0, 0, ntpServer);

loop()

В функции loop() получите epoch время и сохраните его в переменной epochTime:

epochTime = getTime();

Наконец, выводите epoch время каждую секунду:

Serial.print("Epoch Time: ");
Serial.println(epochTime);
delay(1000);

Демонстрация

Загрузите код на вашу плату ESP32. Затем откройте Serial Monitor на скорости 115200 бод. Нажмите встроенную кнопку RST на ESP32. Плата должна подключиться к Wi-Fi и начать выводить текущее epoch/unix время каждую секунду.

ESP32 получение Epoch Unix времени - Serial Monitor

Заключение

Это было краткое руководство, показывающее, как получить epoch/unix время на ESP32. Epoch время — это количество секунд, прошедших с 1 января 1970 года. Для получения времени нам нужно подключиться к NTP-серверу, поэтому ESP32 должен иметь доступ к интернету.

Если вас интересует получение даты и времени в читаемом формате, обратитесь к следующему руководству:

Мы надеемся, что это руководство было для вас полезным. Если вы хотите узнать больше об ESP32, ознакомьтесь с нашими ресурсами:

Спасибо за чтение.


Источник: Get Epoch/Unix Time with the ESP32 (Arduino)