Модуль реального времени DS1307

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


Мы расмотрим работу только модуля реального времени DS1307.

Как подключить DS1307 к Arduino

На модуле часов реального премени 5 пинов: 5V, GND, SCL, SDA и SQW.

  • 5V используется для питания чипа модуля. Если 5 В не поступают, чип находится в "спящем" режиме.
  • GND - общая земля. Нужно обьязательно подключать в схему.
  • SCL - контакт i2c часов - необходим для обмена данными с часами реального времени.
  • SDA - контакт, по которому через i2c передаются данные с часов реального времени.
  • SQW дает возможность настроить вывод данных в виде square-wave. В большинстве случаев этот контакт не используется.

Пример установки текущего времени в RTC модуль (DS1307):

#include <iarduino_RTC.h>
iarduino_RTC time(RTC_DS1307);
void setup() {
    delay(300);
    Serial.begin(9600);
    time.begin();
    time.settime(0,51,21,27,10,15,2);  // 0  сек, 51 мин, 21 час, 27, октября, 2015 года, вторник
}
void loop(){
    if(millis()%1000==0){ // если прошла 1 секунда
      Serial.println(time.gettime("d-m-Y, H:i:s, D")); // выводим время
      delay(1); // приостанавливаем на 1 мс, чтоб не выводить время несколько раз за 1мс
    }
}

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

Есть намного точнее вариант установки времени. Оно задается через "монитор порта" по ходу работы контроллера.

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

  Пример программного кода
//формат указания текущего времени "ДД.ММ.ГГ чч:мм:сс"
//где ДД - день, ММ - месяц, ГГ - год, чч - часы, мм - минуты, сс - секунлы
//ГГ - от 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);
}
Получим:

Библиотека DS1307 предназначена для работы с модулем часов реального времени на чипе DS1307 Скачать файл: ds1307.rar [66,39 Kb] (cкачиваний: 173)  
Универсальная библиотека для RTC DS1302, DS1307, DS3231 к Arduino Скачать файл: 1469458372-5701-1.zip [16,37 Kb] (cкачиваний: 123)  



Код программы и результаты взяты с сайта

{poster_avatar}  admin
4 571