Умный дом своими руками. Часть 5. Инфраструктура — Освещение. RGB подсветка.

Введение:

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

Для изготовления собственно подсветки нам понадобятся: RGB светодиодная лента, алюминиевый светодиодный профиль с рассеивателем, блок питания на 12в, способный запитать вашу ленту, модуль WiFi микроконтроллера WeMos D1 mini, модуль DC-DC преобразователя 360mini, 3 мосфета КП737Г (но лучше взять мосфеты с минимальным RDS, для меньшего нагрева, хотя если использовать слабую по мощности RGB ленту, то пойдут и КП737), корпус польского производства Kradex Z24A, пара разъемов и гребенка. 

Схема устройства:

Подключаться все будет по следующей схеме:

Плюс 12в от блока питания  поданы на dc-dc преобразователь для формирования напряжения питания микроконтроллера 3,3в и напрямую на светодиодную ленту. С выхода DC-DC преобазователя, через диод шоттки (можно взять и обычный) и перемычку X2 запитывается плата WeMos D1 mini. Перемычка нужна, что бы при первом запуске безопасно выставить выходное напряжение на преобразователе не спалив при этом микроконтроллер. Диод необходим, что бы при подключении ESP8266 к компьютеру через USB, не было просадки питания (без диода, с замкнутой перемычкой модуль ESP не стартует вовсе), ну или всякий раз при подключении к компу снимать перемычку. Резисторы R1-R3 нужны, для поддержания низкого уровня на затворах мосфетов при старте микроконтроллера (что бы не вспыхивали светодиоды при включении), резисторы R4-R6 ограничивают ток на затворах. Мосфеты управляют тремя цветовыми каналами RGB подсветки.

Изготовление:

Всю конструкцию можно собрать и навесным монтажом или на макетной плате, но я предпочитаю делать для своих поделок печатные платы. Плату можно изготовить из одностороннего фольгированного стеклотекстолита по Лазерно-Утюжной Технологии (ЛУТ). Травить я предпочитаю в растворе перекиси водорода — ингредиенты всегда в шаговой доступности (100мл 3% перекиси водорода, 30гр лимонной кислоты, 5гр поваренной соли). В теплом растворе процесс травления идёт быстрее. В процессе, периодически необходимо кисточкой удалять с платы продукты травления.

Как вариант, я дополнительно развёл плату под мосфеты, добываемые с материнских плат в SMD корпусах TO-252(но уже без дисплея),  но на такой плате ещё ничего не собирал.

Архив с двумя вариантами плат в формате SprintLayout 6. Внимание, при печати  платы зеркалить!!!

Для отладки каких-то сценариев к RGB контроллеру можно подключить миниатюрный дисплей SSD1306. На него будут выводится значения RGB каналов, а при старте модуля отобразится полученный IP адрес.

Платы D1 mini и mini-360 установлены на контакты от гребенки. Вся конструкция установлена в корпус Kradex Z24A, под разъемы необходимо пропилить отверстия в боковой стенке. 

 

Прошивка:

esp8266Server_RGBLED2.zip (Исходная версия прошивки взята с GitHub)

Из исходной версии я выпилил всё лишнее на мой взгляд, включая неправильно работающий собственный ColorPicker (всё надо инвертировать).

Данные значений RGB-каналов  принимаются через Get-запросы. А вот обратной связи здесь нет. Так, что при сбое питания, состояние объекта в системе  «Умный дом» может быть иным, нежели на самом деле. Я планировал добавить функцию обратной связи на MQTT, но на это пока не хватает знаний/времени. Но и в таком виде всё работает вполне пристойно.

Прошивать будем в среде Arduino IDE. Для работы среды с платами на базе ESP8266, необходимо подгрузить файлы поддержки. Для этого идём в Файл > Настройки, в поле: «Дополнительные ссылки для Менеджера плат» вводим следующий адрес и нажимаем «ок»: 

http://arduino.esp8266.com/stable/package_esp8266com_index.json

Затем идем в Инструменты > Плата… и в выпадающем меню выбираем «Менеджер плат». В открывшемся менеджере плат сверху в строке поиска вводим ESP8266 и видим информацию о пакете esp8266. Нажимаем кнопку установка.

Теперь осталось выбрать нужную плату в Инструменты > Плата… Выбираем пункт LOLIN(WEMOS) D1 R2 & mini

Теперь можно загружать скетч и недостающие библиотеки. После загрузки скетча нажимаем кнопку «проверить» и среда разработки выдаст ошибку о том какой библиотеки ей не хватает для компиляции. Скачиваем нужную библиотеку из интернета в виде zip архива и подключаем её: Скетч > Подключить библиотеку > Добавить .ZIP библиотеку…

