Часы реального времени на DS3231 и ESP32 с помощью ESP-IDF


В данной статье мы научимся взаимодействовать с модулем RTC DS3231, используя ESP32 и ESP-IDF. Мы кратко рассмотрим описание модуля DS3231, его подключение к плате ESP32, а также настройку проекта в VS Code с расширением ESP-IDF для получения текущей даты/времени и отображения их на консоли.

Часы реального времени на DS3231 и ESP32 с помощью ESP-IDF

Аналогичный проект на нашем сайте вы также можете посмотреть на основе модуля DS1307.

Ранее на нашем сайте мы рассматривали и другие проекты с использованием модуля DS3231:

Прецизионный модуль RTC DS3231

Модуль DS3231 RTC широко используется для отслеживания текущей даты и времени. Он применяется в электронных проектах для измерения времени, регистрации данных, создания часов, таймеров и т. д. Этот модуль работает на микросхеме DS3231S RTC и также содержит EEPRROM AT24C3 для точного измерения времени. Модуль состоит из интегрированного кварцевого генератора с температурной компенсацией и кварцевого резонатора, что делает его чрезвычайно точным модулем RTC. Кроме того, благодаря наличию кварцевого резонатора точность времени сохраняется в течение длительного времени.

На обратной стороне модуля RTC расположен держатель для 20-миллиметровой литиевой батарейки-таблетки 3 В, в которую устанавливается батарейка CR2032. Эта батарейка крайне важна для отслеживания времени и обеспечения его точности в случае отключения основного питания. Таким образом, батарейка CR2032 выступает в качестве резервного источника питания на случай потери основного источника энергии.

На приведенной ниже схеме показаны лицевая и обратная стороны модуля DS3231 RTC. Обратите внимание, что на лицевой стороне расположены микросхема DS3231 RTC и EEPROM 24C32, а на обратной стороне — держатель батареи CR2032 и батарейка-таблетка соответственно.

Модуль RTC DS3231 (вид сверху и снизу)

Обратная сторона модуля RTC DS3231 с вынутой батарейкой

Распиновка модуля RTC DS3231

На приведенной ниже схеме показана распиновка модуля RTC DS3231.

Распиновка модуля RTC DS3231

Как видно на приведенном рисунке, модуль DS3231 имеет в общей сложности десять контактов, но для доступа к текущему времени с помощью одного модуля нам требуются только контакты связи I2C (SCL и SDA) и контакты питания (VCC и GND). Контакты I2C и питания на другой стороне модуля предназначены для подключения к другому модулю (последовательное соединение).

33K Этот контакт выдает компенсированную температуру и точный опорный тактовый сигнал.
SQW Этот вывод генерирует прямоугольные импульсы различной частоты, например, 1 Гц, 4 кГц, 8 кГц или 32 кГц.
SCL Контакт передачи синхросигнала в интерфейсе I2C
SDA Контакт передачи данных в интерфейсе I2C
VCC Это контакт питания, который подключается к Vin (5 В) или 3,3 В микроконтроллера ESP32.
GND Общий провод (земля)

Как видим, распиновка у модуля достаточно понятная.

Подключение модуля DS3231 к ESP32

Для подключения модуля DS3231 к плате ESP32 нам понадобятся следующие компоненты:

  1. Плата ESP32.
  2. Модуль DS3231.
  3. Соединительные провода.
  4. Макетная плата.

Подключение модуля DS3231 к плате ESP32 довольно простое, так как оно включает в себя лишь соединение 4 контактов (GND, VCC, SDA и SCL) с ESP32. Необходимо соединить вывод VCC с контактом Vin, заземление с общим заземлением, контакт SCL датчика с контактом SCL платы ESP32, а контакт SDA датчика с контактом SDA платы ESP32. Для подключения модуля датчика будут использоваться стандартные контакты I2C платы ESP32.

В ESP32 по умолчанию для вывода SDA используется GPIO21, а для SCL — GPIO22.

Соединения между устройствами указаны в таблице ниже:

Модуль DS3231 ESP32
GND GND
VCC 3.3V
SDA GPIO21(I2C SDA)
SCL GPIO22 (I2C SCL)

Схема подключения модуля DS3231 к плате ESP32

Часы реального времени на базе ESP32 с использованием модуля DS3231 и ESP-IDF

Мы создадим проект в VS Code с расширением ESP-IDF. Код будет выводить текущую дату/время и внутреннюю температуру чипа в терминал ESP-IDF, используя библиотеку I2C-устройств esp_idf_lib_helpers и ds3231.h. Мы будем использовать драйвер ds3231, написанный UncleRus.

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

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

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

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

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

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

Создание проекта с использованием шаблона sample_project

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

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

Для начала добавим необходимые заголовочные файлы для библиотек, требуемых для этого проекта. Создайте новую папку с названием «components» и добавьте в неё следующие три подпапки:

  1. esp_idf_lib_helpers
  2. i2cdev
  3. ds3231

Добавьте папки ds3231, esp_idf_lib_helpers и i2cdev в папку 'components', скопировав их по  указанной ниже ссылке :

Библиотеки, необходимые для работы с модулем DS3231

Код ESP32 для отображения текущего времени и даты с DS3231

Теперь перейдите к файлу main.c. В папке main находится исходный код, то есть файл main.c будет находиться здесь. Перейдите в папку main > main.c и откройте его. Скопируйте приведенный ниже код из этого файла и сохраните его.

Это пример скетча для драйвера DS3231. Он непрерывно выводит текущую дату и время, а также внутреннюю температуру микросхемы в терминале ESP-IDF.

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

Для начала мы подключим необходимые библиотеки для этого проекта. Это включает библиотеку ds3231 для доступа к API для настройки и получения текущей даты/времени, а также библиотеки freertos для создания задачи.

ds3231_test()

Внутри функции ds3231_test() мы сначала создаём экземпляр структуры i2c_dev_t, которая используется для настройки и инициализации модуля RTC. После этого мы инициализируем все члены этой структуры нулями с помощью функции memset.

Далее функция ds3231_init_desc() инициализирует дескриптор устройства ds3231, передавая ему структуру dev, порт I2C, контакт ESP32 SDA и контакт ESP32 SCL соответственно.

Далее мы определяем параметры структуры tm, которую мы называем 'time'. Внутри неё мы указываем текущий год, месяц, дату, час, минуту и ​​секунду. После этого мы вызываем функцию ds3231_set_time() для инициализации даты и времени в соответствии с определением в структуре time. Эта функция, по сути, устанавливает время в RTC (часы реального времени).

Внутри цикла while мы получаем доступ к текущей дате и времени с помощью функции ds3231_get_time() и к внутренней температуре чипа с помощью функции ds3231_get_temp_float(). Каждые 0,25 секунды мы выводим внутреннюю температуру чипа и текущую дату и время на терминал ESP-IDF, обращаясь к каждому члену структуры time.

app_main()

Внутри функции app_main() мы сначала инициализируем устройство I2C, вызвав функцию i2cdev_init(). Затем мы создадим задачу DS3231 с помощью функции xTaskCreate().

Компиляция скетча

Для прошивки микросхемы введите следующую команду в последовательном терминале. Не забудьте заменить COM-порт на тот, через который подключена ваша плата.

После успешной прошивки кода вы сможете просмотреть текущую дату и время, а также внутреннюю температуру чипа на консоли.

Тестирование работы проекта часов реального времени на ESP32 в окне терминала

(Проголосуй первым!)
Загрузка...
12 просмотров

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

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