Часы реального времени ESP32 (RTC) с использованием DS1307 и OLED-дисплея

Casy Real Nogo Vremeni Esp32 Rtc S Ispol Zovaniem Ds1307 I Oled Displea



ESP32 поставляется со встроенным модулем RTC, но он работает только при наличии питания. В случае отключения питания часы будут сброшены и не смогут показывать правильное время. Поэтому, если вы хотите отслеживать время или управлять каким-либо устройством, основанным на времени, попробуйте датчик RTC DS1307. Однако вы можете подумать о подключении резервной батареи к плате ESP32, но это не лучший вариант, если у вас нехватка электроэнергии. Лучшая альтернатива — использовать датчик DS1307, поскольку он оснащен встроенной батареей, срок службы которой составляет минимум год.

Чтобы прояснить ситуацию, внутренние часы реального времени (RTC) ESP32 могут отслеживать время, даже когда основной процессор выключен или находится в глубоком сне. Вы можете использовать ESP32 RTC для отслеживания времени, не потребляя много энергии и не затрагивая главный процессор. Но для работы ему по-прежнему требуется питание, не так уж и много, но для работы внутреннего RTC требуется минимальное количество энергии.

Таким образом, нам остается только использовать внешний модуль RTC. Давайте рассмотрим этапы взаимодействия платы ESP32 с модулем RTC DS1307.







Содержание:

1. Что такое модуль RTC DS1307?

DS1307 — это устройство с низким энергопотреблением, которое может точно отслеживать время и дату. Он использует двоично-десятичный формат (BCD). Он может сообщать вам время в подробном формате, например, в секундах, минутах и ​​даже часах и днях. Вы также можете распечатать дату в полном формате, например, месяц и год. Он также знает, когда наступает високосный год, вплоть до 2100. Для связи с DS1307 можно использовать протокол I2C.





DS1307 имеет встроенную батарею, которая может питать его около года без внешнего источника 5 В. Используя эту резервную батарею, он может сохранять время даже при отключении основного питания. Он также имеет 56 байт SRAM для хранения некоторых данных. DS1307 — это удобное устройство, которое имеет множество применений в сочетании с платой Arduino или ESP32. Например, эти данные могут быть полезны при регистрации данных, системах сигнализации или промышленном управлении. Если вам нужен надежный хронометраж, DS1307 — отличный вариант.





Технические характеристики модуля RTC DS1307

Модуль RTC DS1307 состоит из микросхемы RTC, EEPROM, кварцевого генератора и держателя резервной батареи.



Ниже приведены подробности этих частей:

DS1307 ИС часов реального времени : Микросхема DS1307 RTC — это 8-контактный чип, который отслеживает время и дату с помощью протокола I2C. Он потребляет очень мало энергии, менее 500 нА. Он может отображать время в секундах, минутах и ​​часах, а дату в днях, месяцах и годах. Он также может переключаться между 24-часовым и 12-часовым форматами.

24C32 ИС ЭСППЗУ : Микросхема EEPROM 24C32 представляет собой 32-байтовую микросхему от Atmel, которая хранит настройки, время и дату. Он также использует протокол I2C.

Кристалл 32,768 кГц : кварцевый генератор с частотой 32,768 кГц обеспечивает тактовую частоту микросхемы DS1307 RTC.

Держатель батареи : Держатель батареи предназначен для батареи CR2032. Это литиевая батарейка типа «таблетка» напряжением 3 В. Он обеспечивает непрерывное питание микросхемы DS1307 RTC.

Поставка датчика DS18B20 : Наличие датчика DS18B20 позволяет припаять и использовать датчик температуры DS18B20. Он не припаян заранее. Вы можете припаять сквозной корпус и получить температуру от контакта DS модуля.

В приведенном ниже списке приведены некоторые краткие характеристики датчика RTC DS1307:

  • Рабочее напряжение: 4,5–5,5 В, обычно 5 В
  • Потребление тока : Менее 1,5 мА
  • Точность : 0–40 °C, зависит от кристалла
  • Батарея : CR2032 (монета 3 В)
  • Память : 56 байт энергонезависимой оперативной памяти
  • Интерфейс : Двухпроводной (I2C) последовательный интерфейс.
  • Выход : выходной контакт 1 Гц
  • Программируемый выход прямоугольной волны : Потребляет менее 500 нА в режиме резервного питания.
  • Обнаружение сбоя питания : Автоматическое обнаружение сбоя питания и схема переключения.
  • Схема измерения мощности : Он может автоматически переключаться на резервное питание при недостатке питания.
  • Компенсация високосного года : Действительно до 2100 года.

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

