Руководство по модулю часов реального времени (RTC) с Arduino (DS1307 и DS3231)
Эта статья о том, как использовать модуль часов реального времени DS1307 (RTC) с Arduino. Вы также можете следовать этому руководству для других аналогичных модулей, таких как DS3231 RTC.
Знакомство с модулем часов реального времени
Модуль часов реального времени показан на рисунке ниже (вид спереди и сзади).
При первом использовании этого модуля вам необходимо припаять штыревые разъёмы (header pins).
Как видно на рисунке выше, модуль имеет установленную резервную батарею. Это позволяет модулю сохранять время, даже когда он не получает питание от Arduino. Таким образом, каждый раз, когда вы включаете и выключаете модуль, время не сбрасывается.
Этот модуль использует I2C-связь. Это значит, что он обменивается данными с Arduino, используя всего 2 вывода.
Где купить?
Модуль часов реального времени — это доступный модуль. Вы можете посмотреть модуль DS1307 Real Time Clock на Maker Advisor и найти лучшую цену.
Подключение выводов
Подключение модуля RTC выполняется очень просто!
Вывод |
Подключение к Arduino Uno |
|---|---|
SCL |
A5 |
SDA |
A4 |
VCC |
5V |
GND |
GND |
Если вы используете плату Arduino, отличную от Uno, проверьте, какие выводы SCL и SDA на вашей плате.
Nano: SDA (A4); SCL (A5)
MEGA: SDA (20); SCL (21)
Leonardo: SDA (20); SCL (21)
Пример: Отображение даты и времени в Serial Monitor
Этот пример отображает дату и время в Serial Monitor.
Необходимые компоненты
Для этого примера вам понадобятся следующие компоненты (нажмите на ссылки ниже, чтобы найти лучшую цену на Maker Advisor):
Вы можете использовать ссылки выше или перейти напрямую на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!
Схема подключения
Подключите модуль часов реального времени к Arduino, как показано на схеме ниже.
Код
Работа с RTC требует двух важных шагов:
установка текущего времени, чтобы RTC знал, который сейчас час
сохранение времени, чтобы RTC всегда показывал правильное время, даже когда он выключен
Установка текущего времени в модуле часов реального времени
Для установки текущего времени вам нужно изменить предоставленный код.
установите текущее время в функции setDS3231time()
Параметры функции выделены красным: секунды, минуты, часы, день недели, дата, месяц и год (в таком порядке). Воскресенье — это день 1 недели, а суббота — 7. Не забудьте раскомментировать эту строку кода.
После установки текущего времени вы можете загрузить предоставленный код с необходимыми изменениями.
Код был написан John Boxall с сайта tronixstuff. Вы можете прочитать его руководство здесь.
// Written by John Boxall from http://tronixstuff.com
#include "Wire.h"
#define DS3231_I2C_ADDRESS 0x68
// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val){
return( (val/10*16) + (val%10) );
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val){
return( (val/16*10) + (val%16) );
}
void setup(){
Wire.begin();
Serial.begin(9600);
// set the initial time here:
// DS3231 seconds, minutes, hours, day, date, month, year
setDS3231time(30,42,16,5,13,10,16);
}
void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte
dayOfMonth, byte month, byte year){
// sets time and date data to DS3231
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0x0E); // select register
Wire.write(0b00011100); // write register bitmap, bit 7 is /EOS
Wire.write(decToBcd(second)); // set seconds
Wire.write(decToBcd(minute)); // set minutes
Wire.write(decToBcd(hour)); // set hours
Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)
Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
Wire.write(decToBcd(month)); // set month
Wire.write(decToBcd(year)); // set year (0 to 99)
Wire.endTransmission();
}
void readDS3231time(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year){
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0); // set DS3231 register pointer to 00h
Wire.endTransmission();
Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
// request seven bytes of data from DS3231 starting from register 00h
*second = bcdToDec(Wire.read() & 0x7f);
*minute = bcdToDec(Wire.read());
*hour = bcdToDec(Wire.read() & 0x3f);
*dayOfWeek = bcdToDec(Wire.read());
*dayOfMonth = bcdToDec(Wire.read());
*month = bcdToDec(Wire.read());
*year = bcdToDec(Wire.read());
}
void displayTime(){
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
// retrieve data from DS3231
readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
&year);
// send it to the serial monitor
Serial.print(hour, DEC);
// convert the byte variable to a decimal number when displayed
Serial.print(":");
if (minute<10){
Serial.print("0");
}
Serial.print(minute, DEC);
Serial.print(":");
if (second<10){
Serial.print("0");
}
Serial.print(second, DEC);
Serial.print(" ");
Serial.print(dayOfMonth, DEC);
Serial.print("/");
Serial.print(month, DEC);
Serial.print("/");
Serial.print(year, DEC);
Serial.print(" Day of week: ");
switch(dayOfWeek){
case 1:
Serial.println("Sunday");
break;
case 2:
Serial.println("Monday");
break;
case 3:
Serial.println("Tuesday");
break;
case 4:
Serial.println("Wednesday");
break;
case 5:
Serial.println("Thursday");
break;
case 6:
Serial.println("Friday");
break;
case 7:
Serial.println("Saturday");
break;
}
}
void loop(){
displayTime(); // display the real-time clock data on the Serial Monitor,
delay(1000); // every second
}
Сохранение времени в модуле часов реального времени
Если вы не хотите сбрасывать время каждый раз, когда RTC выключается, вам нужно сделать следующее:
после установки времени вам следует закомментировать функцию, которая устанавливает время, и загрузить код снова.
Это очень важный шаг для настройки времени в вашем RTC. Если вы этого не сделаете, каждый раз при сбросе RTC он будет показывать время, которое вы установили ранее, а не текущее время.
Демонстрация
Откройте Serial Monitor на скорости 9600 бод и вы увидите результаты.
Вот Serial Monitor, отображающий текущую дату и время.
Подведение итогов
Надеемся, что это руководство оказалось для вас полезным.
Модуль RTC действительно полезен, и вы можете использовать его как часы, таймер и т.д.
Если вы хотите отображать дату и время с модуля RTC на OLED-дисплее, ознакомьтесь со следующей статьёй:
Какие проекты вы уже сделали или планируете создать с этим модулем?
Напишите об этом в комментариях ниже.
Спасибо за чтение.