Тема постепенного поумнения нашего дома не была забыта, как это могло показаться. Просто, контроллеры, являющиеся основой этого процесса, вещь сугубо специфическая и имеют смысл только в рамках конкретного применения на конкретных же местах. А места эти образуются в доме медленно. Тем не менее, по факту завершения организации ниш с полками в реконструируемой гостинной, контроллеры получили свое.


Ранее в этом цикле статей я обещал накидать живых примеров реализаций идеи. Так, вот оно сейчас и будет.

Хотя, перед этим, впрочем, вероятно, имеет смысл упомянуть, что за прошедшие месяцы плата-конструктор контроллера благополучно эволюционировала до второй своей версии:

Изменений не много и, в основном, они коснулись различных выявленных косяков в разводке самой платы. Типа, “резистор слишком близко к разъему”, “тут винтик неудобно закручивать” и т.п.

Попутно плата обзавелась бОльшим количеством входов-выходов, получила нормальную возможность принимать на себя не только сенсорные панели, но и обычные кнопки, заполучила на борт удобный выход на i2c шину (почему я сразу о ней не подумал – загадка есмь) и другое по мелочи.

В основе своей философии и базовых возможностей изменений нет. Все так же, как оно и было описано ранее. В этом смысле плата-конструктор оказалась очень удачной с самого начала.

Кому оно покажется актуальным, вот последняя версия:

Скачать гербер для заказа или самостоятельной травки можно тут: архив ZIP, ~400 с хвостиком кило. Там же доступен и исходник (PCBv2x.fzz) для Fritzing в которой все и рисовалось.

Заранее прошу прощения. Я, по сути, не настоящий сварщик… Вот, например, у друга, более искушенного в электронике и схемотехнике, натурально корчи начинаются от моих схем и разводок. А в ответ на доводы, типа, “оно же работает, чего тебе еще надо?!” он начинает плакать, звать маму и просит похоронить его отдельно от видевших это глаз…


Возвращаясь к шкафам и нишам… Скажем, пускай сперва будут ниши, например:

Для них было нужно управление двумя подсветками: подсветка в самих нишах и отдельный настенный светильник между ними. Этот отдельный настенный светильник восхотелось сделать автоматическим. Чтобы с сенсором движения. Но только, когда в комнате темно. Ну, типа, если я пошел посреди ночи к холодильнику кипяточку попить, чтобы не наступить впотьмах на Кота, занятого охотой на комаров по всему дому.

Помимо этого, восхотелось, чтобы фиксировалась температура и влажность в помещении. Это, вообще, задел на очень далекое будущее. Друг (в перерывах между рыданиями над моими схемами) подкинул идею и, помусолив ее в голове, я пришел к выводу, что некий смутный смысл в ней есть.

О самой идее может быть когда-нибудь потом, но так или иначе она требует нескольких “погодных” датчиков по всему дому. Ну, вот и первый из них… Выйдет чего с идеей – хорошо. Не выйдет… Ну, будет просто смешной градусник на стене, доносящий до всех желающих ценнейшую информацию о погоде в этой конкретной локации дома.

Итого, контроллер должен обслуживать на себе следующие устройства:

  • Преобразователь питания с 12 на 7.5-9 вольт. Он необязателен т.к. ардуина на борту уже имеет такой преобразователь и может питаться напрямую с 12 вольт. Вот, только, обычно, все отговаривают так делать. Учитывая, до кучи, что все это будет представлять собой “устройство в режиме работы 24/7”, не хочется нагружать его предельными нагрузками.
  • Модуль WiFi-связи для дистанционного управления собой, (согласно базовой концепции всей затеи);
  • Датчик температуры и влажности с не вполне четким на текущий момент представлением о своем конкретном назначении;
  • Экран для отображения “погоды” (раз уж датчик есть);
  • Сенсор движения;
  • Сенсор освещенности;
  • Две кнопки для управления подсветками;
  • Три мосфета для управления подсветками: “правая ниша”, “левая ниша”, “центральный светильник”. Тут, по идее, и двумя можно было обойтись т.к. для правой и левой ниш не подразумевается раздельного управления. Но, вдруг, потом покажется, что это необходимо. Тогда вопрос сведется только к программной части прошивки т.к. на “железном” уровне оно уже будет готовым. Пару строк кода дописать – и все.

