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

Часы реального времени на ESP32 и модуле DS3231

В данной статье мы рассмотрим создание часов на основе микроконтроллера ESP32 и модуля часов реального времени DS3231. Информация о времени будет выводиться на экран OLED дисплея.

ESP32 – это больше чем обычный микроконтроллер. Он имеет встроенные чипы для Wi-Fi и Bluetooth связи, а также 39 контактов ввода/вывода (GPIO). Также он поддерживает множество протоколов связи: SPI, I2C, UART и т.д. Если вы только начинаете свое знакомство с модулем/микроконтроллером ESP32, то советуем прочитать руководство по началу работы с ним.

Необходимые компоненты

  1. Модуль ESP32 (купить на AliExpress).
  2. Модуль часов реального времени DS3231 (купить на AliExpress).
  3. Модуль OLED дисплея (SSD1306) 128×64 с 7-ю контактами (купить на AliExpress).
  4. Макетная плата.
  5. Соединительные провода.

Вместо модуля ESP32 в данном проекте можно также использовать плату NodeMCU ESP8266.

Что такое модуль DS3231

DS3231 – это модуль часов реального времени (Real Time Clock, RTC). Он используется для хранения информации о времени и дате во множестве электронных устройств во всем мире. В своем составе он имеет собственную батарейку, поэтому он сохраняет информацию о времени и дате даже когда питание основного устройства (в которое он входит) отключается или когда производится сброс устройства (микроконтроллера). То есть если мы один раз установим дату и время в модуле он будет хранить их постоянно, до тех пор пока не истощится его батарейка. В настоящее время существует несколько различных микросхем реального времени: DS1307, DS3231 и т.д.

Внешний вид модуля DS3231 показан на следующем рисунке.

Ранее на нашем сайте мы рассматривали применение модуля DS3231 в следующих проектах:

Примечание: в данном проекте вместо модуля DS3231 можно также использовать модуль DS1307, на нашем сайте мы рассматривали его подключение к плате Arduino.

Общие сведения об OLED дисплеях

Технология OLED (Organic Light emitting diode – органический светоизлучающий диод) в настоящее время является самой распространённой для создания различных дисплеев, которые используются в современных телевизорах, ноутбуках, смартфонах и т.д. Небольшие по размеру OLED дисплеи находят применение и в различных электронных проектах – по сравнению с обычными алфавитно-цифровыми ЖК дисплеями они обеспечивают более наглядное отображение информации.

Внешний вид модуля OLED дисплея с 7-ю контактами показан на следующем рисунке.

В нашем проекте мы будем использовать 7-контактый модуль OLED дисплея SSD1306 0.96”. Данный модуль поддерживает 3 режима связи с ним: 3-х проводный SPI, 4-х проводный SPI и IIC. Мы будем использовать интерфейс SPI с 4-мя проводами – он обеспечивает самую быструю передачу информации среди рассмотренных.

Назначение контактов данного дисплея приведено в следующей таблице.

Номер контакта Название контакта Альтернативное название контакта Назначение контакта
1 Gnd Ground земля
2 Vdd Vcc, 5V напряжение питания (в диапазоне 3-5 В)
3 SCK D0, SCL, CLK контакт синхронизации (clock pin). Применяется в интерфейсах I2C и SPI
4 SDA D1, MOSI контакт данных. Применяется в интерфейсах I2C и SPI
5 RES RST, RESET контакт сброса модуля. Применяется в интерфейсе SPI
6 DC A0 контакт команд (Data Command pin). Применяется в интерфейсе SPI
7 CS Chip Select (выбор чипа) используется когда несколько устройств взаимодействуют по интерфейсу SPI

В данном проекте для взаимодействия с OLED дисплеем мы будем использовать библиотеку Adafruit_SSD1306 – она проста в использовании и обеспечивает много возможностей по работе с графикой. Но если ваш проект имеет жесткие ограничения по используемой памяти/быстродействию, то рекомендуем использовать библиотеку U8g – она работает быстрее и использует значительно меньше памяти.

Ранее на нашем сайте мы рассматривали подключение OLED дисплея к платам Arduino и Raspberry Pi, а также к модулю ESP8266.

Схема проекта

Схема часов реального времени на ESP32 и модуле DS3231 представлена на следующем рисунке.

Микросхема модуля часов реального времени DS3231 использует для взаимодействия с другими устройствами протокол I2C по контактам SCL, SDA, Vcc и GND. Необходимо сделать следующие ее соединения с модулем ESP32:

  1. SCL of RTC -> SCL of ESP32 (Pin D22)
  2. SDA of RTC -> SDA of ESP32 (Pin D21)
  3. GND of RTC -> GND of ESP32
  4. Vcc of RTC -> Vcc of ESP32

В нашем проекте мы используем протокол SPI для взаимодействия между модулем ESP32 и OLED дисплеем. В схеме необходимо сделать следующие соединения между ними:

  1. CS (Chip select) pin of OLED -> PIN D5 модуля ESP32
  2. DC pin of OLED -> PIN D4 модуля ESP32
  3. RES pin of OLED -> PIN D2 модуля ESP32
  4. SDA pin of OLED -> PIN D23 (MOSI) модуля ESP32
  5. SCK pin of OLED -> PIN D18 (SCK) модуля ESP32
  6. Vdd of OLED -> Vcc модуля ESP32
  7. GND of OLED -> GND модуля ESP32

Внешний вид собранной на макетной плате конструкции проекта показан на следующем рисунке.

Объяснение программы для модуля ESP32

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

Для данного проекта нам понадобится ряд библиотек, скачать которые можно по следующим ссылкам:

  1. Adafruit_SSD1306 : https://github.com/adafruit/Adafruit_SSD1306.
  2. SPI : https://github.com/PaulStoffregen/SPI.
  3. Adafruit_GFX : https://github.com/adafruit/Adafruit-GFX-Library.
  4. RTClib : https://github.com/adafruit/RTClib.

Далее в коде программы подключим эти библиотеки.

Далее объявим все контакты модуля  ESP32, к которым подключен OLED дисплей. Нет необходимости объявлять контакты для подключения модуля часов реального времени поскольку они уже объявлены в библиотеке WIRE.

В функции setup мы будем вызывать функцию rtc.adjust(DateTime(__DATE__, __TIME__)), которая будет устанавливать дату и время на модуле часов реального времени, соответствующие дате и времени на нашем компьютере (с которого мы программируем модуль ESP32).

Далее отобразим информацию на OLED дисплее.

В функции loop мы будем сохранять значение времени в переменной now и отображать ее значение на экране OLED дисплея, используя также функции установки размера текста (setTextSize), установки позиции курсора (setCursor) и т.д. После установки необходимых параметров отображения информации мы будем выводить значение времени на экран дисплея с помощью функции display.println.

Исходный код программы (скетча)

Видео, демонстрирующее работу проекта

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

Ваш адрес email не будет опубликован.