RTC модуль DS1307, 24C32

RTC I2C (DS1307, 24C32)

RTC модуль DS1307 подключение к Arduino

Модуль рассматриваемый в статье содержит в себе сразу две микросхемы: DS1307 (часы реального временис I2C- интерфейсом) и AT24C32 (микросхема памяти EEPROM на 32K bit).

В данной статье рассмотрим работу только микросхемы часов реального времени DS1307.

RTC модуль DS1307 подключение к Arduino

Основные технические характеристики:

• Подсчет реального времени в секундах, минутах, часах, датах месяца, месяцах, днях недели и годах с учетом высокосности текущего года вплоть до 2100 г.

• 56 байт энергонезависимого ОЗУ для хранения данных

• 2-х проводной последовательный интерфейс

• Программируемый генератор прямоугольных импульсов. Может выдавать 1 ГЦ, 4.096 кГЦ, 8,192 кГЦ и 32,768 кГц.

• Автоматическое определение отключения основного источника питания и подключение резервного

• 24-х часовой и 12-ти часовой режим

• Потребление не более 500 нA при питании от резервной батареи питания при температуре 25C°

 

Микросхема выпускается в восьмипиновых DIP и SOIC корпусах. Распиновка для всех одинакова. Далее приведу строки из даташита для полноты картины.

RTC модуль DS1307

Назначение выводов:

• X1, X2 –  Служат для подключения 32.768 кГц кварцевого резонатора

• Vbat – Вход для любой стандартной трёхвольтовой литиевой батареи или другого источника энергии. Для нормальной работы DS1307 необходимо, чтобы напряжение батареи было в диапазоне 2.0 ... 3.5 В. Литиевая батарея с ёмкостью 48 мА/ч или более при отсутствии питания будет поддерживать DS1307 в
течение более 10 лет при температуре 25°C.

• GND – общий минус

• Vcc – Это вход +5 В. Когда питающее напряжение выше 1.25 * VBAT, устройство полностью,доступно, и можно выполнять чтение и запись данных. Когда к устройству подключена батарея на 3 В, и Vcc ниже, чем 1.25 * VBAT, чтение и запись запрещены, однако функция отсчёта времени продолжает работать. Как только Vcc падает ниже VBAT, ОЗУ и RTC переключаются на батарейное питание VBAT.

• SQW/OUT – Выходной сигнал с прямоугольными импульсами.

• SCL – (Serial Clock Input - вход последовательных синхроимпульсов) – используется для синхронизации данных по последовательному интерфейсу.

• SDA – (Serial Data Input/Output - вход/выход последовательных данных) – вывод входа/выхода для двухпроводного последовательного интерфейса. 

Работа с выводом SQW/OUT.

Для начала рассмотрим структуру регистров DS1307.

Структура регистров микросхемы DS1307

RTC модуль DS1307

Нас интересует "Управляющий регистр" находящийся по адресу 0x7, т.к. он определяет работу вывода SQW/OUT.

Если бит SQWE = 1. то начинается формирование прямоугольных импульсов, если SQWE = 0, то на выходе вывода будет значение бита OUT.

За частоту импульсов отвечают биты RS0 и RS1, а именно:

     RS0           RS1           Частота     
     0      0      1 Гц
     0      1      4.096 кГц
     1      0      8.192 кГц
     1      1      32.768 кГц

 

 

 

 

Приведем пример:

Если нам нужно начать формирование прямоугольных импульсов с частотой 1  Гц, то необходимо в 0x7 регистр микросхемы, которая имеет адрес 0x68 отправить байт 00010000 или 0x10 в шестнадцатиричной системе счисления.

При помощи библиотеки Wire.h, это можно сделать следующим образом:

Wire.beginTransmission(0x68);
Wire.write(0x7);
Wire.write(0x10);
Wire.endTransmission();

Подключение к Arduino:

 

Выводы отвечающие за интерфейс I2C на платах Arduino на базе различных контроллеров разнятся.

 RTC модуль  На базе ATmega 328  Leonardo  MEGA, ADK, DUE
 SCL  A5  D3  D21
 SDA  A4  D2  D20
 VCC  +5V  +5V  +5V
 GND  GND  GND  GND
 

 

RTC модуль DS1307 подключение к Arduino

Необходимые библиотеки:

