В этой статье рассмотрим использование модуля DS1302 RTC для установки и получения текущей даты и времени на платформе Arduino. Пример кода и все необходимые подключения будут описаны ниже.
Оборудование
Для выполнения проекта потребуется:
- Arduino (например, UNO)
- Модуль DS1302 RTC
- Соединительные провода
Схема подключения
DS1302 IC |
Atmel AVR |
ESP8266 |
ESP32 |
GND |
GND |
GND |
GND |
VCC2 |
5V/3.3V |
3V3 |
3V3 |
SCLK (CLK) |
2 |
D4 |
0 |
I/O (DAT) |
3 |
D2 |
5 |
CE (RST) |
4 |
D2 |
4 |

Установка библиотеки
Для работы с модулем DS1302, необходимо установить библиотеку Alash_DS1302. Установить её можно по следующей ссылке: Alash_DS1302.
- Скачайте библиотеку с GitHub.
- Откройте Arduino IDE.
- Перейдите в меню Скетч -> Подключить библиотеку -> Добавить .ZIP библиотеку.
- Выберите скачанный архив и добавьте его в Arduino IDE.
Пример кода
Ниже приведен пример кода для установки и чтения даты и времени с модуля DS1302:
/*
DS1302 RTC пример установки и получения даты/времени для Arduino
Источник: https://github.com/Alash-electronics/Alash_DS1302
*/
#include <Wire.h>
#include <Alash_DS1302.h>
/*
DS1302 IC Atmel AVR ESP8266 ESP32
GND GND GND GND
VCC2 5V(или 3.3V) 3V3 3V3
SCLK (CLK) 2(цифровой пин) D4 0
I/O (DAT) 3(цифровой пин) D2 5
CE (RST) 4(цифровой пин) D2 4
*/
// Подключение пина данных DS1302 к цифровому пину Arduino
#define DS1302_CLK_PIN 2
#define DS1302_IO_PIN 3
#define DS1302_CE_PIN 4
// Создание объекта RTC
Alash_DS1302 rtc = Alash_DS1302(DS1302_CLK_PIN, DS1302_IO_PIN, DS1302_CE_PIN);
#define DATE_STRING_SHORT 3
// Месяцы в памяти программы
const char monthNames_P[] PROGMEM = "JanFebMarAprMayJunJulAugSepOctNovDec";
// Дни недели в памяти программы
const char dayNames_P[] PROGMEM = "SunMonTueWedThuFriSat";
void setup(){
// Инициализация последовательного порта
delay(500); // Задержка 500 мс
Serial.begin(115200); // Начало последовательной связи с скоростью 115200 бит/с
while (!Serial) {
; // Ожидание завершения инициализации последовательного порта
}
Serial.println(F("\nПример чтения DS1302 от Alash-electronics")); // Вывод сообщения в последовательный порт
// Инициализация I2C
Wire.begin(); // Начало работы с I2C
Wire.setClock(100000); // Установка скорости передачи данных по I2C
// Инициализация RTC
while (!rtc.begin()) { // Повторять, пока RTC не инициализирован
Serial.println(F("RTC не найден")); // Вывод сообщения об ошибке в последовательный порт
delay(3000); // Задержка 3000 мс
}
// Установка даты/времени: 12:34:56 31 декабря 2024 года, воскресенье
if (!rtc.setDateTime(12, 34, 56, 31, 12, 2024, 7)) { // Если установка даты/времени не удалась
Serial.println(F("Ошибка установки даты/времени")); // Вывод сообщения об ошибке в последовательный порт
}
}
void loop() {
char name[DATE_STRING_SHORT + 1]; // Объявление массива для хранения строкового значения дня недели и месяца
uint8_t hour; // Объявление переменной для хранения часов
uint8_t min; // Объявление переменной для хранения минут
uint8_t sec; // Объявление переменной для хранения секунд
uint8_t mday; // Объявление переменной для хранения дня месяца
uint8_t mon; // Объявление переменной для хранения месяца
uint16_t year; // Объявление переменной для хранения года
uint8_t wday; // Объявление переменной для хранения дня недели
// Чтение даты/времени
if (!rtc.getDateTime(&hour, &min, &sec, &mday, &mon, &year, &wday)) { // Если чтение даты/времени не удалось
Serial.println(F("Ошибка чтения даты/времени")); // Вывод сообщения об ошибке в последовательный порт
return; // Завершение функции
}
// Вывод дня недели
strncpy_P(name, &(dayNames_P[wday * DATE_STRING_SHORT]), DATE_STRING_SHORT); // Копирование строки дня недели из памяти программ в буфер
name[DATE_STRING_SHORT] = '\0'; // Добавление завершающего символа строки
Serial.print(name); // Вывод дня недели в последовательный порт
Serial.print(F(" ")); // Вывод пробела в последовательный порт
// Вывод месяца
strncpy_P(name, &(monthNames_P[(mon - 1) * DATE_STRING_SHORT]), DATE_STRING_SHORT); // Копирование строки месяца из памяти программ в буфер
name[DATE_STRING_SHORT] = '\0'; // Добавление завершающего символа строки
Serial.print(name); // Вывод месяца в последовательный порт
Serial.print(F(" ")); // Вывод пробела в последовательный порт
// Вывод дня месяца
Serial.print(mday); // Вывод дня месяца в последовательный порт
Serial.print(F(" ")); // Вывод пробела в последовательный порт
// Вывод времени
Serial.print(hour); // Вывод часов в последовательный порт
Serial.print(F(":")); // Вывод двоеточия в последовательный порт
if (min < 10) {
Serial.print(F("0")); // Если минуты меньше 10, выводим "0" в последовательный порт
}
Serial.print(min); // Вывод минут в последовательный порт
Serial.print(F(":")); // Вывод двоеточия в последовательный порт
if (sec < 10) {
Serial.print(F("0")); // Если секунды меньше 10, выводим "0" в последовательный порт
}
Serial.print(sec); // Вывод секунд в последовательный порт
Serial.print(F(" ")); // Вывод пробела в последовательный порт
// Вывод года
Serial.println(year); // Вывод года в последовательный порт
// Пауза в одну секунду
delay(1000); // Задержка 1000 мс
}
|
Проверка
После загрузки скетча в Arduino и подключения модуля DS1302, откройте "Монитор порта" в Arduino IDE с скоростью 115200 бит/с. Если все подключено правильно, вы увидите текущую дату и время, установленную в модуле DS1302.
Заключение
Этот проект демонстрирует, как легко можно использовать модуль DS1302 RTC для работы с датой и временем на платформе Arduino. Такой подход полезен для различных проектов, требующих отслеживания времени.