По приходу команды «R» (десятичный код 82) контроллер считывает часы и выдает их «наружу», причем день недели выдается английским сокращением, как в примере из библиотеки. Впоследствии мы воспользуемся этим разделением по командам для приема данных через последовательный порт из другого источника.
В качестве составной части скетч Clock_set.ino вошел в полную программу метеостанции, но может использоваться и как отдельная тестовая программа.
Для облегчения задачи установки часов я написал утилиту на Delphi, которая взаимодействует с программой Clock_set.ino с помощью всего двух кнопок (точно так же он работает и с полной программой метеостанции). Эту утилиту под названием MeteoSet можно найти в том же архиве, что и скетч Clock_set.ino. В архиве, кроме собственно программы (файл setmeteo.exe), находится папка с Delphi-проектом, который читатель волен использовать по собственному усмотрению. Проект создан в версии Delphi 7, но после преобразования будет компилироваться и в любой более поздней версии, изменения вносить не потребуется.
Предварительно соедините компьютер со станцией USB-кабелем, загрузите в прибор скетч Clock_set.ino и установите в запущенной на компьютере программе setmeteo.exe соответствующий порт (предусмотрены номера от СОМ1 до СОМ8). После этого можно прочесть показания часов из станции (кнопка Read Time from Station), сравнить их с текущим временем (показывается внизу окна программы) и обновить через нажатие кнопки Set current Time. Перед проведением этой операции целесообразно принудительно обновить время в самом компьютере через пункт Настройка даты и времени контекстного меню области уведомлений (хотя Windows делает это автоматически по расписанию, но не каждый день, и часы могут «уйти»).
Температура, влажность и давление
Выбранные нами Arduino-модули для измерения температуры, влажности и атмосферного давления также применяют связь по двухпроводному интерфейсу I2С. При этом библиотека для Barometer Sensor на основе чипа ВМР085[46] ориентирована на тот же самый аппаратный интерфейс I2С, реализованный через стандартную библиотеку Wire.h, что и часы DS-13G7. Потому на схеме рис. 22.1 Barometer Sensor и подключен к тем же самым выводам А4 и А5. Микросхема ВМР085 производства Bosh устроена так, что перед чтением показаний давления следует обязательно прочесть температуру (см. пример по ссылке в сноске 3). Именно эту температуру мы в дальнейшем будем демонстрировать в качестве «внутренней» на дисплее главного модуля нашей станции — хотя нет никаких проблем в том, чтобы выводить и значение, получаемое из модуля SHT1.
Что же касается атмосферного давления, то модуль ВМР085 выдает его, как водится, в паскалях в виде действительного числа (т. е. типа float). В программе придется ввести коэффициент пересчета для его представления в привычных миллиметрах ртутного столба, притом в виде целого числа (указывать десятичные доли атмосферного давления не имеет смысла). Вот тут и скажутся все преимущества высокоуровневого языка Arduino — этот коэффициент имеет величину 0,0075 (750 мм рт. ст. — это 1000 гПа с высокой точностью). Для умножения на такую величину в ассемблерной программе придется сначала преобразовывать ее в целое число, применять довольно громоздкие процедуры перемножения многобайтовых чисел, потом приводить результат к нужному виду (см. главу 20), а у нас это сведется к одной строке в программе:
mmHg = int(pressure*0.0075)+5;
Здесь мы применяем явное преобразование типов — результат умножения переменной pressure типа float на дробный коэффициент мы сразу приводим к целому виду типа int. За такую роскошь мы, конечно, расплачиваемся дополнительными килобайтами кода, но в данном случае оно того стоит.
* * *
Подробности
А зачем здесь к полученному значению добавляется еще и число 5? Это поправочный коэффициент, который вводится индивидуально из следующих соображений. В главе 20 мы упоминали, что для небольших высот над уровнем моря при изменении высоты на каждые 10–12 м давление меняется примерно на 1 мм рт. ст. В пределах такого города, как Москва, показания могут меняться в зависимости от местоположения примерно на 10 миллиметров. Мы же хотим, чтобы станция показывала величины, близкие к тем, что передаются Гидрометцентром, — иначе, проглядев прогноз погоды, ее показания придется все время пересчитывать в уме. Так что коэффициент 5 — это экспериментально вычисленная поправка в моем случае. Будьте готовы, что вам ее придется пересчитать, сравнивая показания с теми, что публикуются для вашего населенного пункта каждые три часа в интернет-службах погоды. Если же вы хотите, чтобы станция показывала реальное давление без всяких поправок, то просто вычеркнуть этот коэффициент из программы будет недостаточно — придется датчик дополнительно калибровать. А это дело непростое — не каждый физический институт имеет средства для поверки датчиков атмосферного давления, потому и проще подогнать его показания под Гидрометцентр.
* * *
В библиотеке для барометра — файле Barometer.cpp (папка Barometer_sensor) — необходимо закомментировать забытые разработчиками тестовые строки 28 и 40: Serial.print ("Teinperaturet: ") и Serial.print ("Temperaturet2: "). В противном случае у вас собьется прием данных от Xbee-модуля и все время на индикаторных панелях будет возникать лишний мусор.
В отличие от барометрического, библиотека для модуля измерения температуры и влажности SHT1x[47] применяет не аппаратный интерфейс 12С, а его программную реализацию (подробнее о том, как это делается, рассказано в моей книге [21]). Модуль подключается к любым цифровым выводам — на схеме рис. 22.1 в этом качестве выступают выводы А2 и A3 (что соответствует цифровым выводам 16 и 17). В программе в секции определений их надо указать:
#include <SHT1x.h>
#define dataPin 16
#define clockPin 17
SHT1x sht1x(dataPin, clockPin);
Особенность подключения SHT1x, как мы видим на схеме, — наличие двух разъемов, где выводы питания дублируются (рассмотрев плату, я не обнаружил между ними разницы), а сигнальные линии Data и SCK пространственно разделены. Это не доставляет никаких проблем при создании конструкции (все равно задействовано лишь два вывода Arduino), но если вы хотите уменьшить число проводов, то в «Амперке», кроме SHT1x, предлагается и другой подобный датчик — DHT11 (имеющий, впрочем, как утверждается, меньшую точность).
Тестовые программы для обоих модулей прилагаются к соответствующим библиотекам. В скетче для SHT1x следует только не забыть заменить номера выводов на указанные на схеме рис. 22.1.
Подключение радиомодулей
ХЬееПодключение Xbee-модулей, возможно, самая сложная часть проекта. Трудность тут заключается в том, что для коммуникации с контроллером они используют тот же последовательный порт, что и USB-соединение с компьютером (собственно, Xbee-модуль представляет собой как бы продолжение UART в замену проводному кабелю). Поэтому Xbee-модуль будет мешать не только коммуникации с компьютером, но и процессу программирования платы, отчего перед каждой модификацией программы его придется извлекать из схемы и вставлять заново. Опыт показал, что это делать необязательно, если ХЬее-модуль не участвует в коммуникации (т. е. не осуществляет приема или передачи), но в общем случае на это полагаться не стоит — проще отключить его и подключить заново.
Xbee-модули не требуют для своей работы каких-либо библиотек — serial-коммуникация через них осуществляется совершенно прозрачно для программиста, с применением стандартных функций последовательного порта. Это, как мы говорили, позволит нам через один и тот же порт осуществлять и прием данных от внешнего датчика, и установку часов из компьютера. Правда, тогда при подключении к компьютеру ХЬее-модуль придется извлекать из устройства точно так же, как это делается при программировании контроллера. Но делать это придется очень редко — только для подстройки времени, если часы DS-1307 сильно убегут, т. е. не чаще, чем где-то раз в полгода), ну и, разумеется, при смене батарейки, которой, как обещают производители, должно хватить на несколько лет.
* * *
Подробности
Если мы не хотим озадачивать пользователя извлечением Xbee-модуля, то пришлось бы использовать как минимум Arduino Mega, где UART-портов несколько. На мой взгляд, как и в случае применения GPS-модуля для полностью автоматической установки часов, это слишком большая цена за функцию, которая будет применяться лишь изредка.
Кстати, подкину еще одну идею: если приобрести третий ХЬее-модуль, настроить его на совместную работу с остальными и подключать его к компьютеру через специальный Xbee-адаптер, то через него можно не только устанавливать часы, как через обычный UART, но даже и программировать контроллер. Программу станции при этом можно использовать ту же, что приведена далее, только тогда перед обращением к часам извлекать ХЬее-модуль не придется. Предлагаю вам заняться на досуге такой доработкой — базовый материал для нее есть в статье о настройке ХЬее на сайте «Амперки», которая упомянута в разд. «Подключение и настройка ХЬее-модулей» этой главы.