Часы реального времени, 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 и имеет адрес 0x68.
Для удобства подключения, предлагаем воспользоваться TremaShield.

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

Питание:

  • При наличии основного (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).

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

Подключение библиотеки:
#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)
  • Возвращаемые значения: Нет.
  • Примечание: Значение по умолчанию 0.
  • Пример:
void setup(){
  Serial.begin( 9600 );  // Инициируем передачу данных в монитор последовательного порта
  time.begin();          // Инициируем работу с модулем RTC
  time.blinktime( 2 );   // Заставляем функцию gettime мигать секундами
}
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 раз в минуту
}

Применение:

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

Ссылки:

Обсуждение

Присоединяйся

На главную