Вторая версия платы-конструктора все это принимает на себя играючи:

Как видите, ничего сложного. Дюжина проводов к внешним датчикам и светодиодам. Все остальное – на борту платы-конструктора. Собирается менее, чем за час (вместе отмывкой от канифоли).

Для обмена данными припахан все тот же модуль на базе ESP8266, который отлично себя зарекомендовал на уже собранных контроллерах.

Контроллеры, описываемые в этой статье, конечно, не первые в доме. Все ж я этим тут уже несколько месяцев развлекаюсь. Первый контроллер бесперебойно работает еще аж сентября прошлого года. Стабильно и без глюклвстррр…

Правда, под него пришлось написать свою библиотеку. Точнее, не библиотеку, даже, а просто несколько простых функций, которые копипастятся в код прошивки. Готовых библиотек для ардуины и ESP8266 пруд пруди. Но, к сожалению, бОльшая их часть написана индусами для индусов. Обычные люди пользоваться этим не могут – их тошнит. Равно как и обычные ардуины в себя их не принимают – их тоже тошнит. Оно, может, где и есть нормальное, от чего не тошнит, но мне было проще написать самому. Благо, что это нужно было сделать только один раз и оно было мною уже давным-давно сделано.

В качестве “погодного” сенсора используется новомодный модуль с BME280 на борту. Во-первых он чуть ли не вдвое меньше по габаритам, чем какой-нибудь DHT11 или DHT22. Во-вторых, умеет обмениваться данными по i2c шине, а значит может быть прицеплен на тот же провод, что и и экран, что сокращает количество вермишели в контроллере. В-третьих, он, конечно, намного точнее, чем DHTшки…

Кстати, в нагрузку я теперь получаю еще и данные об атмосферном давлении, которые не особо нужны. Но при остальных преимуществах – ладно уж. Авось от еще одной цифры экран не треснет, а лишние статистические данные еще никому не вредили. Если чо, то можно будет предсказывать ураганы. Но уже на уровне центрального сервера, который собирает данные по контроллерам. Сам контроллер обработкой своих данных не занимается.

Экран… Не возьмусь сказать, что это конкретно. Нечто безродное китайское, что ведрами продается на каждом углу.

OLED с разрешением 128×64. Условно, двухцветный. В том смысле, что первые 16 строк пикселей у него желтенькие, остальные синенькие.

Не HD телевизор, конечно, но такого вполне достаточно для поставленной задачи. На самом деле, оный вообще не задумывался на начальном этапе для этого контроллера. Но у меня их с дюжину штук и есть планы использовать парочку их них в совсем-совсем другом проекте: про собачку (да тот проект не умер, просто двигается очень медленно, я к нему вернусь весной в более интенсивном режиме).

Прежде чем мутить эти экраны к собачке, нужны были эксперименты на кошечках. Ну, вот так удачно этот конкретный контроллер и подвернулся. Стал опытной площадкой для экспериментов по выводу информации на такие экранчики.

В остальном, все не менее примитивно и базово. Стандартный PIR (motion) сенсор для движения. Обычный фоторезистор в качестве датчика освещения. Кнопки, разъемы, светодиоды, мосфеты (FDP6030BL), горсть резисторов.


Вот, соорудить кузов для всего этого безобразия оказалось куда дольше, чем думалось.

После пары вечеров таскания всех компонентов по экрану компьютера, нарисовалась вот такая общая модель:

Т.е. оно, представляет собой какбе плату-конструктор к которой приделано два “уха”. В одном – экран и “погодный” сенсор, в другом – датчик движения и датчик освещенности.

