КОРЗИНА
магазина
8 (499) 500-14-56 | ПН. - ПТ. 12:00-18:00
ЛЕСНОРЯДСКИЙ ПЕРЕУЛОК, 18С2, БЦ "ДМ-ПРЕСС"

Тест

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

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

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

Trema-модуль RTC (DS3231) - построен на базе чипа DS3231, который снабжен: интерфейсом I2C, кварцевым резонатором на 32,768 кГц, датчиком температуры (для температурной компенсации кварцевого резонатора), регистрами данных, двумя будильниками, компаратором (контролирующим уровень заряда батареи), блоком подзарядки аккумуляторной батареи и выходами меандра (с фиксированной 32,768 кГц, и программируемой частотой 1,0 Гц - 8,192 кГц). Модуль позволяет устанавливать и считывать: секунды, минуты, часы, дни, дни недели, месяц, год и состояние. Считывать температуру и устанавливать: секунды, минуты, часы, и дни будильников

Видео

Спецификация для чипа 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.
  • Габариты 30x30 мм.

Спецификация для чипа DS3231:

  • Питание модуля: 3,3 В или 5 В (оба напряжения входят в диапазон допустимых значений).
  • Потребляемый ток (в режиме ожидания): до 170 мкА.
  • Потребляемый ток (во время передачи данных): до 300 мкА.
  • Потребляемый ток (во время резервного питания, без передачи данных): до 3,5 мкА.
  • Тактовая частота шины I2C: до 400 кГц.
  • Уровень «0» на шине I2C: -0,3 ... 0,3 * Vcc В.
  • Уровень «1» на шине I2C: 0,7 * Vcc ... Vcc + 0,3 В.
  • Напряжение питания батареи: 2,3 .. 5,5 В (номинально 3,0 В).
  • Рабочая температура: 0 ... 70 °C.
  • Точность хода: ±2 ppm (примерно ± 1 минута в год)
  • Габариты 30x30 мм.

Все модули линейки "Trema" выполнены в одном формате

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

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

Модуль удобно подключать 3 способами, в зависимости от ситуации:

Способ - 1 :  Используя проводной шлейф и Piranha UNO

Используя провода «Папа — Мама», подключаем  напрямую к контроллеру Piranha UNO.

Способ - 2 :  Используя Trema Set Shield

Модуль можно подключить к любому из I2C входов Trema Set Shield.

Способ - 3 :  Используя проводной шлейф и Shield

Используя 4-х проводной шлейф, к  Trema Shield, Trema-Power Shield, Motor Shield, Trema Shield NANO и тд.

При подключении 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 watch(RTC_DS1307);                           // Объявляем объект watch для модуля на базе чипа DS1307
void setup() {
    Serial.begin(9600);                                   // Инициируем передачу данных в монитор последовательного порта
    watch.begin();                                        // Инициируем RTC модуль
}
void loop(){
    if(millis()%1000==0){                                 // если прошла 1 секунда
        Serial.println(watch.gettime("d-m-Y, H:i:s, D")); // выводим время в монитор, одной строкой
        delay(2);                                         // приостанавливаем скетч на 2 мс.
    }
}

Установка времени модуля:

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

Получение времени в переменные и вывод их в монитор:

#include <iarduino_RTC.h>                                 // Подключаем библиотеку.
iarduino_RTC watch(RTC_DS1307);                           // Объявляем объект watch для модуля на базе чипа DS1307.
uint8_t D, M, Y, h, m, s, W;                              // Объявляем переменные для получения даты и времени: D-день, M-месяц, Y-год, h-часы, m-минуты, s-секунды, W-день недели.
void setup() {
    Serial.begin(9600);                                   // Инициируем передачу данных в монитор последовательного порта.
    watch.begin();                                        // Инициируем RTC модуль.
}
void loop(){
    if(millis()%1000==0){                                 // если прошла 1 секунда
        watch.gettime();                                  // Считываем текущее время из модуля.
        D = watch.day;                                    // Получаем текущий день месяца 1-31.
        M = watch.month;                                  // Получаем текущий месяц       1-12.
        Y = watch.year;                                   // Получаем текущий год         0-99.
        h = watch.Hours;                                  // Получаем текущие часы        0-23.
        m = watch.minutes;                                // Получаем текущие минуты      0-59.
        s = watch.seconds;                                // Получаем текущие секунды     0-59.
        W = watch.weekday;                                // Получаем текущий день недели 0-6.
        Serial.println((String) D+"-"+M+"-"+Y+", "+h+":"+m+":"+s+", "+W); // Выводим время в монитор, одной строкой.
        delay(2);                                         // приостанавливаем скетч на 2 мс.
    }
}

Установка системного времени в модуль (времени компьютера):

#include <iarduino_RTC.h>                                 // Подключаем библиотеку
iarduino_RTC watch(RTC_DS1307);                           // Объявляем объект watch для модуля на базе чипа DS1307
                                                          //
