Юрий Ревич - Занимательная электроника
Чтобы правильно позиционировать вывод текста, следует иметь в виду, что библиотечная функция cursorToXY() рассчитана на графический экран 128x64 точки. По этой причине при выводе текста указывать положение курсора удобно так, как показано в примере, с учетом того, что символ занимает 6 точек по ширине, а строка — 8 точек по высоте. Поскольку позиции в строке и сами строки нумеруются с нуля, то вывод символа в предпоследнюю (20-ю, т. е. номер 19) позицию пятой (т. е. номер 4) строки предваряем оператором cursorToXY (19*6,4*8).
Обратите внимание, что вывод на такой дисплей всегда должен начинаться с функции установки курсора на определенную позицию — чтобы выводимые символы заменяли старые на том же месте. Иначе в следующем цикле функции loop () строки быстро поползут вверх, не давая разглядеть результата. Результат выполнения тестовой программы приведен на рис. 21.5. Фото сделано при выключенной подсветке — на снимке она была бы практически не видна.
Рис. 21.5. Результат выполнения тестовой программы для дисплея MT-12864J
ГЛАВА 22
Метеостанция на Arduino
Как на Arduino делать устройства лучше фирменных
Вдруг из темноты выступила какая-то фигура, очертания которой показались д'Артаньяну знакомыми, и привычный его слуху голос сказал.
— Я принес ваш плащ, сударь, сегодня прохладный вечер.
А. Дюма. Три мушкетера
Домашняя метеостанция — один из самых необходимых и оправданных радиолюбительских проектов. Как мы уже говорили, бытовые метеостанции, имеющиеся в продаже, не выдерживают никакой критики — ни с точки зрения удобства пользования и дизайна, ни с точки зрения метрологических качеств. Через руки автора этих строк прошло не менее десятка моделей бытовых метеостанций, и ни у одной из них работу нельзя было признать удовлетворительной. Дисплеи перенасыщены лишней информацией, значения температуры «разъезжаются», показатели влажности не совпадают на десятки процентов, в довершение всего станция все время теряет внешний радиодатчик и поймать его можно, только полностью отключив питание и тем самым потеряв настройки дисплея и часов…
Все эти проблемы не имеют никаких объективных предпосылок и явно возникают исключительно из-за халатности разработчиков и производителей. С помощью современной элементной базы они легко решаются на среднем любительском уровне при наличии минимального терпения и аккуратности. Единственное, возможно, узкое место, которое трудно преодолеть при самодеятельном конструировании, представляет собой дисплей — после ознакомления с ассортиментом того же «Чипа-Дипа» становится понятно, почему для почти каждого бытового прибора придумывают экран своей оригинальной конструкции. Но тут уж ничего не поделаешь, придется выбирать, что дают. В остальном Arduino позволяет подойти к конструированию метеостанции «по-взрослому» — не делая скидок на любительское происхождение при выборе функциональности. Поскольку мы станем ориентироваться на ассортимент готовых модулей, то результат окажется, как минимум, не дороже тех убогих произведений, которыми переполнены интернет-магазины домашней техники. При этом мы легко сможем реализовать дополнительные функции, которые либо присущи очень дорогим моделям, либо отсутствуют в промышленных образцах вовсе. Самое трудное, как всегда в таких случаях, — оформление конечного результата так, чтобы его было не стыдно повесить на стенку, но тут все в ваших руках.
Должен сказать, что в процессе отладки конструкции, описанной далее, производители комплектующих для Arduino не переставали меня удивлять. Я был готов к тому, что показания приобретенных датчиков придется корректировать программным путем, — совершенно невероятно, чтобы они на производстве подвергались уточняющей калибровке. Однако, датчики и без коррекции удовлетворяли требованиям!
А 2-милливаттный Xbee-радиодатчик спокойно работал через три межкомнатных перегородки — лучше фирменного роутера Wi-Fi в тех же условиях.
Техническое задание
Перед тем как приступать к проектированию, надо точно определить, к чему мы стремимся. Давайте сформулируем, что должна «уметь» и из каких основных узлов состоять домашняя метеостанция.
□ Главный модуль — измерение внутренней температуры (в месте установки), влажности и атмосферного давления. Питание от сети.
□ Выносной датчик внешней (уличной) температуры и влажности — связь с главным модулем по радиоканалу, питание от батарейки (а значит, функции энергосбережения). Связь должна надежно работать как минимум через оконный стеклопакет, а лучше — через бревенчатую (в идеале — кирпичную или бетонную) стенку, на расстоянии не менее 5–7 метров.
□ Часы реального времени с календарем — должны иметь автономное питание и возможность автоматической/полуавтоматической коррекции хода.
□ Дисплей главного модуля — внешняя температура/влажность, внутренняя температура/влажность, атмосферное давление, время, дата, день недели. Проработаем два варианта: с ЖК-модулем (тем, который описан в предыдущей главе) и с более эстетично выглядящим, но и существенно более дорогим светящимся экраном на основе OLED.
□ Запись показаний на SD-карту — этот пункт появился сам собой в процессе подбора комплектующих. Оказалось, что добавление этой функции в буквальном смысле ничего не стоит (в «Амперке» разница в цене между платами Wireless Shield просто и Wireless Shield SD с гнездом для карты MicroSD составляет 200 рублей). Такая возможность может оказаться полезной, например, школьнику, которого обязывают вести погодный дневник.
□ Метрологические требования — при установке выносного датчика рядом с главным модулем расхождение показаний по температуре желательно не более 0,5 °C, по влажности — не более 2 %. Абсолютное значение ошибки измерения температуры вблизи нуля градусов — не более 0,5 °C. Отметим, что погрешность барометра можно не нормировать — его показания в любом случае придется подгонять «по месту» по причинам, о которых далее.
Выбор компонентов и схема станции
Изучив каталог «Амперки» и сравнив на всякий случай с тем, что предлагают другие торговые организации, выберем следующие компоненты:
□ плату Arduino Uno (для главного модуля);
□ плату Arduino Mini (для выносного датчика);
□ сетевой блок питания 5 В, 1000 мА;
□ датчик температуры и влажности SHT1x (2 штуки: для главного модуля и выносного датчика);
□ барометр SEN05291P;
□ часы RTC на основе DS-1307;
□ ХЬее-радиомодуль (2 штуки: для главного модуля и выносного датчика);
□ плату расширения Wireless Shield SD;
□ ЖК-дисплей МТ-12864J или два OLED-индикатора WEH001602В.
Строчный матричный OLED-индикатор WEH001602В фирмы Winstar представляет собой дисплей с крупными (почти 10 мм) и яркими матричными символами, размещенными по 16 символов в 2 строки на каждом. К сожалению, более, чем двухстрочных дисплеев с символами достаточно большого размера не существует, поэтому придется идти на усложнение конструкции и ставить две штуки (зато можно подобрать их с разными цветами, чтобы разделить данные и время/дату). Два таких индикатора обойдутся в сумму почти, как три ЖК-дисплея MT-12864J, но зато они намного лучше выглядят и имеют меньше внешних соединений, что позволит освободить контакты платы Arduino Uno, задействованные во взаимодействии с SD-картой (в варианте с MT-12864J SD-карту использовать не получится). Индикаторы выпускаются в разных цветах, я выбрал желтый для метеоданных и зеленый для времени. Приобрести эти индикаторы может быть непросто — их не оказалось не только в «Амперке», но и в розничной продаже вообще, пришлось заказывать и ждать доставки.
Полная схема подключения всех компонентов для главного модуля станции в варианте с двумя такими OLED-индикаторами представлена на рис. 22.1. На схеме не показаны соединения с SD-картой (контакты D4 и D11-D13), а также подключение Xbee-модуля (питание 3,3 В и контакты последовательного порта D1 и D2) — все это осуществляется автоматически при установке платы Wireless Shield SD на плату Arduino. Естественно, также не показан сам последовательный порт, размещенный на плате Arduino. Версию с ЖК-дисплеем мы опишем позже, а сейчас рассмотрим последовательно особенности подключения и программирования каждого из компонентов.
Подключение строчных OLED-дисплеев
Как мы уже говорили, для строчных матричных экранов стандартный контроллер носит название HD44780. Для работы с ним имеется стандартная библиотека LiquidCrystal, входящая в состав Arduino IDE. С командами HD44780 совместим интерфейс любых подобных конструкций, причем и ЖК- и OLED-разновидностей, однострочных или многострочных. Потому необязательно применять именно WEH001602В (буква В в конце наименования в данном случае указывает на высоту строки, 1602 означает, что это 16 символов на 2 строки). Почти без изменения программы можно ставить в схему любой подобный индикатор, в том числе и других производителей. Однако фирма Winstar захотела несколько улучшить стандарт, и потому ее произведения все-таки имеют свои особенности, о которых мы поговорим далее.