Ежели все разобрать, то оно вот так:

Сама плата контроллера, как и раньше, прекрасно встает в стандартную электрокоробку на стене. Уши – выходят за пределы коробки, но это не страшно. Всего лишь вопрос внешней декоративной панели – сколько она там пространства собою накроет вокруг электрокоробки.

Корпуса ушей печатались на 3D-принтере и нашпиговывались начинкой. Тут все обошлось без приключений. Забегая вперед, сразу скажу, что приключений не было вообще. Очень скучный в этом плане выдался проект. Все было заранее известно, все было заранее смоделировано. По большей части уже давно опробовано и проверено в других контроллерах… В общем, только и оставалось, что полупроводники в дырочки пихать, да винтики закручивать, как только принтер выплюнет очередную деталь корпуса.

“Ухо” с экраном и погодным сенсором:

“Ухо” с датчиком движения и датчиком освещенности:

Хочу обратить особое внимание – никаких термосоплей! Все сборное-разборное на винтиках. Все подогнано тютелька в тютельку (хвала тем долгим часам, что я не пожадничал на многочисленные апгрейды принтера). Латунные резьбовые вставочки без всякой, там, “резьбы прямо в пластике”.

Кому-то оно все может показаться избыточным, но я так устал от всего этого говна и палок на термосоплях, которыми брызжут каналы самоделкиных на ютубе. Уже почти готов тоже просить похоронить мои глаза, которые все это видели, отдельно, рядом с глазами друга, которые видели мои электросхемы…

Плата-конструктор в сборке с “ушами”:

Последний штрих – кнопочки. До сего момента, в таких контроллерах я использовал сенсорные модули. Типа, срабатывают не по нажатию, а по касанию. Изначально хотел вовсе избавиться от выступающих кнопок на контроллерах. Чтобы прям ваще, как в XXI веке, айфон, тесла-трак, все дела. Увы…

К сожалению, сенсорные панельки себя показали не очень хорошо. Во всяком случае те дешевые китайские, что есть у меня. Оказалось, что они очень по-разному реагируют на прикосновения. На мои они откликаются сразу. Жене же приходилось их прижимать весьма настойчиво. Не знаю в чем тут дело. Возможно, мое тело обладает более высокими токопроводящими свойствами нежели у нее.

Потом, довольно часто они срабатывают и вовсе сами по себе на пустом месте. Никакие обычные способы борьбы с “дребезгом” (резисторы, программные задержки) не помогают. Видимо дело не в спонтанном дребезге. Выглядит так, как будто они внезапно фиксируют совершенно отчетливое нажатие, а не наводки какие. Может, призрак в доме бродит, может какая галактическая монополь систематически залетает – не знаю. Устал бороться и ломать голову. Перешел на старые-добрые механические кнопки.

Ну и уж, если откатываться в доисторические времена, то по полной. С вот такими пафосными вульгарными жмакалками, найденными в каком-то амазоне по не слишком трезвой лавочке:

Жена, как это увидела – тоже уже просит хоронить свои глаза отдельно.

Таким темпом, по ходу, этих глаз уже на хорошую пирамиду Хеопса скоро наберется… Боюсь, однако, если в одном месте собрать такое количество глаз видивших Зло, то там немедленно разверзнется портал в Ад… С другой стороны, оно, может, и неплохо… А то развелось эстетов вокруг – плюнуть некуда… Лично, как по мне, так все норм с этими кнопками! Качественная такая циганщина. Мне нравится…

Вот так оно все в сборке:

Вполне себе ня-ня-ня и ми-ми-ми…

Сборка на стене:

Может быть легко снята для обслуживания. В прошивке чего поменять, например, или сенсоры подкрутить.

Остается только декоративная рамка, которая скроет электрокоробку и прочую начинку. Обычно это просто рамка из металла или пластика. Если бы не экран и сенсоры, то можно было бы обойтись стандартной покупной из магазина. Той же, что и для обычной стенной розетки, например. Контроллер как раз на такой вариант и был изначально заточен.

