Автор текста: CyberexTech
Привет Пикачу!
В этой статье я хотел бы описать свой опыт разработки такого простого, но в то же время наиболее часто используемого элемента умного дома. Обсудим модули управления освещением. Забегая вперед, я бы сказал, что этот проект реализуется уже в 2021 году, но есть еще один модуль, который необходимо реализовать. Я решил совместить работу с удовольствием, дополнительно обновить прошивку устройства и "перепроектировать" модуль с помощью современного программного обеспечения и, конечно же, поделиться этим с вами. Если вам интересно, то добро пожаловать в Cats.
❯ Небольшая предыстория
Я долгое время занимался домашней автоматизацией и видел времена, когда не было встроенных микроконтроллеров беспроводной связи (таких как ESP8266) и в основном использовались проводные решения на базе 1-Wire. Мой «умный дом» не является исключением.
Каждый начинающий «строитель умного дома» понимает, что первое, что вам нужно сделать, это научиться включать и выключать свет, чтобы эффектно удивлять своих друзей, управляя ими со своего смартфона. По тем временам это казалось волшебством :) Вот я купил на Алиэкспресс бутафорский двухканальный выключатель 1-Wire DS2413P и решил реализовать управление освещением. В итоге была собрана плата управления на основе купленных переключателей и симисторного управления нагрузкой. Оборудование надежно проработало до 2021 года. Но тем же летом случилась страшная гроза, и по витой паре интернет-провайдера прошел мощный электрический разряд, отправивший сетевые карты сервера, адаптеры USB 1-Wire и платы управления освещением в электронный рай. Эффектный взрыв симисторов. Тогда я решил, что пора отказаться от проводного решения, поскольку гирлянда сгоревшего оборудования меня не радовала ни на секунду, поэтому я занялся разработкой беспроводных модулей управления освещением.
❯ Проектируем аппаратную часть
Условно мы можем разделить модуль на три части:
-
система электроснабжения;
-
контроллер;
-
Система контроля мощности.
При проектировании принципиальных схем устройств мы следуем «золотому» правилу: чем проще, тем лучше, а значит, и надежнее. Поэтому в качестве системы электропитания схема будет реализована на базе экономичного импульсного преобразователя напряжения LNK306GN, доказавшего свою надежность в работе во времени и в нештатных условиях.
LNK306GN Введение:
LNK306GN — понижающий преобразователь с минимальным количеством внешних компонентов.
Семейство микросхем LinkSwitch-TN специально разработано для замены всех неизолированных линейных и емкостных источников питания с выходным током ниже 360 мА при той же стоимости системы, обеспечивая более высокую производительность и энергоэффективность.
Устройства LinkSwitch-TN объединяют силовой МОП-транзистор на 700 В, генератор, простую схему управления включением/выключением, высоковольтный источник коммутируемого тока, генератор частоты, схему ограничения тока и схему теплового отключения в одной микросхеме.
В качестве «мозга» нашего устройства мы будем использовать микроконтроллер Espressif Systems ESP8266. Для управления мощностью нагрузки (например, лампочки) мы будем использовать комбинацию оптопары MOC3052M и симистора BT136-600. Почему бы не использовать реле? - Спросите вы, ну не люблю я реле, они щелкают и слишком большие. Ниже вы можете увидеть результаты разработки схемы устройства. Я использую программное обеспечение с открытым исходным кодом KiCAD для проектирования схем и печатных плат.
Схема модуля:
Как я уже говорил, блок питания реализован на высоковольтном импульсном преобразователе LNK306GN, что позволяет максимально упростить схему блока питания. На выходе источника создается напряжение 3,3В, которое устанавливается обратной связью, состоящей из резисторных делителей R4 и R5. Эта силовая цепь не изолирована гальванически от сети, поэтому необходимо обеспечить эффективную изоляцию печатной платы во избежание поражения электрическим током. Первоначальный пуск устройства необходимо производить с нагрузкой (лампой накаливания 60Вт), включенной последовательно в цепь питания во избежание повреждений, вызванных ошибками при установке компонентов.
Следы:
Визуализация печатной платы:
Хочу добавить, что данная плата разрабатывалась с учетом современных реалий, форм-фактор микросхемы LNK306GN изменен на SOP-7, более старые версии модуля использовали тип корпуса DIP-7.
❯ Изготовление печатной платы
В то время печатные платы изготавливались по спецификациям DIY с использованием фоторезистов и фотомасок. Но сейчас я использую лазерный метод для изготовления прототипов плат.
Используйте фотомаску для активации фоторезиста:
Плата-прототип модуля с установленными электронными компонентами:
❯ Разработка корпуса
Разработка онтологии устройства осуществлялась в открытом программном обеспечении FreeCAD. Дело достаточно тривиальное и не содержит сложного содержания.
Визуализация корпуса с моделью печатной платы:
Затем используйте пластик HIPS в качестве материала для печати, чтобы распечатать модель корпуса на 3D-принтере.
Монтажное оборудование:
AirTags используются для сравнения размеров устройств:
❯ Разработка прошивки и описание интерфейса
Разработка программного обеспечения Microsoft для устройства проходила в Arduino IDE; более новые версии были реализованы поверх текущей базовой прошивки моего интеллектуального устройства. В целях улучшения пользовательского опыта в прошивке используются следующие технологии:
-
Плененный портал;
-
Многоадресный DNS;
-
Автоматическое обнаружение MQTT;
-
SSDP.
Captive-портал — это служба, которая принудительно перенаправляет пользователей, подключающихся к устройству. Данная услуга работает только в режиме «Точка доступа» при первоначальной настройке устройства.
Обратите внимание: Функциональный умный браслет давно уже вышел за рамки фитнес трекера и немногим уступает умным часам.
При отсутствии подключения к сети или при первоначальной настройке устройство создает беспарольную точку доступа под названием CYBEREX-Light. При подключении к данной точке доступа пользователь автоматически перенаправляется на страницу авторизации для выполнения первичной настройки устройства. Для настройки устройства необходимо ввести пароль по умолчанию «admin".Ниже приведены несколько скриншотов веб-интерфейса устройства.
Страница входа:
Домашняя страница с элементами управления:
Конфигурация обмена по протоколу MQTT:
Multicast DNS — этот сервис используется для поиска устройств по доменному имени в локальной сети без использования заранее настроенного DNS-сервера. Другими словами, пользователям не нужно вводить IP-адрес для доступа к устройству. Ниже приведен пример использования этой службы, где доступ к устройству осуществляется по его локальному имени 11395386.local.
Страница настройки управления устройством через API:
Как видно на скриншоте, устройство может управлять каналами модулей через API. Данный функционал необходим для прямого взаимодействия с устройством (без посредника в виде MQTT-сервера или системы умного дома). Эту функцию можно использовать для подключения беспроводных коммутаторов, пример реализации в одном из моих проектов:
Демонстрируемый беспроводной коммутатор также реализован на ESP8266 и в качестве батареек использует две батарейки типа ААА. Благодаря режиму DeepSleep коммутатор может работать три года, используя только батарейки.
Функция этого API используется для управления подсветкой в моей «умной колонке» (статья 1, статья 2). Вот пример кода для прямого управления с помощью умной колонки»:
Код управления API | Python:
элиф cmd == 'lightON':
пытаться:
content = urllib.request.urlopen("http://11395386.local/?page=status&apikey=UkFA7").read()
ответ 0 = json.loads(содержание)
если ответ0['c1'] == 'Выкл1' и ответ0['c2'] == 'Выкл2':
text = "Включи свет"
если ответ0['c1'] == 'Вкл1' и ответ0['c2'] == 'Выкл2':
text = "Первый свет уже горит, я включил второй!"
если ответ0['c1'] == 'Выкл1' и ответ0['c2'] == 'Вкл2':
text = "Второй свет уже горит, я включил первый!"
если response0['c1'] == 'On1' и response0['c2'] == 'On2':
text = "Свет горит! Но я могу его выключить, если вы попросите!"
Если ответ 0['c1'] == 'Выкл1':
ответ2 = запросы.get('http://11395386.local/?page=control&apikey=UkFA7&switch=1')
Если ответ 0['c2'] == 'Выкл2':
ответ2 = запросы.get('http://11395386.local/?page=control&apikey=UkFA7&switch=2')
tts.va_speak(текст)
Кроме:
tts.va_speak("Извините, произошла ошибка, повторите попытку позже!")
elif cmd == 'lightOFF':
пытаться:
content = urllib.request.urlopen("http://11395386.local/?page=status&apikey=UkFA7").read()
ответ 0 = json.loads(содержание)
если ответ0['c1'] == 'Выкл1' и ответ0['c2'] == 'Выкл2':
text = "Свет выключен! Но я могу включить его, если вы попросите!"
если ответ0['c1'] == 'Вкл1' и ответ0['c2'] == 'Выкл2':
text = "Второй свет выключен, я выключил первый свет!"
если ответ0['c1'] == 'Выкл1' и ответ0['c2'] == 'Вкл2':
text = "Первый свет выключен, я выключил второй свет!"
если response0['c1'] == 'On1' и response0['c2'] == 'On2':
text = "Выключите свет!"
Если ответ 0['c1'] == 'On1':
ответ2 = запросы.get('http://11395386.local/?page=control&apikey=UkFA7&switch=1')
Если ответ 0['c2'] == 'On2':
ответ2 = запросы.get('http://11395386.local/?page=control&apikey=UkFA7&switch=2')
tts.va_speak(текст)
Кроме:
tts.va_speak("Извините, произошла ошибка, повторите попытку позже!")
❯ Интеграция в «Умный дом»
Устройство интегрируется в системы умного дома с помощью MQTT Auto Discovery.
MQTT Auto Discovery — это сервис, который максимально упрощает интеграцию наших устройств в системы умного дома. В моем случае я использую Home Assistant в качестве системы умного дома, поэтому служба MQTT Auto Discovery специально настроена для нее. Ниже приведен код для реализации автоматического обнаружения MQTT в прошивке устройства:
Код реализации автоматического обнаружения MQTT C++:
void send_mqtt(верхняя часть строки, данные строки, нижний индекс строки){
// Объявляем объект Home Assistant [автоматическое обнаружение]
//Объявляем объект один раз при успешном подключении и запуске устройства
// if(!annonce_mqtt_discovery){
mqqt_d_annonce("CL1", "c1", "On1", "Off1");
mqqt_d_annonce("CL2", "c2", "On2", "Off2");
mqqt_d_annonce("CL3", "c3", "On3", "Off3");
анонс_mqtt_discovery = правда;
// }
// отправляем данные
client.publish(tops.c_str(), data.c_str());
client.subscribe(subscr.c_str());
}
void mqqt_d_annonce(строка namec, строка cn, строка on_d, строка off_d){
String top = String(settings.mqtt_topic) +"/jsondata";
Строковый элемент управления = String(settings.mqtt_topic) +"/control";
символ jsonBuffer[1024] = {0};
ДинамическийJsonDocumentchan1(1024);
chan1["имя"] = namec;
chan1["state_topic"] = верх;
chan1["command_topic"] = контроль;
chan1["payload_on"] = on_d;
chan1["payload_off"] = off_d;
chan1["state_value_template"] = "{{ value_json."+cn+" }}";
сериализоватьJson(chan1, jsonBuffer, sizeof(jsonBuffer));
String top_to = "homeassistant/light/"+cn+"/config";
client.publish(top_to.c_str(), jsonBuffer, true);
}
После успешного подключения устройства к сети и настройки MQTT-соединения объект нашего устройства появится в «Объектах» Home Assistant, и пользователю останется только настроить карточку объекта на панели управления для управления этим модулем; . Вот пример кода целевой карты:
Пример кода карточки объекта:
Тип: Горизонтальное штабелирование
Карта:
- отображаемое имя: правда
шоуикон: правда
Тип: кнопка
Нажмите действие:
Действие: переключить
сущность: Light.cl1
Название: Лампа 1
Статус отображения: правда
Продолжайте в действии:
Действие: Дополнительная информация
- отображаемое имя: правда
шоуикон: правда
Тип: кнопка
Нажмите действие:
Действие: переключить
сущность: Light.cl2
Название: Свет 2
Статус отображения: правда
Продолжайте в действии:
Действие: Дополнительная информация
- отображаемое имя: правда
шоуикон: правда
Тип: кнопка
Нажмите действие:
Действие: переключить
сущность: Light.cl3
Название: светодиод
Статус отображения: правда
Продолжайте в действии:
Действие: Дополнительная информация
В результате карточка объекта будет выглядеть так:
Я также должен упомянуть новейший сервис SSDP.
Этот сервис был реализован для того, чтобы как-то «командовать» всем зверинцем моих умных устройств.
SSDP (Simple Service Discovery Protocol) — это сетевой протокол, основанный на наборе интернет-протоколов, используемый для рекламы и обнаружения сетевых сервисов. SSDP позволяет обнаруживать службы, не требуя специальных механизмов статической настройки или операций сервера (таких как DHCP или DNS.
Для вашего удобства я написал мобильное приложение, которое позволяет обнаружить и настроить ваше устройство всего в три клика, без лишних хлопот и доступа к роутеру. Ниже приведен скриншот приложения, а ссылка на приложение будет размещена в конце статьи.
Приложения для поиска устройств в сети:
❯ Использование аппаратного выключателя
Чтобы не исключать классическую схему управления освещением с помощью обычных выключателей, обычно встраиваемых в стену, в устройстве предусмотрен также вход (J5) для подключения аппаратных выключателей. Данное решение позволяет интегрировать модуль в существующую систему освещения без дополнительных доработок.
❯ Итоги
Хорошо, давайте подведем итоги. Таким образом, мы получаем простое, но эффективное и относительно компактное устройство управления освещением, способное работать как в автономном режиме, так и в составе умного дома. Устройство в первую очередь разрабатывалось для управления светодиодным освещением, однако используемые силовые симисторы позволяют коммутировать осветительную нагрузку до 300 Вт на канал, не вызывая существенного нагрева силовых компонентов.
На этом мы можем закончить эту статью. Надеюсь, мой опыт будет вам полезен. Если у вас есть комментарии, предложения или вы хотите поделиться подобным опытом, оставьте комментарий! Если вам понравилась эта статья, пожалуйста, поддержите ее стрелкой вверх. Желаю Вам всего наилучшего и крепкого здоровья, и спасибо за внимание!
Ссылка на статью:
-
Дизайн печатной платы;
-
Исходный код прошивки устройства;
-
Модель корпуса оборудования;
-
Мобильное приложение для поиска устройств.
Написано специально для читателей Timeweb Cloud и Pikabu. Еще больше интересных статей и новостей смотрите в нашем блоге на Хабре и телеграм-канале.
Если вы хотите стать писателем (или уже известны) и хотите поделиться чем-то интересным в нашем блоге, напишите об этом здесь.
Облачный сервис Timeweb Cloud — рекомендуемая ссылка, которая может помочь поддержать проект автора.
📚 Читайте также:
-
Azure Stack HCI — что это такое, как его улучшить и использовать;
-
Каждая капля на счету, или как сделать счетчик умным;
-
Простое, но очень нужное устройство. Дверца холодильника открывается и подается сигнал.
Больше интересных статей здесь: Гаджеты.
Источник статьи: Мой умный свет: или как я разработал свой модуль управления освещением.