Первый вопрос, который может возникнуть у читателя этой статьи, заключается в том, зачем нам на самом деле нужен отдельный модуль часов реального времени (Real Time Clock, RTC) для нашего проекта Arduino, если в самой Arduino есть встроенный таймер. Но суть здесь в том, что модуль RTC работает от батарейки и может отслеживать время, даже если мы перепрограммируем микроконтроллер или отключим его основное питание.
В данной статье мы рассмотрим как подключить модуль часов реального времени DS3231 к плате Arduino. Также на нашем сайте вы можете посмотреть все проекты с использованием модуля DS3231.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress) или Arduino Mega 2560 (купить на AliExpress) (Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158).
- Модуль часов реального времени DS3231 RTC (купить на AliExpress).
Модуль часов реального времени DS3231
DS3231 — это недорогие и высокоточные часы реального времени, которые могут хранить часы, минуты и секунды, а также информацию о дне, месяце и годе. Кроме того, предусмотрена автоматическая компенсация за високосные годы и месяцы с числом менее 31 дня.
Модуль может работать как от 3,3, так и от 5 В, что делает его пригодным для многих платформ разработки или микроконтроллеров. Входное напряжение батареи составляет 3 В, а типичная батарея CR2032 3 В может питать модуль и сохранять информацию более года.
Модуль использует протокол связи I2C, который упрощает его подключение к плате Arduino. Также на нашем сайте вы можете прочитать подробное руководство по работе Arduino с протоколом I2C.
Схема проекта
Схема подключения модуля часов реального времени DS3231 к плате Arduino представлена на следующем рисунке.
Итак, все, что нам нужно, это 4 провода, контакты VCC и GND для питания модуля, а также два контакта интерфейса I2C: SDA и SCL.
Программирование
После подключения модуля нам нужно запрограммировать плату Arduino для работы с часами реального времени. Однако когда дело доходит до программирования связи между Arduino и модулем I2C, код не такой уж маленький и простой. К счастью, для DS3231 RTC уже есть несколько библиотек, которые можно найти в Интернете.
Для этого урока я решил использовать библиотеку Хеннинга Карлсена, которую можно найти и загрузить с его сайта www.rinkydinkelectronics.com .
Итак, как только мы загрузим и установим библиотеку, мы сможем использовать ее первый демонстрационный пример, чтобы первоначально активировать часы модуля RTC. В разделе настройки кода демонстрационного примера мы можем заметить, что есть три строки, которые нам нужно раскомментировать, чтобы изначально установить день недели, время и дату.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// Code from the Demo Example of the DS3231 Library void setup() { // Setup Serial connection Serial.begin(115200); // Uncomment the next line if you are using an Arduino Leonardo //while (!Serial) {} // Initialize the rtc object rtc.begin(); // The following lines can be uncommented to set the date and time //rtc.setDOW(WEDNESDAY); // Set Day-of-Week to SUNDAY //rtc.setTime(12, 0, 0); // Set the time to 12:00:00 (24hr format) //rtc.setDate(1, 1, 2014); // Set the date to January 1st, 2014 } |
Первая строка предназначена для установки дня недели, вторая строка — для установки времени в часах, минутах и секундах, третья строка — для установки даты в днях, месяцах и годах.
Как только мы загрузим этот код, нам нужно будет закомментировать три строки и повторно загрузить код.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// Code from the Demo Example of the DS3231 Library void loop() { // Send Day-of-Week Serial.print(rtc.getDOWStr()); Serial.print(" "); // Send date Serial.print(rtc.getDateStr()); Serial.print(" -- "); // Send time Serial.println(rtc.getTimeStr()); // Wait one second before repeating delay (1000); } |
Если мы посмотрим на раздел кода, посвященный циклу, то увидим, что теперь, используя три пользовательские функции, мы получаем информацию от модуля часов реального времени и печатаем ее в последовательном мониторе. Вот как они выглядят в Serial Monitor.
Теперь, даже если мы отключим питание Arduino, а затем снова подключим его и снова запустим последовательный монитор, мы заметим, что время продолжает идти без сброса.
Итак, теперь у нас есть часы реального времени, которые работают, и мы можем использовать их в любом проекте Arduino. В качестве второго примера я подключил ЖК-дисплей к Arduino и вывел на него время и дату.
Вот исходный код этого примера:
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 |
/* * Arduino DS3231 Real Time Clock Module Tutorial * * Crated by Dejan Nedelkovski, * www.HowToMechatronics.com * * DS3231 Library made by Henning Karlsen which can be found and downloaded from his website, www.rinkydinkelectronics.com. * */ #include <DS3231.h> #include <LiquidCrystal.h> // includes the LiquidCrystal Library DS3231 rtc(SDA, SCL); LiquidCrystal lcd(1, 2, 4, 5, 6, 7); // Creates an LC object. Parameters: (rs, enable, d4, d5, d6, d7) void setup() { rtc.begin(); // Initialize the rtc object lcd.begin(16,2); // Initializes the interface to the LCD screen, and specifies the dimensions (width and height) of the display } } void loop() { lcd.setCursor(0,0); lcd.print("Time: "); lcd.print(rtc.getTimeStr()); lcd.setCursor(0,1); lcd.print("Date: "); lcd.print(rtc.getDateStr()); delay(1000); } |