Рубрики
Проекты на ESP32

Синхронизация времени с NTP на ESP32 с помощью ESP-IDF

В данной статье мы научимся использовать модуль LwIP SNTP на плате ESP32 и функции работы со временем для получения времени с интернет-серверов с помощью ESP-IDF. SNTP (Simple Network Time Protocol), также известный как «Простой сетевой протокол времени», — это протокол, используемый для получения текущего времени и даты. Библиотека LwIP SNTP, доступная в esp-idf, помогает получать текущее время и синхронизировать таймер ESP32 с NTP-сервером. Это очень полезно в приложениях для регистрации данных, где необходимо записывать значения данных вместе с правильными метками времени через определенный интервал времени.

Также на нашем сайте вы можете посмотреть статью про интернет часы на ESP32 с получением времени по протоколу NTP (с помощью Arduino IDE).

API ESP32 для работы с SNTP с помощью ESP-IDF

Теперь давайте обсудим API библиотеки LwIP SNTP, предоставляемые ESP-IDF для получения текущего времени.

Это заголовочный файл, необходимый для подключения библиотеки:

Функция gettimeofday обычно используется для доступа к текущей метке времени. Аналогично, функция settimeofday используется для установки времени. Именно эта функция используется библиотекой LwIP для установки текущего времени при получении ответа от NTP-сервера.

Однако стандартная библиотека C предоставляет еще несколько функций, связанных со временем. Некоторые из них перечислены ниже:

Функция sntp_get_sync_status() используется для получения статуса времени. Если время синхронизировано, она возвращает ответ SNTP_SYNC_RETURN_COMPLETED. Если статус сброшен, она возвращает SNTP_SYC_STATUS_RESET. Кроме того, если происходит плавная синхронизация времени, она возвращает ответ SNTP_SYNC_STATUS_IN_PROGRESS.

Функция sntp_set_sync_status() используется для установки статуса синхронизации времени. Она принимает один параметр — ‘sync_status’, обозначающий статус синхронизации времени.

Далее у нас есть функция sntp_get_sync_mode() . Она используется для получения режима синхронизации времени. Эта функция возвращает ответ SNTP_SYNC_MODE_IMMED, если синхронизация настроена на немедленное обновление времени. В противном случае она возвращает ответ SNTP_SYNC_MODE_SMOOTH, если включено плавное обновление времени.

Функция sntp_set_sync_mode() используется для установки режима синхронизации времени. Она принимает один параметр ‘sync_mode’, который обозначает режим синхронизации. Режим может быть либо SNTP_SYNC_MODE_IMMED, либо SNTP_SYNC_MODE_SMOOTH. При выборе режима SNTP_SYNC_MODE_IMMED системное время обновляется сразу после получения от SNTP-сервера. При выборе режима SNTP_SYNC_MODE_SMOOTH устанавливается плавное обновление времени. В этом случае для уведомления о времени используется функция adjtime.

Функция sntp_set_time_sync_notification_cb() используется для установки функции обратного вызова для уведомления о синхронизации времени. Она принимает один параметр — функцию обратного вызова.

Пример ESP-IDF для работы с SNTP

В этом разделе мы создадим и протестируем пример, используя API LwIP SNTP, как описано ранее. Мы будем использовать пример SNTP, предоставленный ESP-IDF. На примере мы покажем, как получить текущее время с помощью SNTP.

Создание примера проекта

Откройте VS Code и перейдите в менюView > Command Palette («Вид» > «Палитра команд»). Введите в строке поиска ESP-IDF: New Project и нажмите Enter.

Укажите название проекта и каталог. Мы назвали наш проект «ESP_IDF_SNTP». Для платы ESP-IDF мы выбрали опцию custom board («Пользовательская плата»). В качестве целевой платформы ESP-IDF мы выбрали модуль ESP32. Нажмите кнопку ‘Choose Template’ («Выбрать шаблон»), чтобы продолжить.

Создание нового проекта с помощью ESP-IDF

В разделе Extension («Расширение») выберите опцию ESP-IDF:

На вкладке Protocols («Протоколы») мы щелкнем по пункту «sntp». Затем нажмем ‘Create project using template sntp’ («Создать проект, используя шаблон sntp»).

Вы получите уведомление о создании проекта. Чтобы открыть проект в новом окне, нажмите «Да».

Это откроет созданный нами проект ESP_IDF_SNTP во вкладке «Проводник». Внутри папки проекта находится несколько папок. Это справедливо для всех проектов, которые вы будете создавать с помощью ESP-IDF Explorer.

Редактор конфигурации ESP-IDF SDK

Для начала перейдем в меню menuconfig. Щелкните значок, показанный ниже. Откроется редактор конфигурации ESP-IDF SDK.

Прокрутите вниз и откройте Example Connection Configuration (пример конфигурации подключения). Здесь нам нужно указать SSID и пароль нашей сети Wi-Fi. Это необходимо, потому что в примере с SNTP при первой загрузке ESP32 подключается к интернету и использует SNTP для получения текущего времени. Мы укажем параметры подключения. Также есть возможность подключения через интерфейс Ethernet.

Далее прокрутите вниз до раздела Example Configuration («Пример конфигурации») и выберите метод синхронизации времени. В этом примере представлены три метода синхронизации времени.

  1. Обновление времени сразу после получения: это метод, выбранный по умолчанию. В этом случае время обновляется немедленно после получения от SNTP-сервера.
  2. Обновление времени с помощью плавного метода (adjtime): в этом методе функция adjtime используется для уведомления о времени.
  3. Пользовательская реализация: в этом методе встроенная синхронизация времени не используется.

Мы используем опцию ‘Update Time immediately when received’ («Обновлять время сразу после получения»).

Далее перейдите к настройкам, специфичным для ESP32 (ESP32-specific). Убедитесь, что для параметра “Timers used for gettimeofday function” («Таймеры, используемые для функции gettimeofday») выбрана опция “RTC and high-resolution timer” («RTC и таймер высокого разрешения») или «RTC». Это гарантирует, что после синхронизации с SNTP-сервером отсчет времени будет выполняться с помощью этих таймеров. Когда плата ESP32 находится в режиме глубокого сна, для отслеживания времени будет использоваться встроенный таймер RTC. Аналогично, таймер высокого разрешения FRC1 обеспечит точность времени до микросекунд, пока плата находится в активном режиме.

Пример кода ESP-IDF для работы с SNTP

Перейдём к файлу main.c. В папке main находится исходный код, поэтому файл main.c будет расположен именно там.

Теперь перейдите в файл main > sntp_example_main.c  и откройте его.

Ниже приведён код, который вы увидите в исходном коде. Этот пример кода демонстрирует синхронизацию платы ESP32 с SNTP-сервером для получения текущего времени. После первоначальной загрузки плата ESP32 подключается к Wi-Fi, синхронизируется с SNTP-сервером и получает текущее время. Затем плата ESP32 переходит в режим глубокого сна. В это время таймер RTC отслеживает текущее время. После пробуждения ESP32 выводит текущее время, не подключаясь к Wi-Fi.

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

Для начала мы подключим необходимые библиотеки, включая библиотеки FreeRTOS для генерации задержек и создания задач, sys/time.h и esp_sntp.h для доступа ко времени, esp_log.h для отладки и вывода информационных логов, esp_sleep.h для перевода платы ESP32 в режим глубокого сна и т.д.

 

 

 

 

 

статья в разработке

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *