В этом уроке мы узнаем о работе часов реального времени (RTC) и их взаимодействии с ESP32 и дисплеем OLED.

Мы будем использовать модуль DS3231 RTC, чтобы отслеживать правильное время и отображать его на OLED дисплее, используя ESP32 в качестве нашего микроконтроллера. ESP32 – это больше, чем микроконтроллер. Он имеет функции Wi-Fi и Bluetooth и 39 контактов GPIO. Также он поддерживает все протоколы связи, такие как SPI, I2C, UART и т. д.
DS3231 – это модуль часов реального времени. Он используется для поддержания актуальной даты и времени для большинства проектов в области электроники. Этот модуль имеет собственный источник питания типа батирейка-таблетка, с помощью которого он поддерживает дату и время, даже когда основное питание отключено или микроконтроллер прошел полный сброс. Поэтому, как только мы установим дату и время в этом модуле, он всегда будет поддерживать их. Существует несколько типов микросхем RTC, таких как DS1307, DS3231 и т. д.

Для вывода даты и времени будем использовать OLED дисплей. Термин OLED обозначает «Органический светоизлучающий диод», он использует ту же технологию, которая используется в большинстве наших телевизоров, но имеет меньше пикселей по сравнению с ними.


Мы используем монохромный 7-контактный OLED-дисплей SSD1306 0,96”. Причина выбора этого дисплея заключается в том, что он может работать с тремя различными протоколами связи, такими как трехпроводной режим SPI 3, четырехпроводной режим SPI и I2C. В этом руководстве будет рассказано, как использовать модуль в 4-проводном режиме SPI, так как это самый быстрый и стандартный режим связи.
Сообщество Arduino уже предоставило нам много библиотек, которые можно напрямую использовать с ESP32. Например, библиотека Adafruit_SSD1306 очень проста в использовании и имеет несколько графических опций, поэтому мы будем использовать ее в этом руководстве. Но если у вашего проекта есть ограничение памяти/скорости, попробуйте использовать библиотеку U8g, поскольку она работает быстрее и занимает меньше памяти.
Принципиальная схема подключения модуля RTC3231 на основе DS3231 и OLED-дисплея SSD1306 к ESP32 представлена далее.

Физически все это может выглядеть следующим образом.

Код программы часов реального времени на ESP32 и DS3231 приведен далее.
#include <SPI.h> // https://github.com/PaulStoffregen/SPI
#include <Wire.h>
#include <Adafruit_GFX.h> // https://github.com/adafruit/Adafruit-GFX-Library
#include <Adafruit_SSD1306.h> // https://github.com/adafruit/Adafruit_SSD1306
#include "RTClib.h" // https://github.com/adafruit/RTClib
RTC_DS3231 rtc;
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
#define OLED_MOSI 23
#define OLED_CLK 18
#define OLED_DC 4
#define OLED_CS 5
#define OLED_RESET 2
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
void setup()
{
Serial.begin(9600);
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
rtc.adjust(DateTime(__DATE__, __TIME__));
display.begin(SSD1306_SWITCHCAPVCC);
display.clearDisplay();
display.setTextColor(WHITE);
//display.startscrollright(0x00, 0x0F);
display.setTextSize(2);
display.setCursor(0,5);
display.print(" Clock ");
display.display();
delay(3000);
}
void loop()
{
DateTime now = rtc.now();
display.clearDisplay();
display.setTextSize(2);
display.setCursor(75,0);
display.println(now.second(), DEC);
display.setTextSize(2);
display.setCursor(25,0);
display.println(":");
display.setTextSize(2);
display.setCursor(65,0);
display.println(":");
display.setTextSize(2);
display.setCursor(40,0);
display.println(now.minute(), DEC);
display.setTextSize(2);
display.setCursor(0,0);
display.println(now.hour(), DEC);
display.setTextSize(1);
display.setCursor(0,15);
display.println(now.day(), DEC);
display.print(daysOfTheWeek[now.dayOfTheWeek()]);
display.setTextSize(1);
display.setCursor(25,15);
display.println("-");
display.setTextSize(1);
display.setCursor(40,15);
display.println(now.month(), DEC);
display.setTextSize(1);
display.setCursor(55,15);
display.println("-");
display.setTextSize(1);
display.setCursor(70,15);
display.println(now.year(), DEC);
display.display();
}
© digitrode.ru