//  Определяем системное время:                           // Время загрузки скетча.
const char* strM="JanFebMarAprMayJunJulAugSepOctNovDec";  // Определяем массив всех вариантов текстового представления текущего месяца.
const char* sysT=__TIME__;                                // Получаем время компиляции скетча в формате "SS:MM:HH".
const char* sysD=__DATE__;                                // Получаем дату  компиляции скетча в формате "MMM:DD:YYYY", где МММ - текстовое представление текущего месяца, например: Jul.
//  Парсим полученные значения sysT и sysD в массив i:    // Определяем массив «i» из 6 элементов типа int, содержащий следующие значения: секунды, минуты, часы, день, месяц и год компиляции скетча.
const int i[6] {(sysT[6]-48)*10+(sysT[7]-48), (sysT[3]-48)*10+(sysT[4]-48), (sysT[0]-48)*10+(sysT[1]-48), (sysD[4]-48)*10+(sysD[5]-48), ((int)memmem(strM,36,sysD,3)+3-(int)&strM[0])/3, (sysD[9]-48)*10+(sysD[10]-48)};
                                                          //
void setup() {
    Serial.begin(9600);                                   // Инициируем передачу данных в монитор последовательного порта
    watch.begin();                                        // Инициируем RTC модуль
    watch.settime(i[0],i[1],i[2],i[3],i[4],i[5]);         // Устанавливаем время в модуль: i[0] сек, i[1] мин, i[2] час, i[3] день, i[4] месяц, i[5] год, без указания дня недели.
//  watch.settime(i[0],i[1],i[2],i[3],i[4],i[5], 2);      // Можно установить время с указанием дня недели, где последний параметр, это день недели (указывается вручную) в формате: 0-воскресенье, 1-понедельник, ... , 6-суббота.
}
void loop(){
    if(millis()%1000==0){                                 // Если прошла 1 секунда
        Serial.println(watch.gettime("d-m-Y, H:i:s, D")); // Выводим время в монитор, одной строкой
        delay(2);                                         // Приостанавливаем скетч на 2 мс.
    }
}

Будильник:

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

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

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

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

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

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

Функция begin();

  • Назначение: инициализация RTC модуля
  • Синтаксис: begin();
  • Параметры: Нет.
  • Возвращаемые значения: Нет.
  • Примечание:
    • Функция вызывается 1 раз в коде setup.
    • Проверяет регистры модуля, запускает генератор модуля и т.д.
  • Пример:
watch.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 означает, что данный параметр устанавливать не нужно.
    • Все параметры, кроме секунд, являются необязательными.
  • Пример:
watch.settime(-1, -1, 10);   // установить 10 часов, а секунды, минуты и дату, оставит без изменений.
watch.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( watch.gettime("d-m-Y, H:i:s, D") ); // выведет строку "01-10-2015, 14:00:05, Thu" и обновит значение переменных.
Serial.println( watch.gettime("s")               ); // выведет строку "05" и обновит значение переменных.
                                                    // если сейчас 5 секунд третьего, 1 октября 2015 года.
  • Любое обращение к функции gettime(), даже без параметра, приводит к обновлению значений следующих переменных библиотеки:

Переменная 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.

Переменная Unix

  • Значение: Содержит секунды с начала эпохи Unix, от 0 до 4'294'967'295 (06:28:15, 06.02.2106);
  • Тип данных: uint32_t.
watch.gettime();                 // читаем время, обновляя значения всех переменных.
Serial.println( watch.seconds ); // выводим количество секунд
Serial.println( watch.minutes ); // выводим количество минут
Serial.println( watch.hours   ); // выводим количество часов в 12 часовом формате
Serial.println( watch.Hours   ); // выводим количество часов в 24 часовом формате
Serial.println( watch.midday  ); // выводим 0 (до полудня), или 1 (после полудня)
Serial.println( watch.day     ); // выводим текущий день месяца
Serial.println( watch.weekday ); // выводим текущий день недели: 0 (воскресение), 1 (понедельник), ... , 5 (пятница), 6 (суббота)
Serial.println( watch.month   ); // выводим текущий месяц
Serial.println( watch.year    ); // выводим текущий год
Serial.println( watch.Unix    ); // выводим количество секунд прошедших с начала эпохи Unix

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

Функция blinktime();

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

Функция period();

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

Функция settimeUnix();

  • Назначение: Установка времени.
  • Синтаксис: settimeUnix( СЕКУНДЫ );
  • Параметры:
    • СЕКУНДЫ - количество секунд прошедшее с начала эпохи Unix.
  • Возвращаемые значения: Нет.
  • Примечание: Данная функция выполняет действия аналогичные функции settime(), но в качестве параметра получает только секунды прошедшие с даты 01.01.1970 00:00:00.
  • Пример:
watch.settimeUnix(1577836800); // установить время = 01.01.1970 00:00:00 + 1577836800 сек = 01.01.2020 00:00:00.

Функция gettimeUnix();

  • Назначение: Чтение количества секунд прошедших с начала эпохи Unix.
  • Синтаксис: gettimeUnix();
  • Параметры: Нет.
  • Возвращаемые значения: Количество секунд прошедшее с начала эпохи Unix.
  • Примечание: Данная функция выполняет действия аналогичные чтению переменной Unix после обращения к функции gettime() без параметров.
  • Пример:
Serial.println( watch.gettimeUnix() ); // выведет количество секунд прошедших с даты 01.01.1970 00:00:00.

Применение:

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

Ссылки:




Обсуждение

Гарантии и возврат Используя сайт Вы соглашаетесь с условями