Но данный случай – особый. Поэтому пришлось напечатать свою особую рамку под конкретно этот контроллер:

Окончательный итог затеи:


Если кому интересно, что именно показывает встроенный экран – вот:

В “желтой” части экрана – состояние органов управления (уровень освещения, срабатывание датчика движения, какой выключатель выкл, какой вокл, какой в автоматическом режиме и т.п.)

В “синей” части экрана – погода (температура, влажность, давление).


На самом деле, согласно выстроенной иерархии контроллеров моего умнеющего постепенно дома, это не один, а два контроллера. Один – погодный, другой – управление подсветкой в нишах. Да, они оба разместились в одном корпусе и оба обслуживаются одной ардуиной внутри. Но с точки зрения центрального сервера, это ДВА разных контроллера, каждый со своим уникальным ID в системе.

Что умеет делать “погодный” контроллер. Умеет раз в пять минут читать сенсор, рисовать прочитанное на экран и отправлять на сервер три значения (температура, влажность, давление). Все. Больше он ничего не умеет. От сервера ему ничего не нужно и он ничего у него не спрашивает. Он только сообщает. Что там сервер с его данными делает – контроллеру до одного места. Хоть в devnull пускай сливает. Он все равно будет работать на стене и рисовать на экране погоду.

“Подсветочный” контроллер умеет по нажатию на нижнюю кнопку включать и выключать подсветку в нишах. По нажатию на верхнюю кнопку – включать и выключать настенный светильник между нишами.

Долгое нажатие на верхнюю кнопку переводит настенный светильник в автоматический режим. В этом режиме, если датчик освещенности регистрирует уровень освещения, как “темно”, а датчик движения регистрирует движение, то светильник автоматически включается.

Автоматическое включение длится в течение 15 секунд. Если в этот интервал времени будет продолжать что-то двигаться, счетчик будет откатывать интервал к своему началу с каждым срабатыванием датчика движения. Т.е., если в комнате темно и что-то все время шевелится, то и светильник будет постоянно гореть. Выключится через 15 секунд после того, как пропадет любое из двух заданных условий (свет, движение).

Так же “подсветочный” контроллер сообщает на сервер свое состояние, если между сеансами связи были нажаты какие-то кнопки. Если между сеансами связи кнопок не нажималось, то контроллер наоборот, не сообщит, а запросит у сервера свое состояние и приведет себя в соответствие с полученными данными. Получение/отправка данных происходит каждые 7 секунд. Т.о. реагирование происходит довольно быстро.

Если по той или иной причине обмен данными не состоялся (сервер лег, вспышки на Солнце, звезды неудачно моргнули и т.п.), контроллер проигнорирует текущий цикл обмена и оставит все как есть продолжая повторять циклы связи пока не получит однозначный ответ от сервера.


Вот так выглядит структура БД в центральном сервере:

В таблице controls хранится общая информация о всех контроллерах. В таблице devices – информация о всех девайсах того или иного контроллера. Остальное – сервисные фантики. Нужные, в основном, для быстрого рисования интерфейса на экране компьютера.

Например, контроллер “подсветка”, описанный выше, имеет два “девайса” – подсветка ниш и светильник на стене. Первый может принимать только два значения (вкл/выкл), второй – три (вкл/выкл/авто). Контроллер “погода” имеет три “девайса” (температура/влажность/давление), у каждого есть некое состояние, которое имеет значение в пределах свойственных температуре, влажности или давлению.

Когда контроллер спрашивает у сервера “У тебя есть чо для ID:NNNNN?” Сервер дергает таблицу контроллеров по запрошенному ID, тут же получает информацию о всех его девайсах, сколько бы их ни было. Дернув таблицу девайсов, система тут же узнает об их возможных состояниях и текущих значениях, опять же, сколько бы их ни было и возвращает их контроллеру.