Если всё хорошо, то после проверки ошибка будет указывать на следующую недостающую библиотеку. Когда все библиотеки будут подключены и компиляция пройдет удачно — можно переходить к правке Wi-Fi подключения в скетче.  Находим следующие строки и меняем на свои SSID и пароль.

const char* ssid = "ssid_name";
const char* password = "passwd";

После всех необходимых правок можно подключать плату и загружать в нее скетч, предварительно выбрав нужный COM-порт в «Инструменты» > «Порт:»…

Настройка MajorDoMo:

Для начала нам нужно создать Простое Устройство. Для этого идём в Панель управления > Простые устройства, жмем кнопку «Добавить». Здесь вводим любое название, например, RGB-подсветка, выбираем тип Освещение (RGB), по желанию указываем местоположение и жмем кнопку «Добавить».

Автоматически создастся связанный объект, через методы которого мы будем управлять нашей RGB подсветкой. Так, как наше устройство управляется посредством get-запросов, необходимо дописать метод включения/выключения и добавить свойство wanip, которое будет хранить IP-адрес нашего модуля RGB.

Итак, нам нужно отредактировать метод TurnOn и TurnOff класса SRGB. После текста инжекции добавляем код, приведённый ниже:

    $color=$this->getProperty("color");
    $color=preg_replace('/^#/','',$color);
    $color=hexdec($color);
    $red=round(($color >> 16 & 0xFF)*4.015);
    $green=round(($color >> 8 & 0xFF)*4.015);
    $blue=round(($color & 0xFF)*4.015);
    $cmdUrl = "http://".$this->getProperty("wanip")."/?r=".$red."&g=".$green."&b=".$blue;
    //say($cmdUrl);
    getURL($cmdUrl,0);

Должно получится как-то так:

Тоже самое делаем для метода TurnOff.

Так, как в коде используется чтение из свойства wanip, которого у нас еще нет, необходимо его добавить. Переходим в свойства класса SRGB и нажимаем «Добавить новое свойство». Вписываем в поле «Название» wanip, заполняем поле «Описание» и жмем «Добавить». Должно получится так:

Осталось прописать адрес нашего устройства RGB. Выбираем сверху «Объекты» и жмём «Редактировать»

На открывшейся странице вписываем IP адрес в свойство wanip и жмем обновить.

 

Казалось бы на этом и всё, но после какого-то обновления системы обнаружилась проблема. В метод SRGB_setColor.php то ли ошибка закралась, то ли я не разобрался как его правильно «готовить», но так, как мне надо метод больше не работал. Т.е. если раньше, открывая цветовое поле элемента «выбор цвета» (colorPicker) я мог выбрать нужный мне цвет, нажать ОК и цвет подсветки сразу менялся на нужный, то сейчас мне ещё необходимо включить/выключить устройство, что бы передались данные. Т.е. раньше метод TurnOn вызывался после изменения цвета, то сейчас его надо вызывать специально выключая и включая объект. Сравнивая методы старые и после обновления я нашёл различия. Приведу тут листинг обоих вариантов (метод расположен в /var/www/modules/devices/ (Линукс):

SRGB_setColor.php до обновления - рабочий метод

<?php

if (!$params['color']) return;

$color=strtolower($params['color']);
$color=preg_replace('/^#/','',$color);

$transform=array(
'red'=>'ff0000',
'green'=>'00ff00',
'blue'=>'0000ff',
'white'=>'ffffff'
);

if (isset($transform[$color])) {
$color=$transform[$color];
}

if ($color == '000000') {
$this->callMethodSafe('turnOff');
} else {
$this->setProperty('color',$color);
$this->setProperty('colorSaved',$color);
$this->callMethodSafe('turnOn');
}

SRGB_setColor.php после обновления - не рабочий метод

<?php

if (!$params['color']) return;

$color=strtolower($params['color']);
$color=preg_replace('/^#/','',$color);

$transform=array(
'red'=>'ff0000',
'green'=>'00ff00',
'blue'=>'0000ff',
'white'=>'ffffff'
);

if (isset($transform[$color])) {
$color=$transform[$color];
}

if ($color == '000000') {
$this->callMethodSafe('turnOff');
} else {
if (!$this->getProperty('status')) {
$this->callMethod('turnOn');
}
$this->setProperty('color',$color);
$this->setProperty('colorSaved',$color);
//
}

Итак, нам подходит первый вариант, единственное надо учесть, что после очередного обновления Majordomo, внесённые изменения могут затереться и этот файл вновь придётся отредактировать.

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *