Часы реального времени, RTC (Trema-модуль)

Trema-модуль RTC (Real Time Clock - часы реального времени) - является высокоточным энергонезависимым модулем, который можно использовать в таких проектах как часы, будильник, секундомер и т.д., а также, с его помощью, можно запускать Ваши процессы по расписанию.

Видео

Общие сведения:

Trema-модуль RTC построен на базе чипа DS1307Z, который снабжен: интерфейсом I2C (частота 100 кГц, адрес 0x68), 64 однобайтными регистрами (56 из которых доступны для хранения данных пользователя), компаратором (для переключения между основным и резервным питанием), блоком подзарядки аккумуляторной батареи. Модуль позволяет считывать: секунды, минуты, часы, дни, дни недели, месяц и год. Модуль исполнен в линейке Trema-модулей, а значит, Вам не придется ничего паять и собирать на макетной плате.

Спецификация:

  • Чип DS1307Z
  • Питание модуля: 5 В.
  • Напряжение питания батареи: 2,0 .. 3,5 В (номинально 3 В).
  • Потребляемый ток (в режиме ожидания): до 200 мкА.
  • Потребляемый ток (во время передачи данных): до 1,5 мА.
  • Потребляемый ток (во время резервного питания): 300 ... 800 нА.
  • Тактовая частота шины I2C: до 100 кГц.
  • Уровень «0» на шине I2C: -0,5 ... 0,8 В.
  • Уровень «1» на шине I2C: 2,2 ... VСС 0,3 В.
  • Рабочая температура: 0 ... 70 °C.
  • Габариты 31x31 мм.

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

Модуль подключается к аппаратной или программной шине I2C Arduino и имеет адрес 0x68.
Для удобства подключения, предлагаем воспользоваться TremaShield.

Схема подключения часов реального времени

Схема установки модуля при его подключении через Trema Set Shield.

При подключении RTC модулей на базе чипов DS1302, DS1307, DS3231 к другим платам, например, WEMOS D1 mini или WEMOS D1 mini Pro на базе микроконтроллера ESP8266, и т.д. То перед подключением библиотеки iarduino_RTC, нужно подключить библиотеку Wire, как это описано в разделе Wiki - расширенные возможности библиотек iarduino для шины I2C.

Питание:

  • При наличии основного (Vcc = 5 В) и резервного (Vbat = 3 В) источника питания, модуль работает от основного источника питания.
  • При отсутствии резервного питания, модуль работает от основного источника питания.
  • При отсутствии основного питания, модуль работает от резервного (продолжает отсчитывать время, но не отвечает на запросы по шине I2C).
  • При отсутствии основного и резервного питания, модуль отключается и все его регистры сбрасываются.

Работа с модулем:

Для работы с RTC модулями на базе чипов DS1302, DS1307, DS3231, ... , предлагаем воспользоваться библиотекой iarduino_RTC,

Преимуществом данной библиотеки является удобная реализация получения времени.

Вы можете получать время не только через переменные (для сек., мин., часов., ...), но и одной строкой, указав, что именно в ней должно быть.

Примеры:

//   ВЫВОД ВРЕМЕНИ В МОНИТОР:
#include <iarduino_RTC.h>                                // Подключаем библиотеку
iarduino_RTC time(RTC_DS1307);                           // Объявляем объект time для модуля на базе чипа DS1307
void setup() {
    Serial.begin(9600);                                  // Инициируем передачу данных в монитор последовательного порта
    time.begin();                                        // Инициируем RTC модуль
}
void loop(){
    if(millis()%1000==0){                                // если прошла 1 секунда
        Serial.println(time.gettime("d-m-Y, H:i:s, D")); // выводим время в монитор, одной строкой
        delay(2);                                        // приостанавливаем скетч на 2 мс.
    }
}
//  УСТАНОВКА ВРЕМЕНИ МОДУЛЯ:
#include <iarduino_RTC.h>                                // Подключаем библиотеку
iarduino_RTC time(RTC_DS1307);                           // Объявляем объект time для модуля на базе чипа DS1307
void setup() {
    Serial.begin(9600);                                  // Инициируем передачу данных в монитор последовательного порта
    time.begin();                                        // Инициируем RTC модуль
    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(2);                                        // приостанавливаем скетч на 2 мс.
    }
}
//  БУДИЛЬНИК:
#include <iarduino_RTC.h>                                // Подключаем библиотеку
iarduino_RTC time(RTC_DS1307);                           // Объявляем объект time для модуля на базе чипа DS1307
void setup() {
    Serial.begin(9600);                                  // Инициируем передачу данных в монитор последовательного порта
    time.begin();                                        // Инициируем RTC модуль
}
void loop(){
    if(millis()%1000==0){                                // если прошла 1 секунда
        Serial.println(time.gettime("d-m-Y, H:i:s, D")); // выводим время в монитор, одной строкой
        if(time.Hours==7 && time.minutes==0 && time.seconds==0 && time.weekday!=0 && time.weekday!=6){
//          Действия внутри оператора if, будут выполняться только по будням в 07:00
            Serial.println("07:00 nopa na pa6oty");      // выводим сообщение
        }
        delay(2);                                        // приостанавливаем скетч на 2 мс.
    }
}

В библиотеке реализовано 5 функций: 3 основных (begin, settime, gettime) и 2 дополнительных (blinktime, period).

Описание функций библиотеки:

Данная библиотека может использовать как аппаратную, так и программную реализацию шины I2C.
О том как выбрать тип шины I2C рассказано в статье Wiki - расширенные возможности библиотек iarduino для шины I2C.

Подключение библиотеки:

#include <iarduino_RTC.h>                     // Подключаем библиотеку 
iarduino_RTC time(RTC_DS3231);                // Создаём объект time, если модуль создан на базе чипа DS3231 
iarduino_RTC time(RTC_DS1307);                // Создаём объект time, если модуль создан на базе чипа DS1307
iarduino_RTC time(RTC_DS1302, RST, CLK, DAT); // Создаём объект time, если модуль создан на базе чипа DS1302

Функция begin();

  • Назначение: инициализация RTC модуля
  • Синтаксис: begin();
  • Параметры: Нет.
  • Возвращаемые значения: Нет.
  • Примечание:
    • Функция вызывается 1 раз в коде setup.
    • Проверяет регистры модуля, запускает генератор модуля и т.д.
  • Пример:
time.begin(); // Инициируем работу с модулем реального времени

Функция settime();

  • Назначение: Установка времени.
  • Синтаксис: settime( СЕКУНДЫ [, МИНУТЫ [, ЧАСЫ [, ДЕНЬ [, МЕСЯЦ [, ГОД [, ДЕНЬ_НЕДЕЛИ ]]]]]] );
  • Параметры:
    • СЕКУНДЫ - число от 0 до 59, или -1.
    • МИНУТЫ - число от 0 до 59, или -1.
    • ЧАСЫ - число от 0 до 23, или -1.
    • ДЕНЬ - число от 1 до 31, или -1.
    • МЕСЯЦ - число от 1 до 12, или -1.
    • ГОД - число от 0 до 99 (без учёта века), или -1.
    • ДЕНЬ_НЕДЕЛИ - число от 0 (воскресение) до 6 (суббота), или -1.
  • Возвращаемые значения: Нет.
  • Примечание:
    • Значение параметров -1 означает, что данный параметр устанавливать ненужно.
    • Все параметры, кроме секунд, являются необязательными.
  • Пример:
time.settime(-1, -1, 10);   // установит 10 часов, а секунды, минуты и дату, оставит без изменений.
time.settime(30, -1, -1, 2) // установит 30 секунд и 2 день месяца, остальные данные оставит без изменений

Функция gettime();

  • Назначение: Чтение времени.
  • Синтаксис: gettime( [ "СТРОКА_ШАБЛОН" ] );
  • Параметры:
    • СТРОКА_ШАБЛОН - задаёт шаблон для вывода строки времени, как у функции date() в PHP:
      s - секунды от 00 до 59 (два знака)
      i - минуты от 00 до 59 (два знака)
      h - часы в 12-часовом формате от 01 до 12 (два знака)
      H - часы в 24-часовом формате от 00 до 23 (два знака)
      d - день месяца от 01 до 31 (два знака)
      w - день недели от 0 до 6 (один знак: 0-воскресенье, 6-суббота)
      D - день недели наименование от Mon до Sun (три знака: Mon Tue Wed Thu Fri Sat Sun)
      m - месяц от 01 до 12 (два знака)
      M - месяц наименование от Jan до Dec (три знака: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)
      Y - год от 2000 до 2099 (четыре знака)
      y - год от 00 до 99 (два знака)
      a - полдень am или pm (два знака, в нижнем регистре)
      A - полдень AM или PM (два знака, в верхнем регистре)
  • Возвращаемые значения: Строка шаблона, указанные символы которой заменены на время.
  • Примечание:
    • Строка не должна превышать 50 символов.
    • Функцию можно вызывать без параметра, это приведёт к выводу пустой строки и обновлению переменных (см. ниже).
  • Пример:
Serial.println( time.gettime("d-m-Y, H:i:s, D") ); // выведет строку "01-10-2015, 14:00:05, Thu" и обновит значение переменных.
Serial.println( time.gettime("s")               ); // выведет строку "05" и обновит значение переменных.
Переменная seconds
  • Значение: Возвращает количество секунд, от 0 до 59;
  • Тип данных: uint8_t.