для работы с DS1307: http://www.pjrc.com/teensy/td_libs_DS1307RTC.html
для работы со временем: http://www.pjrc.com/teensy/td_libs_Time.html

Установка времении

• Вручную в коде 

Время задается вручную в программном коде и заливается в плату Arduino. Данный способ не самый точный т.к. время на компиляцию и загрузку может занимать различный временной промежуток.

#include <Time.h>
#include <DS1307RTC.h>

void setup()  {
  Serial.begin(9600);
  while (!Serial) ; // Только для платы Leonardo
  setSyncProvider(RTC.get);   // получаем время с RTC
  if (timeStatus() != timeSet)
    Serial.println("Unable to sync with the RTC"); //синхронизация не удаласть
  else
    Serial.println("RTC has set the system time");
  //установим вручную 16.02.2016 12:53
  TimeElements te;
  te.Second = 0; //секунды
  te.Minute = 53; //минуты
  te.Hour = 12; //часы
  te.Day = 16; //день
  te.Month = 2; // месяц
  te.Year = 2016 - 1970; //год в библиотеке отсчитывается с 1970
  time_t timeVal = makeTime(te);
  RTC.set(timeVal);
  setTime(timeVal);
}

void loop()
{
  digitalClockDisplay(); //вывод времени
  delay(1000);
}

void digitalClockDisplay() {
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.print(" ");
  Serial.print(day());
  Serial.print(" ");
  Serial.print(month());
  Serial.print(" ");
  Serial.print(year());
  Serial.println();
}

void printDigits(int digits) {
  //выводим время через ":"
  Serial.print(":");
  if (digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

RTC модуль DS1307

• Установкой из  "Монитора порта"

Более точный вариант установки времени. Время задается через "монитор порта" по ходу работы контроллера.

Открываем монитор, вводим данные в нужном формате, смотрим на эталонные часы, подлавливаем момент и шелкаем "отправить".

//формат указания текущего времени "ДД.ММ.ГГ чч:мм:сс"
//где ДД - день, ММ - месяц, ГГ - год, чч - часы, мм - минуты, сс - секунлы
//ГГ - от 00 до 99 для 2000-2099 годов

#include <Time.h>
#include <DS1307RTC.h>

bool isTimeSet = false; //флаг, указывающий на то, была ли уже задана дата

void setup()  {
  Serial.begin(9600);
  while (!Serial) ; // Только для платы Leonardo
  setSyncProvider(RTC.get);   // получаем время с RTC
  if (timeStatus() != timeSet)
    Serial.println("Unable to sync with the RTC"); //синхронизация не удаласть
  else
    Serial.println("RTC has set the system time");
}

void loop()
{
  if (Serial.available()) { //поступила команда с временем
      setTimeFromFormatString(Serial.readStringUntil('\n'));
      isTimeSet = true; //дата была задана
  }
  if (isTimeSet)  //если была задана дата
  {
    digitalClockDisplay(); //вывод времени
  }
  delay(1000);
}

void digitalClockDisplay() {
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.print(" ");
  Serial.print(day());
  Serial.print(" ");
  Serial.print(month());
  Serial.print(" ");
  Serial.print(year());
  Serial.println();
}

void printDigits(int digits) {
  //выводим время через ":"
  Serial.print(":");
  if (digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

void setTimeFromFormatString(String time)
{
  //ДД.ММ.ГГ чч:мм:сс
  int day = time.substring(0, 2).toInt();
  int month = time.substring(3, 5).toInt();
  int year = time.substring(6, 8).toInt();
  int hours = time.substring(9, 11).toInt();
  int minutes = time.substring(12, 14).toInt();
  int seconds = time.substring(15, 17).toInt();
  TimeElements te;
  te.Second = seconds;
  te.Minute = minutes;
  te.Hour = hours;
  te.Day = day;
  te.Month = month;
  te.Year = year + 30; //год в библиотеке отсчитывается с 1970. Мы хотим с 2000
  time_t timeVal = makeTime(te);
  RTC.set(timeVal);
  setTime(timeVal);
}

RTC модуль DS1307

7,00 бел.руб
RTC I2C (DS1307, 24C32)
RTC I2C (DS1307, 24C32)
RTC I2C (DS1307, 24C32)
RTC I2C (DS1307, 24C32)