Это же срабатывает и в обратную сторону, когда контроллер не запрашивает данные у сервера, а наоборот, сообщает серверу об изменении в своем состоянии.

Таблица с “историческими” данными по погоде живет отдельно. Она сама по себе. Оперативных данных в ней нет. Это своего рода “архив”, который не нужен каждую секунду.

Это все, если очень коротко попытаться изложить… Так подумать, на уровне своей философии, все абсолютно ничем не отличается от того, что я успешно проделываю в проекте с механической собачкой. Никакой идеологической разницы. Такая же иерархия устройств. Центральный мозг. Условные и безусловные рефлексы.

В каком-то там абстрактном мире розовых пони далекого будущего, собачка интегрируется в умную систему дома, просто, как ежик чихнул. Т.о. она станет… просто еще одним “контроллером”. С огромным количеством “девайсов” на борту. Еще и самобеглым.

Т.е., вот на таком уровне интеграции я лично для себя думаю и двигаю миллион разных, казалось бы проектов, в одном направлении. Получится или нет – посмотрим.


Прошивки контроллеров лепятся, что называется, на лету. Ведь все это по сути – стандартный функционал со стандартными библиотеками. Кнопка, сенсор, таймер и т.п.

В этом месте хочу сказать отдельное большое спасибо AlexGyver. Именно его набор стандартных библиотек я использую. От управления экраном до кнопок. Очень рекомендую. Быстрые, компактные, без глюков, предельно понятные, хорошо прокомментированные. За эти библиотеки я готов простить весь тот чад, угар, сантех и термоклей от которого глаза иногда вытекают на его ютуб-канале (который, все равно, с интересом всегда смотрю, как чего новое у него выходит)… Да и, так подумать, мне ли жужжать про сантех и термоклей…

В общем, с его набором библиотек, лично мне вообще делать ничего не нужно. Раньше, хоть сам чего-то программил, а теперь… В зависимости от функционала контроллера всего то и нужно, что инклюднуть те или иные библиотеки, да сетапнуть нужные мне параметры для тех или иных объектов. Самому остается всего пару строк кода в цикле дописать. Вообще говорить не о чем…


Что же касается центрального сервера – вот тут я всецело и занят изобретением своего велосипеда. Да, есть много подобных систем для умного дома, но все они меня по тем или иным причинам не устраивают. Решил, что будет у меня свой собственный сервер с шахматами и библиотекаршами. А кто мне запретит?

Там, конечно, еще работы вагон, но даже и прямо сейчас уже, на любом компьютере или смартфоне я могу запустить броузер и начать управлять всеми контроллерами в доме. Из любой точки мира, где есть интернет.

Вот так выглядит часть интерфейса, например:

На интерактивной “карте” дома (которую можно двигать, приближать, удалять) разбросаны иконки контроллеров в тех местах, где они установлены в доме. Иконки отображают текущее состояние контроллера. Погода – тоже своего рода иконка контроллера, только выглядит немного иначе (навешивается другой набор css, но по сути своей они ничем не отличаются от прочих).

По клику на иконку открывается окошко свойств, как на картинке выше. Вот в нем можно уже непосредственно управлять контроллером. Разумеется, все динамически отображается и в обратную сторону. Например, если кто-то нажмет кнопку дома на контроллере, на “карте” это немедленно отобразится.

Клик по “погодной” иконке открывает в окне не только текущее его состояние, но и “историческое” (график за сутки, неделю, месяц, год). Однако, рисование “исторических данных” я еще пока не допилил, поэтому картинки не будет. Оно, вроде, было, а потом я как-то все сломал… Там сейчас все ужас-ужас… Нет, не будет картинки…

Отвечая на самый очевидный вопрос: на текущий момент третья малина + NGINX + php + MySQL


Хотел еще рассказать про контроллер в дверной нише, но, чой-то уже букв слишком много. В другой раз…

Продолжение читайте с следующих статьях цикла…