Введение
В один прекрасный день я получил по почте извещение о долге за горячую воду, по причине несвоевременного оповещения коммунальных служб о показаниях водомеров. К этому моменту я, праздного любопытства ради, осваивал WiFi радиомодуль от “Roving Networks” с целью «обучить» его дистанционно включать/отключать электрический водонагреватель для экономии электроэнергии при долгом отсутствии пользователей. И так все сошлось, что решил я свести эти задачи и еще некоторые задумки «умного дома» к практической реализации. Ну и конечно, было бы не интересно, если бы я использовал знакомые мне технологии, поэтому я решил использовать как можно больше нового и интересного.
Постановка задачи
В квартире установлено два счетчика холодной воды, два счетчика горячей воды и электросчетчик. Также имеется бойлер, мощностью 1,5кВт. Ввиду фактического отсутствия горячей воды, соответствующие счетчики используются исключительно для снятия показаний всегда равных приблизительно нулю. Во время первого этапа автоматизации подвергнется только один из счетчиков холодной воды, электросчетчик и бойлер. В соответствии с этим была разработана постановка задачи:
1. Автоматизировать процесс съема показаний водомера холодной воды и электросчетчика. Для фактически не используемых водомеров предусмотреть заглушки с постоянными значениями.
2. Реализовать пересылку email с показаниями счетчиков коммунальным службам.
3. Разработать механизм дистанционного включения(выключения) бойлера, съема величины мгновенного потребления тока и температуры воды.
4. Разработать Веб-сервис для управления вышеописанными механизмами.
Принцип действия
На приведенном выше рисунке я попытался изобразить принцип действия спроектированного устройства. Веб-сервис, исполняющий роль пользовательского интерфейса, подключается к WiFi модулю, который по протоколу telnet предоставляет возможность управления собственными портами ввода-вывода, АЦП и интерфейсом UART. Собственные порты ввода-вывода и АЦП используются для управления силовым ключом бойлера, в то время как через UART происходит обращение к микроконтроллеру, для считывания показаний счетчиков и термометра. Для получения более правильной картины взаимодействия, рассмотрение отдельных модулей я начну снизу вверх.
Датчики.
Датчики
Так уж случилось, что к моменту начала разработки этой системы, возникло обязательство относить мои «холодные» водомеры на проверку в водоканал, что стало удобным поводом заменить их на более современные водомеры КВ-1.5i, производства ПАТ «Електротермометрія», которые оборудованы интерфейсом для снятия показаний. В данном случае интерфейсом оказался провод, который подключен к геркону внутри счетчика таким образом, что контакт замыкается через каждые 10л воды, прошедшей сквозь счетчик.
К сожалению, на электросчетчике НИК 2102-02 отсутствовали телеметрические выходы, поэтому было решено подсчитывать количество вспышек светодиодного индикатора, который согласно документации, выдавал 6400 вспышек на киловатт. Для этой цели, на ближайшем радиорынке, я приобрел жменю noname фототранзисторов, среди которых нашелся тот, который приемлемо реагировал на светодиодный индикатор.
В качестве термометра, я использовал знакомый любителям 1wire сетей, термометр DS18b20, который достаточно легко получилось подружить с микроконтроллером Attiny2313.
Дольше всего прочего я выбирал датчик тока. В итоге остановился на ACS712 30A, принцип работы которого основан на эффекте Холла. Датчик требовал внешний источник питания и на выходе выдавал величину напряжения пропорциональную силе тока относительно опорного напряжения равного Uпит/2.
Силовой ключ
Как я уже говорил, мощность водонагревателя составляет около 1,5кВт, поэтому управлять такой нагрузкой лучше с помощью реле. И такое реле нашлось внутри обычного блока защиты от перепада напряжения, купленного давным-давно в каком-то супермаркете. На плате этого блока я отсек дорожку питающую базу транзисторного ключа и прикрутил ее к порту ввода-вывода WiFly модуля, чей сигнал прдварительно был усилен с помощью транзистора. Корпус блока оказался достаточно большой и дополнительно вместил в себя датчик тока. Таким образом весь силовой ключ вместе с датчиком тока был выполнен в корпусе блока защиты от перепада напряжения.
Микроконтроллер
Будучи прикладным программистом я очень редко сталкивался с «железом» и никогда не сталкивался с МК, поэтому я выбрал Attiny2313, примеров использования которого в интернете было предостаточно. Кроме того, программатор USBasp для AVR микроконтроллеров оказался очень дешевым, всего около 9$. Прошивку написанную на С можно найти тут: github.com/AndriiArtemenko/UARTSensorsReader. Грубо говоря, МК занимается тем, что подсчитывает внешние прерывания инициируемые счетчиками и при отключении питания сохраняет значения в энергонезависимую память. Внешние команды МК получает через UART от WiFly-модуля и отвечает на них пересылая в ответ данные. Пока я запрограммировал всего 5 команд:
“a” — получить значение счетчика воды.
“b” — получить значение счетчика электроэнергии.
“c” — получить значение термометра.
“d” — обнулить значение счетчика воды.
“e” — обнулить значение счетчика электроэнергии.
Термометр ds18b20 опрашивается МК через обычный порт с помощью внешних библиотек 1wire и ds18x20_v2. Для поддержания работоспособности МК в отсутствия электроэнергии в цепи питания присутствует ионистор на один Фарад.
Основные трудности при работе с МК вызывал дребезг контактов водомера, который был подавлен программно с помощью таймера.
WiFi модуль
В качестве wifi-модуля я использовал RN-171 от Roving Networks, также известный как WiFly. По факту, это не просто wifi-модуль, а самодостаточное устройство с собственными портами ввода-вывода, АЦП, UART, WEB и FTP клиентами. Очень интересная вещь, ознакомится с которой рекомендую всем энтузиастам.
WiFly был настроен на подключение к домашней сети через wifi-роутер, telnet порт которого был проброшен на wifly модуль. Таким образом появилась возможность управлять модулем извне.
Один из портов ввода-вывода был настроен на управление силовым ключом, а одно из АЦП оцифровывает показания датчика тока. Порт UART напрямую соединен с МК.
Принципиальная схема
Как хорошо жить в 21 веке, когда нет необходимости держать дома огромный испытательный стенд и набор компонентов на все случаи жизни. Принципиальную схему я моделировал в Proteus 7 Professional, однако лишь ту часть, которая касалась работы микроконтроллера. Часть касающуюся WiFly модуля я просто дорисовал, по той причине, что в интернете не нашлось модели RN-171для Proteus. По тем же причинам, на схеме вместо фототранзистора изображена оптопара, вместо счетчиков — кнопки, а вместо стаблилзатора напряжения — просто еще один вывод питания. В остальном схема достаточно точная и соответствует “железному” прототипу. Источником питания для устройства послужил зарядный блок от мобильного телефона на 5В. Напрямую от него питается только датчик тока и транзистор усиливающий сигнал выходного порта, WiFly и МК являются 3.3В устройствами и для них был установлен стабилизатор. На сегодня система находится на стадии испытания, а по сему смонтирована на монтажной плате.
Веб-сервис
Создать Веб-сервис я решил с использованием Ruby on Rails 3, только по той причине, что мне очень хотелось попробовать поработать с этим хваленым зверем. Изначально, хостить проект я хотел на Cloud Foundry, но, не дождавшись аккаунта, скатился до Heroku. Исходный код Веб-приложения можно посмотреть тут: github.com/AndriiArtemenko/SmartFlat.
В приложении использовались гемы devise, delayed_job_active_record, liquid, simple-navigation, log4r и т.д.
На данный момент помимо отображения собранных данных, приложение умеет по расписанию отправлять письма с показаниями счетчиков в соответствующие инстанции и управлять питанием бойлера. Конечно же это мало, но первоначальная задача выполнена, и уже имеются планы на расширение функционала.
Вместо заключения
Реализацией этой задачи я занимался в свободное время и по этой причине потратил на это около 3х месяцев. За это время я осознал направления дальнейшего развития проекта и его актуальность. В ближайшем будущем я планирую добавить возможность автоматически оплачивать коммунальные услуги через какой-нибудь платежный сервис, добавить устройства для аварийного перекрытия воды в ванной и многое другое.
Благодарности
В течении всего времени реализации проекта значительную помощь по проектированию аппаратной части мне оказали пользователи форума «Радиокот». Ребята, огромное вам спасибо!
Автор: AndriiArtemenko