В этом проекте мы рассмотрим подключение модуля часов реального времени (RTC) DS3231 к плате STM32F103C8 (Blue Pill) и будем отображать считанные значения времени и даты на 0,96-дюймовом OLED-дисплее.
Мы будем использовать модуль часов реального времени (RTC) DS3231 для отслеживания правильного времени и даты и отображения их на OLED-дисплее, используя плату STM32F103C8 в качестве микроконтроллера.
Альтернативная микросхема для DS3231 — DS1307. Модуль DS3231 имеет встроенные функции сигнализации, а также датчик температуры с разрешением 0,25 и точностью ±3°C.
Ранее на нашем сайте мы уже рассматривали проекты на основе других микроконтроллеров (плат), в которых использовался модуль DS3231 (DS1307):
- часы реального времени на ESP32 и модуле DS3231;
- на микроконтроллере PIC и RTC модуле DS3231;
- часы реального времени с будильником на основе Arduino;
- бинарные часы на светодиодах с использованием Arduino;
- часы на Arduino и 4-х разрядном семисегментном индикаторе;
- умные часы (Smart Watch) на основе Arduino, OLED дисплея и смартфона.
Необходимые компоненты
- Плата разработки STM32F103C8 (STM32 Blue Pill) (купить на AliExpress).
- Модуль часов реального времени DS3231 (купить на AliExpress).
- OLED дисплей с интерфейсом I2C и диагональю экрана 0.96 дюйма (купить на AliExpress — для данного проекта выбирайте вариант дисплея с 4 контактами).
- Макетная плата.
- Соединительные провода.
Модуль часов реального времени DS3231
DS3231 — это недорогие, но чрезвычайно точные часы реального времени (RTC) I²C со встроенным кварцевым генератором с температурной компенсацией (TCXO) и кристаллом. Устройство имеет разъем для батареи и поддерживает точный отсчет времени даже когда основное питание устройства прерывается.
RTC сохраняет информацию о секундах, минутах, часах, дне, дате, месяце и годе. Дата в конце месяца автоматически корректируется для месяцев с менее чем 31 днем, включая поправки на високосный год. Часы работают в 24-часовом или 12-часовом формате с активным индикатором AM/PM. Предусмотрены два программируемых будильника времени суток и программируемый выход прямоугольной волны.
Прецизионный температурно-компенсированный опорный источник напряжения и схема компаратора контролируют состояние VCC для обнаружения сбоев питания, обеспечения сброса выходного сигнала и автоматического переключения на резервный источник питания при необходимости. Кроме того, активно-низкий вывод RST модуля контролируется как вход кнопки для генерации сброса микропроцессора.
Основные характеристики модуля:
1. Высокоточные часы реального времени полностью управляют всеми функциями хронометража.
2. Часы реального времени отсчитывают секунды, минуты, часы, дату месяца, месяц, день недели и год с компенсацией високосного года до 2100 года.
3. Точность ±2 ppm от 0 °C до +40 °C.
4. Точность ±3,5 ppm от -40 °C до +85 °C.
5. Выход цифрового датчика температуры: точность ±3 °C.
6. Регистр для подстройки под старение.
7. Выход RST с активным низким значением/вход для устранения дребезга кнопки сброса.
8. Два будильника времени суток.
9. Программируемый выходной сигнал прямоугольной формы.
10. Простой последовательный интерфейс, подключаемый к большинству микроконтроллеров.
11. Быстрый (400 кГц) интерфейс I2C.
12. Вход резервного аккумулятора для непрерывного хронометража.
13. Работа в режиме низкого энергопотребления продлевает время работы от резервного аккумулятора.
14. Работа при напряжении 3,3 В.
15. Диапазоны рабочих температур: коммерческие (от 0 °C до +70 °C) и промышленные (от -40 °C до +85 °C).
16. Одобрено Underwriters Laboratories® (UL).
Схема проекта
Схема подключения модуля часов реального времени DS3231 к плате STM32F103C8 (Blue Pill) представлена на следующем рисунке. Как видите, схема достаточно проста и ее легко можно собрать на макетной плате.
DS3231 и OLED-дисплей оба являются модулями I2C. Поэтому нам нужно всего 2 контакта для их подключения. Итак, подключите линию передачи данных (SDA) к контакту B7 STM32F103C8, а линию синхронизации (SCL) — к контакту B6 STM32F103C8. Подайте 3,3 В на OLED и RTC-модуль через контакт 3,3 В платы STM32F103C8. Вы также можете использовать питание 5 В для DS3231 и OLED-модуля.
Исходный код программы
Исходный код для подключения модуля RTC DS3231 к STM32 приведен ниже. Программа написана в Arduino IDE. Вам необходимо установить плату STM32 в Arduino IDE. Вы можете скопировать код и загрузить его непосредственно на плату STM32. Для загрузки кода вы можете использовать последовательный метод или использовать отладчик ST link или модуль J-Link. Но перед этим вам понадобятся несколько библиотек. Поэтому сначала загрузите и добавьте библиотеки.
1. Adafruit_SSD1306: https://github.com/adafruit/Adafruit_SSD1306
2. Adafruit_GFX: https://github.com/adafruit/Adafruit-GFX-Library
3. RTClib: https://github.com/adafruit/RTClib
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
#include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include "RTClib.h" RTC_DS3231 rtc; char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels #define OLED_RESET -1 // Reset pin # (or -1 if sharing reset pin) Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); void setup() { Serial.begin(9600); if (! rtc.begin()) { Serial.println("Couldn't find RTC"); while (1); } if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println(F("SSD1306 allocation failed")); for(;;); // Don't proceed, loop forever } rtc.adjust(DateTime(__DATE__, __TIME__)); display.display(); delay(2); display.clearDisplay(); 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(2); display.setCursor(0,20); display.println(now.day(), DEC); display.setTextSize(2); display.setCursor(25,20); display.println("-"); display.setTextSize(2); display.setCursor(40,20); display.println(now.month(), DEC); display.setTextSize(2); display.setCursor(55,20); display.println("-"); display.setTextSize(2); display.setCursor(70,20); display.println(now.year(), DEC); display.setTextSize(2); display.setCursor(0,40); display.print(daysOfTheWeek[now.dayOfTheWeek()]); display.display(); } |
Тестирование работы проекта
После загрузки кода модуль RTC начнет работать. Время и дата будут отображаться на OLED-дисплее. Никаких других настроек не требуется, также нет необходимости в дополнительных кнопках или переключателях.