Модуль имеет несколько контактов с разными функциями.

  • ВКК это контакт, которому для питания модуля требуется напряжение постоянного тока от 3,3 В до 5,5 В.
  • Земля Это контакт низкого напряжения или земли.
  • ПДД и СКЛ — это контакты, передающие данные и тактовые сигналы через шину I2C.
  • ДС это контакт, который измеряет температуру с помощью датчика DS1307, если он у вас есть на модуле RTC.
  • КВ. это вывод, который генерирует прямоугольный сигнал с частотой 1 Гц, 4 кГц, 8 кГц или 32 кГц, в зависимости от того, как вы его запрограммировали.
  • ОДИН Это контакт, который использует батарею 3 В для поддержания точного времени при отключении основного питания.

2. Как соединить RTC DS1307 и OLED-дисплей с ESP32

Для сопряжения ESP32 с DS1307 и OLED-дисплеем вы можете использовать встроенные контакты I2C платы ESP32. И DS1307, и OLED-дисплей являются устройствами на базе I2C. Затем можно обмениваться данными, используя протокол master-slave I2C по шине I2C.

Прежде чем мы перейдем к интерфейсу ESP32 с DS1307 и OLED-дисплеем, сначала вам необходимо установить некоторые необходимые библиотеки.

Установка необходимых библиотек

Вам понадобятся две библиотеки: одна для модуля RTC и одна для OLED-дисплея. Используя OLED с модулем RTC, вы можете создавать потрясающие интерактивные изображения часов. Если у вас нет плана отображения времени на экране, то установку этой библиотеки можно пропустить.

Ниже приведены две библиотеки, которые вам понадобятся:

  • РТКлиб (от Adafruit) — это библиотека Arduino IDE для установки и получения времени от RTC. Он также предоставляет классы для управления датами, временем и продолжительностью. Используя эту библиотеку, вы можете подключать и программировать модули часов реального времени (RTC), такие как DS1307 и DS3231.
  • С SD1306 (от Adafruit) — это библиотека для Arduino, с помощью которой вы можете взаимодействовать и программировать OLED-дисплеи с Arduino или любой другой платой микроконтроллера.

Чтобы загрузить и установить обе эти библиотеки в Arduino IDE, сначала откройте Менеджер библиотеки найдите библиотеку RTClib и нажмите Установить :

Вы получите возможность установить только библиотеку или ее зависимости. Нажмите кнопку Установить все кнопку, чтобы полностью установить библиотеку. Таким образом, вы не получите никаких ошибок, если измените код, который зависит от зависимостей этой библиотеки.

Аналогично найдите библиотеку SSD1306. Эта библиотека необходима для OLED-дисплея. Нажмите Установить продолжать.

На этот раз вы также получите то же подтверждающее сообщение. Нажать на Установить все вариант.

Теперь обе библиотеки для OLED и DS1307 установлены и готовы к использованию. Но перед этим сначала узнайте адрес I2C для OLED-дисплея.

3. Поиск адреса I2C OLED-дисплея.

Адрес I2C — это уникальный идентификатор каждого устройства на шине I2C. Это позволяет главному устройству взаимодействовать с конкретным подчиненным устройством, отправляя данные на его адрес. Назначение адреса I2C — избежать конфликтов и путаницы между несколькими устройствами на одной шине.

Чтобы получить адрес устройства I2C, вы можете использовать простой эскиз, который сканирует автобус и печатает адреса устройств, которые он находит. Кроме того, вы можете проверить техническое описание устройства, чтобы увидеть его адрес по умолчанию или настраиваемый адрес.

Здесь, в нашем случае, после запуска кода сканера I2C на терминале Arduino IDE отображается следующий адрес I2C OLED-экрана.

В большинстве случаев велика вероятность, что и вы получите то же самое. 0x3C адрес вашего OLED-экрана.

4. Взаимодействие модуля OLED и RTC DS1307 с ESP32.

1. Соедините контакты SDA и SCL модуля DS1307 и OLED-дисплей к контактам I2C ESP32. Обычно, это GPIO 21 и GPIO 22 , но при необходимости вы также можете назначить в коде любые другие контакты.

2. Подключите VCC и GND DS1307 и OLED-дисплей к контактам 3,3 В и GND ESP32.

3. Вставьте батарейку типа «таблетка» CR2032 в модуль DS1307, чтобы обеспечить резервное питание для часов реального времени.

4. Загрузите пример кода из этого руководства на свою плату ESP32. Измените код для пользовательских выходных данных.

После загрузки часы начнут отсчитывать установленное время и отобразят время на OLED-экране.

5. Принципиальная схема

Принципиальная схема ESP32 с DS1307 проста: необходимо подключить всего четыре провода. Вы можете укоротить провода I2C SDA и SCL как датчиков OLED, так и DS1307. Аналогично, для питания обоих этих датчиков можно использовать контакты 3V3 и GND платы ESP32. При необходимости вы также можете подать питание от отдельного источника.

Примечание : питание RTC DS1307 от контакта 3,3 В ESP32 безопасно, если предел тока ESP32 не превышен. Но если вы хотите быть в безопасности, вы можете использовать отдельный источник питания для модуля RTC или попробовать маломощный датчик DS3231, рабочий диапазон которого составляет от 3,3 до 5,5 В постоянного тока.

На изображении ниже показано соединение ESP32 с датчиком RTC DS1307.

Аналогично, если вы хотите подключить OLED-экран для отображения времени, вы можете использовать те же контакты I2C и контакты питания платы ESP32.

6. Код

Используя приведенный ниже код, мы установим текущую дату и время на RTC. После установки времени код отобразит время на терминале Arduino IDE. Прежде чем загружать код, вам необходимо обновить его, указав текущую дату и время.

#include 'RTClib.h'
RTC_DS1307 DS1307_RTC;
символ Дни_недели [ 7 ] [ 12 ] '=' { 'Воскресенье' , 'Понедельник' , 'Вторник' , 'Среда' , 'Четверг' , 'Пятница' , 'Суббота' } ;
аннулировать настройку ( ) {
Серийный.begin ( 115200 ) ;
#ifndef ESP8266
пока ( ! Серийный ) ;
#endif
если ( ! DS1307_RTC.begin ( ) ) {
Серийный.println ( «Не удалось найти RTC» ) ;
пока ( 1 ) ;
}
DS1307_RTC.adjust ( ДатаВремя ( Ф ( __ДАТА__ ) , Ф ( __ВРЕМЯ__ ) ) ) ;
}
пустой цикл ( ) {
Дата и время сейчас = DS1307_RTC.now ( ) ;
Серийный.принт ( сейчас.год ( ) , Декабрь ) ;
Серийный.принт ( '/' ) ;
Серийный.принт ( сейчас.месяц ( ) , Декабрь ) ;
Серийный.принт ( '/' ) ;
Серийный.принт ( сейчас.день ( ) , Декабрь ) ;
Серийный.принт ( '(' ) ;
Серийный.принт ( Будни [ сейчас.dayOfTheWeek ( ) ] ) ;
Серийный.принт ( ')' ) ;
Серийный.принт ( сейчас.час ( ) , Декабрь ) ;
Серийный.принт ( ':' ) ;
Серийный.принт ( сейчас.минута ( ) , Декабрь ) ;
Серийный.принт ( ':' ) ;
Серийный.принт ( сейчас.секунда ( ) , Декабрь ) ;
Серийный.println ( ) ;
задерживать ( 1000 ) ;
}

Этот код использует библиотека RTClib для взаимодействия с модулем часов реального времени DS1307, который отслеживает дату и время.

настраивать функция началась с инициализации скорости передачи данных. После этого внутри этого раздела мы определили функцию синхронизации даты и времени компьютера с датчиком DS1307. Это позволит загрузить время компиляции кода в датчик RTC.

Вы можете использовать петля функция получения даты и времени из RTC. Затем вы можете отобразить его на последовательном мониторе следующим образом: год/месяц/день (день недели) час:минута:секунда. Не забудьте добавить задержку в одну секунду после каждого цикла, чтобы код выполнялся не слишком быстро.

Отображение текущего времени на OLED-дисплее

Чтобы отобразить то же время на OLED-экране, нам нужно добавить дополнительную часть кода для OLED-экрана. Просто загрузите данный код. Этот код будет отображать текущее время на вашем OLED-экране.

Помните, здесь мы используем 0,96-дюймовый OLED-модуль I2C SSD размером 128 × 64. Если вы используете любой другой размер, измените код соответствующим образом. Также проверьте адрес I2C и измените его в данном коде. В нашем случае у нас есть адрес I2C 0x3C для OLED-экрана.

#include
#include
#include
#include 'RTClib.h'
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

Дисплей Adafruit_SSD1306 ( SCREEN_WIDTH, SCREEN_HEIGHT, & Проволока, - 1 ) ;
RTC_DS1307 Часы реального времени;
чард-дни [ 7 ] [ 12 ] '=' { 'Воскресенье' , 'Понедельник' , 'Вторник' , 'Среда' , 'Четверг' , 'Пятница' , 'Суббота' } ;
аннулировать настройку ( ) {
Серийный.begin ( 115200 ) ;
если ( ! RTC.begin ( ) ) {
Серийный.println ( «Не удалось найти RTC» ) ;
пока ( 1 ) ;
}
RTC.adjust ( ДатаВремя ( Ф ( __ДАТА__ ) , Ф ( __ВРЕМЯ__ ) ) ) ;
если ( ! display.begin ( SSD1306_SWITCHCAPVCC, 0x3C ) ) {
Серийный.println ( Ф ( «Ошибка выделения SSD1306» ) ) ;
для ( ;; ) ;
}
задерживать ( 1000 ) ;
display.clearDisplay ( ) ;
display.setTextSize ( 2 ) ;
display.setTextColor ( БЕЛЫЙ ) ;
display.setCursor ( 30 , двадцать ) ;
display.println ( «Линукс» ) ;
дисплей.дисплей ( ) ;
задерживать ( 3000 ) ;
display.clearDisplay ( ) ;
}
пустой цикл ( ) {
Дата и время сейчас = RTC.now ( ) ;
display.clearDisplay ( ) ;
display.setTextSize ( 2 ) ;
display.setCursor ( 0 , 0 ) ;
display.print ( сейчас.день ( ) ) ;
display.print ( '/' ) ;
display.print ( сейчас.месяц ( ) ) ;
display.print ( '/' ) ;
display.print ( сейчас.год ( ) ) ;
display.println ( дни [ сейчас.dayOfTheWeek ( ) ] ) ;
display.println ( '' ) ;
display.setCursor ( 0 , 40 ) ;
если ( сейчас.час ( ) < 10 )
display.print ( '0' ) ;
display.print ( сейчас.час ( ) ) ;
display.print ( ':' ) ;
если ( сейчас.минута ( ) < 10 )
display.print ( '0' ) ;
display.print ( сейчас.минута ( ) ) ;
display.print ( ':' ) ;
если ( сейчас.секунда ( ) < 10 )
display.print ( '0' ) ;
display.println ( сейчас.секунда ( ) ) ;
дисплей.дисплей ( ) ;
}

Код начался с библиотек, которые мы установили для RTC и дисплея. После этого он определяет размер экрана и адрес дисплея. Он инициализирует массив названиями дней недели.

настраивать часть начинается с последовательной связи. Он проверяет, работают ли часы реального времени и дисплей или нет. После этого мы определили текстовую строку «Linuxhint», которая будет отображаться в течение 3 секунд. Это только вступительное или стартовое сообщение. Вы также можете изменить это сообщение, добавив свой собственный текст.

петля Функция получает дату и время модуля DS1307. После этого он очищает дисплей и печатает дату и время в отформатированном виде. Код также добавляет ведущие нули к часам, минутам и секундам, если их значения меньше 10.

7. Аппаратное обеспечение

После загрузки кода на плату ESP32 вы увидите следующий вывод на OLED-экране. В качестве аппаратного обеспечения мы использовали OLED-экран и модуль I2C RTC DS1307. Используется плата ESP32 с 30 контактами. Вы также можете поэкспериментировать с любой другой платой ESP32, но убедитесь, что контакты I2C подключены правильно.

Заключение

RTC DS1307 имеет 56-байтовую SRAM с поддержкой резервного питания от батареи. Это 8-контактное устройство, использующее протокол связи I2C. Для сопряжения модуля DS1307 RTC с ESP32 вы можете использовать контакты I2C (GPIO 22 (SCL) и GPIO 21 (SDA)) платы ESP32. Вы можете распечатать время на консоли Arduino IDE или использовать любой экран, например OLED или I2C LCD, для отображения времени. Модуль RTC DS1307 — полезное устройство для отслеживания времени и даты в различных приложениях. Некоторые основные приложения включают регистраторы данных, цифровые часы и умные часы.