Переменная minutes
  • Значение: Возвращает количество минут, от 0 до 59;
  • Тип данных: uint8_t.
Переменная hours
  • Значение: Возвращает количество часов, от 1 до 12;
  • Тип данных: uint8_t.
Переменная Hours
  • Значение: Возвращает количество часов, от 0 до 23;
  • Тип данных: uint8_t.
Переменная midday
  • Значение: Возвращает значение 0 или 1 (0-am, 1-pm);
  • Тип данных: uint8_t.
Переменная day
  • Значение: Возвращает день месяца, от 1 до 31;
  • Тип данных: uint8_t.
Переменная weekday
  • Значение: Возвращает день недели, от 0 до 6 (0-воскресенье, 6-суббота);
  • Тип данных: uint8_t.
Переменная month
  • Значение: Возвращает текущий месяц, от 1 до 12;
  • Тип данных: uint8_t.
Переменная year
  • Значение: Возвращает текущий год, от 0 до 99;
  • Тип данных: uint8_t.
time.gettime();                 // читаем время, обновляя значения всех переменных.
Serial.println( time.seconds ); // выведет число - количество секунд
Serial.println( time.minutes ); // выведет число - количество минут
Serial.println( time.hours   ); // выведет число - количество часов в 12 часовом формате
Serial.println( time.Hours   ); // выведет число - количество часов в 24 часовом формате
Serial.println( time.midday  ); // выведет число - 0 (до полудня), или 1 (после полудня)
Serial.println( time.day     ); // выведет число - текущий день месяца
Serial.println( time.weekday ); // выведет число - текущий день недели: 0 (воскресение), 1 (понедельник), ... , 5 (пятница), 6 (суббота)
Serial.println( time.month   ); // выведет число - текущий месяц
Serial.println( time.year    ); // выведет число - текущий год

Дополнительные функции:

Функция blinktime();

  • Назначение: мигание одним из параметров времени.
    Указывает функции gettime(), каждую чётную секунду, заменять указанный параметр времени на пробел(ы).
    Может быть полезна, для отображения устанавливаемого параметра времени на дисплее.
  • Синтаксис: blinktime( ПАРАМЕТР_ВРЕМЕНИ [, ЧАСТОТА_МИГАНИЯ ] );
  • Параметры:
    • ПАРАМЕТР_ВРЕМЕНИ - число от 0 до 8:
      0 не мигать
      1 мигают секунды
      2 мигают минуты
      3 мигают часы
      4 мигает день
      5 мигает месяц
      6 мигает год
      7 мигает день недели
      8 мигает полдень (AM/PM)
    • ЧАСТОТА_МИГАНИЯ - число типа float определяющее частоту мигания в Гц (по умолчанию 1 Гц).
  • Возвращаемые значения: Нет.
  • Примечание: Значение по умолчанию 0.
  • Пример:
void setup(){
  Serial.begin( 9600 );    // Инициируем передачу данных в монитор последовательного порта
  time.begin();            // Инициируем работу с модулем RTC
  time.blinktime( 2 );     // Заставляем функцию gettime мигать минутами с частотой по умолчанию
//time.blinktime( 2 , 5 ); // Заставляем функцию gettime мигать минутами с частотой 5 Гц (5 раз в секунду)
}
void loop(){
  Serial.println( time.gettime("H:i:s") ); // будет выводить время, но минуты будут мигать
}

Функция period();

  • Назначение: установка минимального периода обращения к модулю в минутах.
    Означает что в указанный период времени, к модулю может быть отправлен только 1 запрос на получение времени.
    Ответом на все остальные запросы будет результат последнего полученного времени + время прошедшее с этого запроса.
    Функция может быть полезна, если шина передачи данных сильно нагружена другими устройствами.
  • Синтаксис: period( ПЕРИОД );
  • Параметры:
    • ПЕРИОД - количество минут от 0 до 255, в течении которого к модулю может быть отправлен только 1 запрос. Если указан 0, значит каждый вызов функции gettime() генерирует запрос к модулю.
  • Возвращаемые значения: Нет.
  • Примечание: Значение по умолчанию 0.
  • Пример:
void setup(){
  Serial.begin( 9600 );  // Инициируем передачу данных в монитор последовательного порта
  time.begin();          // Инициируем работу с модулем RTC
  time.period( 1 );      // Указываем обращаться к модулю RTC не чаще чем один раз в минуту
}
void loop(){
  Serial.println( time.gettime("H:i:s") ); // будет выводить время как обычно, но на самом деле, обращение к модулю и сверка времени происходит 1 раз в минуту
}

Применение:

  • Часы, будильник, секундомер и т.д.
  • Запуск процессов по расписанию.

Ссылки:

Обсуждение