Подключение DS1302 к Arduino
В этой статье расскажу как подключить часы реального времени DS1302 к Arduino UNO. В прошлых статьях рассказывал о похожих модулях DS1307 и DS3231, которые работают таким же образом, что и DS1302, но основное различие между ними, это используемая линия связи с Arduino. Модули DS1307 и DS3231 используют линию I2C, а DS1302 использует трех проводную линию.
В этой статье расскажу как подключить часы реального времени DS1302 к Arduino UNO. В прошлых статьях рассказывал о похожих модулях DS1307 и DS3231, которые работают таким же образом, что и DS1302, но основное различие между ними, это используемая линия связи с Arduino. Модули DS1307 и DS3231 используют линию I2C, а DS1302 использует трех проводную линию.
Технические параметры HX711:
► Микросхема: DS1302;
► Номинальное напряжение: 2-5.5 В;
► Потребляемый ток: менее 300 нА;
► Рабочая частота: 32.768 кГц;
► ОЗУ: 31 байт;
► Габариты: 44 × 23 × 11 мм;
► Вес: 7 грамм.
Краткий обзор модуля DS1307
Основная и единственная микросхема на модуле, это DS1302, как еще называют «Real Time Clock» (Часы Реального Времени), сокращенно RTC. Данная микросхема поддерживает секунды, минуты, часы, день недели, дата, месяц и год информацию, а так же следит за количеством дней в месяце и делает поправку на високосный год. Микросхема работает в 24-часовом или 12-часовом формате с индикатором AM/PM.
На плате, кроме микросхемы DS1302, установлен кварц на 32,768 кГц и бокс для батарейки тика CR2032. Для связи и подачи питания, предусмотрен пяти контактный разъем, шагом 2,54 мм.
Назначение контактов:
► Vcc и GND — Питание модуля, 2 — 5.5 В;
► CLK — Вход тактовой частоты последовательных данных.
► DAT — Ввод/вывод последовательных данных
► RST — Включение логике RTC
Подключение DS3231 к Arduino
Необходимые детали:
► Arduino UNO R3 x 1 шт.
► Часы реального времени на DS1302, RTC x 1 шт.
► Провод DuPont, 2,54 мм, 20 см, F-M (Female — Male) x 1 шт.
► Кабель USB 2.0 A-B x 1 шт.
Описание:
В примере покажу как подключить модуль DS1302 к Arduino UNO. В скетче установим текущие время и затем прочитаем его, полученные данные отправим в последовательный порт.
Подключение:
Схема не сложная, необходимо пять проводов, сначала подключаем шину Vcc и GND от модуля DS1302 к выводам Arduino 5 В и GND (можно и запитать и от 3.3 В), затем подключим CLK, DAT, RST от модуля DS1302 к выводам Arduino 6, 7, 8 (при необходимости, выводы можно поменять). Схема собрана, для удобства приведу принципиальную схему подключения.
Установка библиотек:
Для работы с модулем необходимо установить библиотеку «RTC by Makuna», для этого, перейдите в Скетч —> Подключить библиотеку —> Управление библиотеками.
В строке поиска введите «1302», найдите библиотеку « RTC by Makuna » и установите данную библиотеку.
Программа:
Теперь запускаем среду разработку Arduino IDE и загружаем скетч в контроллер.
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 |
#include <ThreeWire.h> // Подключаем библиотеку ThreeWire #include <RtcDS1302.h> // Подключаем библиотеку RtcDS1302 ThreeWire myWire(7,6,8); // Указываем вывода IO, SCLK, CE RtcDS1302<ThreeWire> Rtc(myWire); void setup () { Serial.begin(9600); // Установка последовательной связи на скорости 9600 Serial.print("Data: "); // Отправка данных на последовательный порт Serial.println(__DATE__); // Получение даты и времени с ПК Serial.print("Time: "); // Отправка данных на последовательный порт Serial.println(__TIME__); // Получение даты и времени с ПК Rtc.Begin(); // Инициализация RTC RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__); // Копирование даты и времени в compiled Rtc.SetDateTime(compiled); // Установка времени Serial.println(); // Отправка данных на последовательный порт } void loop () { Rtc.GetDateTime(); RtcDateTime now = Rtc.GetDateTime(); Serial.print("DATA RTC "); // Отправка данных на последовательный порт Serial.print(now.Month()); // Отправка месяца Serial.print("."); // Отправка данных на последовательный порт Serial.print(now.Day()); // Отправка дня Serial.print("."); // Отправка данных на последовательный порт Serial.print(now.Year()); // Отправка года Serial.print(" TIME RTC "); // Отправка данных на последовательный порт Serial.print(now.Hour()); // Отправка часа Serial.print(":"); // Отправка данных на последовательный порт Serial.print(now.Minute()); // Отправка минут Serial.print(":"); // Отправка данных на последовательный порт Serial.println(now.Second()); // Отправка секунд delay(2000); // Пауза 2 с } |
Загрузите скетч и откройте «Последовательный монитор» из Arduino IDE.
Вот и все, если будут вопросы пишите.
Ссылки
Библиотека RtcDS1302
Документация на DS1302
Купить на Aliexpress
Контроллер Arduino UNO R3 на CH340G
Контроллер Arduino UNO R3 на Atmega16U2
Комплект проводов DuPont, 2,54 мм, 20 см
Часы реального времени на DS1302
Купить в Самаре и области
Контроллер Arduino UNO R3 на CH340G
Контроллер Arduino UNO R3 на Atmega16U2
Провода DuPont, 2,54 мм, 20 см
Часы реального времени на DS1302, RTC
А как установить время 0 часов 0 минут 0 часов? А ещё я хотел спросить, как сделать милисекунды?
Сильвер, здравствуйте! У меня была подобная проблема, укажите номера пинов в этом порядке.
Заменить на 4-ой строчке у автора: ThreeWire myWire(8, 9, 7); // Указываем вывода DATE, CLK, RST (на датчике такие значения). Пины 8, 9, 7, конкретно у меня такие, вы можете поставить другие.
Очень важные дополнения для всех кто делает это в первый раз:
автор использует функцию Rtc.SetDateTime(compiled);, что устанавливает текущее время при каждой перезагрузке Arduino. Это может быть полезно только один раз для установки времени, после чего ты можешь закомментировать эту строку, чтобы не перезаписывать время каждый раз при старте.
Нет проверки что подгруженное время успешно прочитано: Перед тем как выводить данные, можно добавить проверку успешности чтения времени с RTC
Чтобы избежать перезаписи времени при каждом запуске Arduino, можно сделать следующее: проверять текущее время на устройстве и устанавливать его только в случае, если оно недействительно. Это можно реализовать с помощью проверки флага на отсутствие установленного времени. Например, если время сброшено или не было установлено ранее, Arduino сможет установить его один раз.
Вот метод, который можно использовать:
Проверить, было ли время установлено ранее.
Установить время только если оно недействительно.
пример кода с этой логикой:
#include // Подключаем библиотеку ThreeWire
#include // Подключаем библиотеку RtcDS1302
ThreeWire myWire(7, 6, 8); // Указываем пины IO, SCLK, CE
RtcDS1302 Rtc(myWire);
void setup ()
{
Serial.begin(9600); // Установка скорости последовательной связи на 9600
Rtc.Begin(); // Инициализация RTC
// Проверка, что время на RTC корректное
if (!Rtc.GetIsRunning() || !Rtc.GetDateTime().IsValid()) {
Serial.println(«RTC остановлены или время некорректно, установка времени…»);
RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__); // Время компиляции
Rtc.SetDateTime(compiled); // Установка времени (с компиляции)
Rtc.SetIsRunning(true); // Запуск RTC
} else {
Serial.println(«Время уже установлено.»);
}
Serial.print(«Дата компиляции: «);
Serial.println(__DATE__); // Вывод даты компиляции
Serial.print(«Время компиляции: «);
Serial.println(__TIME__); // Вывод времени компиляции
}
void loop ()
{
RtcDateTime now = Rtc.GetDateTime();
// Проверка на корректность времени
if (!now.IsValid()) {
Serial.println(«Ошибка: время с модуля RTC недоступно»);
return;
}
// Вывод даты
Serial.print(«Дата RTC: «);
Serial.print(now.Day());
Serial.print(«.»);
Serial.print(now.Month());
Serial.print(«.»);
Serial.print(now.Year());
// Вывод времени
Serial.print(» Время RTC: «);
Serial.print(now.Hour());
Serial.print(«:»);
Serial.print(now.Minute());
Serial.print(«:»);
Serial.println(now.Second());
delay(2000); // Задержка 2 секунды
}