Одновременно с выходом в недалёком 2014 году чипа беспроводной связи ESP8266EX по стандарту WiFi, набравшего по-настоящему оглушительную популярность в кругу любителей собирать самодельные устройства, компания WEMOS Electronics представила общественности большую линейку собственных модульных электронных плат под торговой маркой WeMos, задав новый вектор развития ардуино-совместимых платформ. Взяв за основу микроконтроллер от компании Espressif Systems, разработчики значительно потрудились не только над уменьшением размеров базовых модулей, сделав их максимально компактными, но и над выпуском целого спектра расширений, предложив пользователям богатый функционал, способный помочь в реализации задач различного уровня сложности при проектировании и конструировании разнообразных полезных изобретений.
Современные электронные продукты WeMos входят в категорию эффективных низкоценовых решений и позиционируются производителем как открытая платформа для самостоятельной разработки многоцелевых устройств на основе беспроводной связи по технологии WiFi. При этом главный упор сделан на создание и развитие изделий с поддержкой сетей нового поколения "Интернет вещей" (англ. - Internet of Things, IoT), чему активно способствуют существующие возможности облачных вычислений и межмашинных взаимодействий.
Чтобы потребитель не смог запутаться в физической совместимости плат, каждая серия обладает своими отличительными особенностями. Например, серия WeMos D1 Mini, к которому принадлежит Драйвер моторов WeMos, имеет синий цвет поверхности текстолита и небольшой скруглённый угловой вырез рядом с маркировкой 3V3. Вырез служит ориентиром, гарантирующим правильное совмещение нескольких плат между собой.
Технические характеристики
- Питание: 3.3 В / 5 В, смешанное
- Потребляемый ток: менее 500 нА
- Совместимость: WeMos D1 mini / WeMos D1 mini PRO
- Активные контакты: D1 (SCL), D2 (SDA), 3V3, 5V, GND
- Контроллер: DS1307
- Встроенный календарь до 2165 года
- Интерфейс: I2C
- Батарея: CR1220 3V, литиевая
- Размер: 23.3 x 25.6 x 5.5 мм
Общеизвестная микросхема часов реального времени DS1307, пользующаяся популярностью у любителей ардуино-подобных микроконтроллеров, добралась и до платформы WeMos в виде простенького модуля. Плата часов DS1307 WeMos RTC разработана и представлена совершенно сторонней компанией, никак напрямую не связанной с производителем WeMos, лишний раз доказывая необходимость её существовании для этой платформы. Совершенно невероято, что разработчики оригинальной WeMos упустили сей досадный недостаток и не позаботились выпуском аналогичного продукта для своей коллекции полезных дополнений и расширений.
На просторах всемирной паутины расположено большое количество статей с примерами использования модуля и подробными пошаговыми инструкциями по сборке проектов на базе микросхемы DS1307, среди которых можно без особого труда обнаружить ряд схем как для простых часов с будильником или сигнализаций, так и сложных устройств, где элемент учёта текущего времени и даты выступает в роли по-настоящему незаменимого инструмента, и всецело помогает пользовательским приложениям обрабатывать различные события на основе получаемых хронометрических данных. Такие схемы смогут по строго заданному расписанию выполнять определённые наборы действий. А если к ним добавить ещё и мощный потенциал самого WeMos D1 Mini (Pro), выраженный в интегрированной технологии беспроводной связи стандарта WiFi, то полезность модуля DS1307 несомненно возрастёт. Появится возможность удалённо управлять настройками часов и таймеров в разрабатываемом приложении со смартфона/планшета или через Интернет-соединение. Достаточно представить организованный на ESP8266 веб-сервер, ведущий запись баз данных о подключениях пользователей на карту памяти с штампом реального времени (логирование данных), рассчитывающий продолжительность сеансов посещения без принудительного использования свободных вычислительных ресурсов микроконтроллера при отсчёте промежуточных интервалов (ардуино функции delay или millis), или выполняющий обновление публикуемой на страницах сервера информации, содержание которой может зависеть от времени суток.
В структуре кристала DS1307, часы объединены с календарём, летоисчисление которого достигает 2165 года, поэтому модуль справляется с задачами по отсчёту секунд, часов, дней, календарных дат, месяцев и лет. Внутренний алгоритм самостоятельно корректирует последние числа месяцев, продолжительность которых менее 31 дня, включая поправку на високосный год. При необходимости, запрашиваемые показатели могут формироваться в 24-часовом формате или в 12-часовом с индикатором AM/PM, указывающим на дополуденную/послеполуденную половину суток.
WeMos DS1307 наделён механизмом самостоятельного обнаружения перебоев с напряжением. Эксплуатация устройств с часами реального времени не исключает ситуации, когда рабочее напряжение по разным причинам может опуститься до критического минимума или вообще пропасть (непредвиденное отключение от сети, поломка источника питания, истощение запаса энергии аккумулятора, процесс программирования микроконтроллера и другие варианты). В подобных случаях, с целью сохранения актуальных данных о текущем времени, она сумеет в автоматическом режиме переключиться на резервное питание, которым её обеспечит небольшая круглая 3-вольтовая литиевая батарейка типоразмера CR1220 в форме "таблетки", представленная на плате модуля. Величина потребляемой энергии DS1307 столь невелика (не более 500 нА), что микросхема продержится на единственном низковольтном элементе питания довольно продолжительное время. Эквивалент часам реального времени DS1307 WeMos RTC повсеместно встречается в бытовой цифровой технике, служат неотъемлемой частью в переносных или стационарных персональных компьютерах.
В модуле часов реального времени предусмотрены некоторые особенности. В схеме присутствует защита от несоблюдения правильной полярности при установки батареи в отсек держателя, если требовалась её замена или изъятие было обусловлено иной причиной. Модуль WeMos Real Time Clock DS1307 требует двухуровнего питания от источников с 3.3-вольтовым и 5-вольтовым напряжением. Такая действующая схема вызвана наличием в конструкции модуля двух преобразователей напряжения, связывающих между собой контроллер D1 Mini (Pro) и чип DS1307 двухпроводной двунаправленной интерфейсной шиной обмена данными по протоколу I2C.
WeMos DS1307 программирование
Учитывая, что модуль с двоично-десятичными часами-календарём является неофициальным дополнением к платформе WeMos, специальных совместимых библиотек с описанием API и методов программирования для него попросту не найти. В качестве примера, использована универсальная библиотека RTClib версии 1.3.1 от компании Adafruit, поддерживающая несколько микросхем часов реального времени (PCF8523, DS3231, DS1307), также доступная для загрузки из раздела "Полезные ссылки". При этом написание скетчей в среде разработки Arduino IDE приводит к обязательной небольшой адаптации под платформу WeMos, так как во включенных примерах изначально не предопределён способ связи между D1 Mini (Pro) и модулем DS1307.
// Функции даты и времение с использованием DS1307 RTC WeMos, подключенным с помощью I2C и библиотеки Wire
#include "Wire.h"
#include "RTClib.h"
// Инициализируем класс DS1307
RTC_DS1307 rtc;
// Определяем массив, состоящего из названий дней недели
char daysOfTheWeek[7][23] = {"Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"};
void setup () {
// Адаптируем связь по протоколу I2C
// Запускаем библиотеку Wire. Наша плата подключена к D2=SDA, D1=SCL
Wire.begin(D2, D1);
// Открываем последовательный порт
Serial.begin(57600);
if (! rtc.begin()) {
Serial.println("RTC не обнаружены");
}
if (! rtc.isrunning()) {
Serial.println("RTC не запустились!");
// Команда для корректировки предустановленных значений часов реального времени
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// Эта строка устанавливает RTC с явными датой и временем. Например, чтобы установить
// новую текущую дату Октябрь 03, 2019 и время 15 часов 25 минут, необходимо вызвать:
// rtc.adjust(DateTime(2019, 10, 03, 15, 25, 0));
// Незакомментированая строка будет сбрасывать текущее значение часов реального времени
// на указанные в процедуре при каждом последующем перезапуске
}
}
void loop () {
// Считываем значения даты и времени
DateTime now = rtc.now();
// Выводим информацию в последовательный порт
Serial.print(now.year(), DEC);
Serial.print("/");
Serial.print(now.month(), DEC);
Serial.print("/");
Serial.print(now.day(), DEC);
Serial.print(" (");
// Выбираем день недели
Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
Serial.print(") ");
Serial.print(now.hour(), DEC);
Serial.print(":");
Serial.print(now.minute(), DEC);
Serial.print(":");
Serial.print(now.second(), DEC);
Serial.println();
Serial.print(" с полуночи 1/1/1970 прошло: ");
Serial.print(now.unixtime());
Serial.print(" секунд или ");
Serial.print(now.unixtime() / 86400L);
Serial.println(" дней");
// рассчитываем дату и время, которые будут на 7 дней, 12 часов, 30 минут и 6 секунд в будущем
DateTime future (now + TimeSpan(7,12,30,6));
Serial.print(" текущая дата + 7д + 12ч + 30м + 6с: ");
Serial.print(future.year(), DEC);
Serial.print("/");
Serial.print(future.month(), DEC);
Serial.print("/");
Serial.print(future.day(), DEC);
Serial.print(" ");
Serial.print(future.hour(), DEC);
Serial.print(":");
Serial.print(future.minute(), DEC);
Serial.print(":");
Serial.print(future.second(), DEC);
Serial.println();
Serial.println();
delay(3000);
}