Интернет. Железо. Программы. Обзоры. Операционные системы
Поиск по сайту

Умный WiFi выключатель света. Устройство, принцип действия и подключение Wi-Fi выключателя Wi fi выключатель света управление через смартфон

  • Интернет вещей ,
  • DIY или Сделай сам
  • Доброго времени суток, уважаемый читатель.

    Немного лирики в начале. Идея «умного» выключателя света совсем не нова и, наверное, это первое, что приходит в голову тем, кто начал знакомство с платформой Arduino и элементами IoT. И я этому не исключение. Поэкспеременировав с элементами цепей, моторчиками и светодиодами хочется сделать нечто более прикладное, что востребовано в повседневной жизни и, самое главное, будет удобно в использовании, а не останется жертвой эксперимента в неугоду комфорту.

    В этой статье я расскажу, как я сделал выключатель, который будет работать как обычный (т.е. что обычно закреплен на стене) и в то же время позволит управлять им через WiFi (или через Интернет, как это сделано в данном случае).

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

    Так же мне понадобились: сервер, с помощью которого выключатель будет управляться через Интернет, Arduino Uno, с помощью которого я программировал ESP, роутер и расходные материалы как провода, клеммы и т.д., всё это может варироваться от вкусов и никак не повлияет на конечный результат.

    Цены взяты из Ebay, где я их и покупал.

    А вот как выглядят элементы из таблицы:

    Теперь можно составить и схему подключения:

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

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

    Изолента спасёт от удара током… надеюсь.

    А теперь поговорим о програмной части.

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

    Надеюсь, я когда нибудь все перепишу и связь будет основана на более быстром протоколе нежели HTTP, но для начала сойдет. Удаленно лампочка меняет свое состояние приблизительно за 1-1.5 секунды, а с выключателя моментально, как и подобает порядочному выключателю.

    Программировании ESP8266-01

    Самый простой способ сделать это - с помощью Arduino. Скачать необходимые библиотеки для Arduino IDE можно с GitHub . Там же все инструкции по установке и настройке.

    Далее нам нужно подключить ESP к компьютеру, для этого понадобится либо USB to Serial Адаптер (типа FTDi , CH340 , FT232RL) либо любая Arduino платформа (у меня была Arduino Uno) с выходами RX и TX.

    Стоит отметить, что ESP8266-01 питается от 3.3 Вольта, а значит ни в коем случае не подключайте его к питанию Arduino, которые (часто) питаются от 5 Вольт, напрямую иначе все сгорит к чертям. Можно использовать понижатель напряжения, который приведен в таблице выше.

    Схема подключения проста: подключаем TX , RX и GND ESP к RX, TX и GND адаптера/Arduino соотвественно. После этого, собственно, подключение готово к использованию. Микроконтроллер можно программировать используя Arduino IDE.

    Пара нюансов при использовании Arduino Uno:

    • На Uno есть выход для 3.3В, но его оказалось недостаточно. При подключении к нему ESP, все вроде работает, индикаторы горят, но связь с COM портом теряется. Поэтому я использовал другой источник питания на 3.3В для ESP.
    • К тому же у UNO не возникло никаких проблем при общении с ESP, с учетом того, что UNO питался от 5В, а ESP от 3В.
    После нескольких экспериментов с ESP8266-01, выяснилось, что ESP чувствительны к подключенным к GPIO0 и GPIO2 напряжениям. В момент старта они ни в коем случае не должны быть заземлены, если вы намереваетесь запустить его в штатном режиме. Более подробно о старте микроконтроллера . Я этого не знал и мне пришлось слегка менять схему, т.к. в версии ESP-01 присутсвтуют только эти 2 пина и в моей схеме используются оба.

    А вот и сама программа для ESP:

    Показать код

    #include #include #include #include #include extern "C" { // эта часть обязательна чтобы получить доступ к функции initVariant #include "user_interface.h" } const char* ssid = "WIFISSID"; // Имя WiFi const char* password = "***************"; // Пароль WiFi const String self_token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; // токен для минимальной безопасности связи const String serv_token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; // токен для минимальной безопасности связи const String name = "IOT_lamp"; // имя выключателя, читай лампочки const String serverIP = "192.168.1.111"; // внутренний IP WEB сервера bool lamp_on = false; bool can_toggle = false; int button_state; ESP8266WebServer server(80); // веб сервер HTTPClient http; // веб клиент const int lamp = 2; // Управляем реле через GPIO2 const int button = 0; // "Ловим" выключатель через GPIO0 // функция для пинга лампочки void handleRoot() { server.send(200, "text/plain", "Hello! I am " + name); } // функция для недействительных запросов void handleNotFound(){ String message = "not found"; server.send(404, "text/plain", message); } // Да будет свет void turnOnLamp(){ digitalWrite(lamp, LOW); lamp_on = true; } // Да будет тьма void turnOffLamp(){ digitalWrite(lamp, HIGH); lamp_on = false; } // Отправляем серверу события ручного вкл./выкл. void sendServer(bool state){ http.begin("http://"+serverIP+"/iapi/setstate"); String post = "token="+self_token+"&state="+(state?"on":"off"); // По токену сервер будет определять что это за устройство http.addHeader("Content-Type", "application/x-www-form-urlencoded"); int httpCode = http.POST(post); http.end(); } // Изменяем состояние лампы void toggleLamp(){ if(lamp_on == true) { turnOffLamp(); sendServer(false); } else { turnOnLamp(); sendServer(true); } } // Получаем от сервера команду включить void handleOn(){ String token = server.arg("token"); if(serv_token != token) { String message = "access denied"; server.send(401, "text/plain", message); return; } turnOnLamp(); String message = "success"; server.send(200, "text/plain", message); } // Получаем от сервера команду выключить void handleOff(){ String token = server.arg("token"); if(serv_token != token) { String message = "access denied"; server.send(401, "text/plain", message); return; } turnOffLamp(); String message = "success"; server.send(200, "text/plain", message); } // Устанавливаем MAC чтобы давать одинаковый IP void initVariant() { uint8_t mac = {0x00, 0xA3, 0xA0, 0x1C, 0x8C, 0x45}; wifi_set_macaddr(STATION_IF, &mac); } void setup(void){ pinMode(lamp, OUTPUT); pinMode(button, INPUT_PULLUP); // Важно сделать INPUT_PULLUP turnOffLamp(); WiFi.hostname(name); WiFi.begin(ssid, password); // Ждем пока подключимся к WiFi while (WiFi.status() != WL_CONNECTED) { delay(500); } // Назначем функции на запросы server.on("/", handleRoot); server.on("/on", HTTP_POST, handleOn); server.on("/off", HTTP_POST, handleOff); server.onNotFound(handleNotFound); // Стартуем сервер server.begin(); } void loop(void){ server.handleClient(); // Проверяем нажатие выключателя button_state = digitalRead(button); if (button_state == HIGH && can_toggle) { toggleLamp(); can_toggle = false; delay(500); } else if(button_state == LOW){ can_toggle = true; } }


    Пару замечаний по коду:
    • Очень важно объявить пин GPIO0 как pinMode(button, INPUT_PULLUP ), т.к. в схеме мы не используем резистор для этой кнопки. А у ESP есть свои «вшитые» для этих самых целей.
    • При отлове состояния кнопки желательно установить задержку при считывании чтобы избежать ложного срабатывания в момент нажатия.

    Программировании WEB сервера

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

    Я использовал для этих целей

    Доброго времени суток, уважаемый читатель.

    Немного лирики в начале. Идея «умного» выключателя света совсем не нова и, наверное, это первое, что приходит в голову тем, кто начал знакомство с платформой Arduino и элементами IoT. И я этому не исключение. Поэкспеременировав с элементами цепей, моторчиками и светодиодами хочется сделать нечто более прикладное, что востребовано в повседневной жизни и, самое главное, будет удобно в использовании, а не останется жертвой эксперимента в неугоду комфорту.

    В этой статье я расскажу, как я сделал выключатель, который будет работать как обычный (т.е. что обычно закреплен на стене) и в то же время позволит управлять им через WiFi (или через Интернет, как это сделано в данном случае).

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

    Так же мне понадобились: сервер, с помощью которого выключатель будет управляться через Интернет, Arduino Uno, с помощью которого я программировал ESP, роутер и расходные материалы как провода, клеммы и т.д., всё это может варироваться от вкусов и никак не повлияет на конечный результат.

    Цены взяты из Ebay, где я их и покупал.

    А вот как выглядят элементы из таблицы:

    Теперь можно составить и схему подключения:

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

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

    Изолента спасёт от удара током… надеюсь.

    А теперь поговорим о програмной части.

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

    Надеюсь, я когда нибудь все перепишу и связь будет основана на более быстром протоколе нежели HTTP, но для начала сойдет. Удаленно лампочка меняет свое состояние приблизительно за 1-1.5 секунды, а с выключателя моментально, как и подобает порядочному выключателю.

    Программировании ESP8266-01

    Самый простой способ сделать это - с помощью Arduino. Скачать необходимые библиотеки для Arduino IDE можно с GitHub . Там же все инструкции по установке и настройке.

    Далее нам нужно подключить ESP к компьютеру, для этого понадобится либо USB to Serial Адаптер (типа FTDi , CH340 , FT232RL) либо любая Arduino платформа (у меня была Arduino Uno) с выходами RX и TX.

    Стоит отметить, что ESP8266-01 питается от 3.3 Вольта, а значит ни в коем случае не подключайте его к питанию Arduino, которые (часто) питаются от 5 Вольт, напрямую иначе все сгорит к чертям. Можно использовать понижатель напряжения, который приведен в таблице выше.

    Схема подключения проста: подключаем TX , RX и GND ESP к RX, TX и GND адаптера/Arduino соотвественно. После этого, собственно, подключение готово к использованию. Микроконтроллер можно программировать используя Arduino IDE.

    Пара нюансов при использовании Arduino Uno:

    • На Uno есть выход для 3.3В, но его оказалось недостаточно. При подключении к нему ESP, все вроде работает, индикаторы горят, но связь с COM портом теряется. Поэтому я использовал другой источник питания на 3.3В для ESP.
    • К тому же у UNO не возникло никаких проблем при общении с ESP, с учетом того, что UNO питался от 5В, а ESP от 3В.
    После нескольких экспериментов с ESP8266-01, выяснилось, что ESP чувствительны к подключенным к GPIO0 и GPIO2 напряжениям. В момент старта они ни в коем случае не должны быть заземлены, если вы намереваетесь запустить его в штатном режиме. Более подробно о старте микроконтроллера . Я этого не знал и мне пришлось слегка менять схему, т.к. в версии ESP-01 присутсвтуют только эти 2 пина и в моей схеме используются оба.

    А вот и сама программа для ESP:

    Показать код

    #include #include #include #include #include extern "C" { // эта часть обязательна чтобы получить доступ к функции initVariant #include "user_interface.h" } const char* ssid = "WIFISSID"; // Имя WiFi const char* password = "***************"; // Пароль WiFi const String self_token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; // токен для минимальной безопасности связи const String serv_token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; // токен для минимальной безопасности связи const String name = "IOT_lamp"; // имя выключателя, читай лампочки const String serverIP = "192.168.1.111"; // внутренний IP WEB сервера bool lamp_on = false; bool can_toggle = false; int button_state; ESP8266WebServer server(80); // веб сервер HTTPClient http; // веб клиент const int lamp = 2; // Управляем реле через GPIO2 const int button = 0; // "Ловим" выключатель через GPIO0 // функция для пинга лампочки void handleRoot() { server.send(200, "text/plain", "Hello! I am " + name); } // функция для недействительных запросов void handleNotFound(){ String message = "not found"; server.send(404, "text/plain", message); } // Да будет свет void turnOnLamp(){ digitalWrite(lamp, LOW); lamp_on = true; } // Да будет тьма void turnOffLamp(){ digitalWrite(lamp, HIGH); lamp_on = false; } // Отправляем серверу события ручного вкл./выкл. void sendServer(bool state){ http.begin("http://"+serverIP+"/iapi/setstate"); String post = "token="+self_token+"&state="+(state?"on":"off"); // По токену сервер будет определять что это за устройство http.addHeader("Content-Type", "application/x-www-form-urlencoded"); int httpCode = http.POST(post); http.end(); } // Изменяем состояние лампы void toggleLamp(){ if(lamp_on == true) { turnOffLamp(); sendServer(false); } else { turnOnLamp(); sendServer(true); } } // Получаем от сервера команду включить void handleOn(){ String token = server.arg("token"); if(serv_token != token) { String message = "access denied"; server.send(401, "text/plain", message); return; } turnOnLamp(); String message = "success"; server.send(200, "text/plain", message); } // Получаем от сервера команду выключить void handleOff(){ String token = server.arg("token"); if(serv_token != token) { String message = "access denied"; server.send(401, "text/plain", message); return; } turnOffLamp(); String message = "success"; server.send(200, "text/plain", message); } // Устанавливаем MAC чтобы давать одинаковый IP void initVariant() { uint8_t mac = {0x00, 0xA3, 0xA0, 0x1C, 0x8C, 0x45}; wifi_set_macaddr(STATION_IF, &mac); } void setup(void){ pinMode(lamp, OUTPUT); pinMode(button, INPUT_PULLUP); // Важно сделать INPUT_PULLUP turnOffLamp(); WiFi.hostname(name); WiFi.begin(ssid, password); // Ждем пока подключимся к WiFi while (WiFi.status() != WL_CONNECTED) { delay(500); } // Назначем функции на запросы server.on("/", handleRoot); server.on("/on", HTTP_POST, handleOn); server.on("/off", HTTP_POST, handleOff); server.onNotFound(handleNotFound); // Стартуем сервер server.begin(); } void loop(void){ server.handleClient(); // Проверяем нажатие выключателя button_state = digitalRead(button); if (button_state == HIGH && can_toggle) { toggleLamp(); can_toggle = false; delay(500); } else if(button_state == LOW){ can_toggle = true; } }


    Пару замечаний по коду:
    • Очень важно объявить пин GPIO0 как pinMode(button, INPUT_PULLUP ), т.к. в схеме мы не используем резистор для этой кнопки. А у ESP есть свои «вшитые» для этих самых целей.
    • При отлове состояния кнопки желательно установить задержку при считывании чтобы избежать ложного срабатывания в момент нажатия.

    Программировании WEB сервера

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

    Я использовал для этих целей

    Я давно хотел автоматизировать процесс просушки ванной комнаты после купания. У меня было много обзоров, посвящённых теме влажности. Кстати, зимой в ванной и бельё сушим. Но пока ещё не решил, что именно внедрить в жизнь. Опишу ещё одно китайское чудо для борьбы с этим злом.

    Летом бельё сушим на балконе, зимой – в ванной комнате, достаточно вытяжной вентилятор включить. Но следить за вентилятором не всегда сподручно. Вот и решил поставить автоматику на это дело. Первый опыт внедрения оказался неудачный. Обзор был. Но я не сдался… Второй опыт более удачный, обзор тоже делал. Но в жизнь внедрить не успел. Частые командировки отнимают много времени.
    Но такого подарка я не ожидал вовсе. Увидел в личке письмо с предложением сделать обзор на произведение Itead Studio. Глупо отказываться от товара на обзор, если это интересно (а уж тем более нужно) самому. Сразу после «полистал» Муську. Нашёл, как минимум, три обзора про изделия Sonoff. Я не первый:(Представляю, сколько будет голосов в комментах по поводу бесплатной печенюшки. Но плевать в спину – это удел слабых и неудачников. Поэтому этот обзор для тех, кто считает себя дееспособным.
    Вот так выглядит корзина с моим выбором:


    Но я допустил небольшую оплошность, не обратил внимание на текст на картинке (на красном фоне). Выключатель пришёл без пульта:(Это дополнительная опция, его надо покупать отдельно
    Заказ пришёл в маленькой коробочке.


    Модуль TH16 был без упаковки.

    Остальное в коробочках. Но никаких инструкций не было. Это всё, что я заказал.
    Человек я достаточно ленивый. Единственное, что может меня заставить что-то сделать – это обязательство перед кем-то. Говорят, что лень – двигатель прогресса. Мой двигатель – это обещание, данное кому-то. Таким образом, я убил сразу двух зайцев: написал обзор и разобрался с этими волшебными выключателями/включателями.
    Немного напомню свою историю.
    Когда въехал в новую квартиру, почти сразу поставил в вытяжку вентилятор с обратным клапаном. Вентилятор необходим, чтобы просушивать ванную комнату после купания. Обратный клапан нужен для предотвращения попадания в квартиру посторонних запахов от соседей (когда вентилятор молчит). И такое бывает. Вентканалы у всех индивидуальные, но цемент при кладке видно экономили. Сквозь щели, вероятно, запах и проходит.
    Вентиляторы у меня есть различных вариантов. Есть простые, есть с таймером (регулировкой временнОго интервала), как на фото.


    Именно таким и пользовался до сего дня.
    Так как живу в многоквартирном «муравейнике», то единственное место для сушки белья – это балкон. В ванной может и затухнуть. Для сушки необходима либо низкая влажность, либо циркуляция воздуха. Выполнение обоих условий – лучший вариант. Вентилятор должен был решить эту проблему. Поначалу именно так и делал. Главное не забыть его выключить. Во время работы вентилятора необходимо приоткрывать малость окошко. Про школьную задачку с бассейном и двумя трубами напоминать не надо? Чтобы воздух выходил в вытяжку, необходимо, чтобы он откуда-то входил в квартиру. У кого окна деревянные, а не пластиковые, проблем не будет. Щелей хватит. А вот с пластиковыми квартира превращается в террариум.
    Тут я и задумался об автоматизации процесса…
    Печальным опытом реализации своей идеи я уже делился. Вот тот модуль. Он работать не может в ПРИНЦИПЕ.


    Схему модуля я тоже рисовал.


    В основе схемы лежит компаратор на LM393. С виду всё должно работать. Но есть одно но. Датчик необычный. Он меняет своё сопротивление по отношению к частоте. Чтобы снять показания, необходимо подать на него частоту (нормируемая величина 1кГц). Вот такая печаль.
    На одном из сайтов было три коммента от одного пользователя по этому поводу:

    Странно, это же стандартный датчик из ардуиновской периферии - должно работать.
    Проверить пока нечем - не особо интересует влажность, потому пока у меня такого датчика нет. :)
    Закажу при случае и отпишусь…
    …У меня нет ни одного ардуиновского модуля который бы не работал.
    Куплю на пробу, может и себе сделаю метеостанцию…
    …думаете это делали бы если они были нерабочие?
    Прошёл год…
    Видимо, и не дождусь.
    Перехожу к посылке.
    Страница магазина с модулем TH выглядит так:

    На ней можно выбрать модули Sonoff TH в зависимости от тока реле, а также модули влажности и температуры. Что именно выбрал я, вы видите. Модуль влажности в отдельной продаже на странице магазина я не нашёл (возможно, плохо искал). Поэтому при заказе будьте внимательны…


    Никакой инструкции тоже не было (уже писал).
    В магазине есть страничка помощи wiki:

    Там есть всё, даже схема:

    Размером небольшой.


    Взвесил, 79г.


    Начинаю разбор.
    Сюда подключаются сетевые провода 220В.


    Контакторы пружинные, очень тугие. Но, по мне, с винтом надёжнее.
    Корпус держится на защёлках.


    Всё по уму. Замечаний не имею.
    Открутил 4 самореза.


    Wi-Fi узел построен на ESP8266 (кто бы сомневался). Для асов целое поле для деятельности. Главное, чтоб голова работала. Остальное уже всё сделано. Не надо городить отдельное питание модуля, искать коробочку тоже не надо. Всё в сборе и работает.




    Плата промыта. Следов флюса нет. По входу стоит предохранитель и варистор 10D471K от перенапряжения (расшифровка - диаметр 10 мм, напряжение 470 Вольт).

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

    Модуль непривычно крупный.

    Подключается посредством разъёма, как у наушников.


    Получается таким образом.


    Всё основное написано на корпусе.


    В магазине есть страничка помощи wiki (уже писал):
    - Temperature and humidity module
    AM2301 Product Manual
    На датчик температуры тоже есть мануал:
    - DS18B20 - Programmable Resolution 1-Wire® Digital Thermometer
    Его я не заказывал. Он мне не интересен. Плюс ко всему прочему AM2301 более универсален. В нём есть и датчик температуры и датчик влажности. Более того, в корпусе TH10/16 только одно отверстие под выносной модуль.
    Разбираю AM2301. Корпус на четырёх защёлках.


    С одной стороны модуля датчик температуры, влажности и кварц.


    Основная схема на обратной стороне.

    Этот модуль я тоже собираю.
    И, наконец, smart-переключатель Sonoff RF.



    Тоже никакой инструкции. Размером ещё меньше, чем Sonoff TH.


    Взвесил: 49г.



    Для меня особого интереса не представляет. Но что внутри, покажу.

    Корпус тоже на защёлках. Последовательность разбора вы видите.
    Контакторы под винт. По мне, очень удобно.


    По входу стоит варистор 10D471K от перенапряжения (расшифровка - диаметр 10 мм, напряжение 470 Вольт), как и в модуле ТН.


    Узел питания с гальванической развязкой от сети. Даже пропилы в плате сделали.
    Плата промыта. Следов флюса нет.


    Всё по уму. И здесь замечаний не имею.
    И здесь WiFi узел построен на ESP8266.


    Радиомодуль в виде отдельной платы.


    Всё собираю в исходное.
    Пора переходить к делу.
    Собираю тренировочную схему. Модуль Sonoff TH подключаю к сети. Подключение не для всех очевидное. Поэтому смотрим картинку на странице магазина.

    По такой схеме у нас работает мало приборов. Поэтому на «лишние» провода я поставил красный крестик.
    На выход подвешиваю вентилятор.
    С Sonoff RF намного проще. На выход подключаю обыкновенную лампочку для контроля.


    Осталось всё это дело связать со смартфоном.
    Smart-переключатели поддерживает удалённое управление по Wi-Fi, но только через облако:(
    Пришло время привязать их к управляющему приложению eWeLink. Для этого его необходимо сначала скачать:) Устанавливаем, регистрируемся…
    Учётная запись создана.
    Сначала подключаю Sonoff TH. Запускаю приложение и следую инструкциям.
    Чтобы добавить устройство нажимаю на плюсик. Далее нажимаем на беленькую кнопочку и удерживаю около 5 секунд. Синий светодиод должен равномерно замигать. Именно равномерно! Он может «войти в транс»:) и начать подавать непонятные сигналы. В этом случае нажимаем и удерживаем снова.


    Приложение просит ввести пароль от Wi-Fi. Затем выполняется поиск устройств.
    Необходимо будет ввести имя нового устройства.
    Последовательность картинок смотрите на фото (слева направо, сверху вниз).


    Выключатель «привязан» к моему аккаунту.
    Аналогично с Sonoff RF. После привязки картинка на смартфоне выглядит так. Можно включать и выключать нагрузку, нажимая на кнопочки. Три картинки: выключен, включен и не подключен к 220В (офлайн)


    Для того, чтобы включить переключатель, нужно нажать кнопку на вашем виртуальном пульте из любой точки мира, где есть интернет и Wi-Fi.
    При подключении к сети 220В на модуле загорается синий светодиод. При включении нагрузки дополнительно загорается красный светодиод.


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


    А уж в настройках ставлю то, что нужно.
    Поясню картинки. Сейчас 55% влажности и температура 18˚С (выносной модуль на подоконнике). Переключатель выключен. При этом температура и влажность отслеживается онлайн, независимо от того в каком режиме работает переключатель (ручной или авто).
    Поясню то, что я задал.
    При достижении влажности 65% переключатель включится (вентилятор). При достижении влажности 60% - выключится. Можно и наоборот сделать (для увлажнителя).


    Это для тех, у кого очень низкая влажность зимой.
    При достижении влажности 30% переключатель включится (режим увлажнитель). При достижении влажности 40% - выключится.
    Все уставки согласно ГОСТ 30494-96 «Здания жилые и общественные».


    Обратите внимание на оптимальную влажность зимой. Это вовсе не 60% как многие думают! 60% - всего лишь допустимая, выше нельзя, необходимо уже бороться. ОПТИМАЛЬНАЯ 30-45%
    Можно управлять переключателем по таймеру. Их два варианта.


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

    Немного про smart-переключатель Sonoff RF.
    Отличается от Sonoff TH тем, что имеет радиомодуль (может управляться с помощью пульта, которого у меня нет). Также у него нет возможности работать с датчиком влажности и температуры. Остальное одинаково: управление по Wi-Fi с возможностью установки таймера.
    Виртуальный пульт немного отличается.


    В автоматическом режиме тоже (как у ТН) два вида таймеров.


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

    При установке приложения на несколько телефонов управлять можно со всех, но только если на каждом из них выполнить вход в eWeLink под одним логином и паролем.
    В конце подведу небольшой итог.
    Smart-переключатели поддерживает удалённое управление по Wi-Fi, но только через облако:(Необходимо их привязывать к управляющему приложению eWeLink. А если какой-нибудь добрый дядя Ляо захочет управлять вашим умным домом? Для тех, кто ему не доверяет, придётся создать свой MQTT сервер, и включать/выключать нагрузку по своему желанию и правилам. Для тех, кто владеет навыками программирования, это не сложно. Для тех, кто спокойно относится к подобной проблеме – просто подключайте и пользуйтесь. Мне, например, всё-равно при управлении вентилятором в ванной комнате. Но когда время дойдёт до полноценного «Умного дома», буду что-то думать.
    На этом всё.
    Эти модули идеально подойдут для работы с вентилятором, кондиционером, увлажнителем воздуха. Можно организовать умную систему полива на даче. Даже газовым котлом можно управлять по времени и по заданной температуре в комнате.
    Как правильно распорядиться сведениями из моего обзора каждый решает сам. Кому что-то неясно, задавайте вопросы. Надеюсь, хоть кому-то помог. Возможно, кто-то захочет помочь мне. Я буду очень благодарен.

    Удачи всем!
    Проверка на работоспособность и потрошка:

    Товар предоставлен для написания обзора магазином. Обзор опубликован в соответствии с п.18 Правил сайта.


    Данная статья будет посвящена ESP8266 Wi-Fi модулю, языку программирования LUA и прошивке nodeMCU . SDK от производителя рассматриваться не будет.

    Примерно года три назад я пробовал реализовать выключатель по 1-wire шине. Как все работало мне очень не понравилось.

    • Единая точка отказа т.к. вся логика на сервере;
    • Медленная скорость;
    • К каждому выключателю придется тянуть от 2х проводов(идеально «витуху»).

    В следствии чего все это было удачно заброшено, другие беспроводные решения рассматривались, но были исключены в виду дороговизны, небезопасного протокола и сложности реализации. Хотелось чего то простого с минимумом компонентов, со своей логикой и дешёвого. Не давно заказал 2 штуки esp8266 просто для забавы, не зная, чего конкретного с ними можно сделать. После 2-х вечеров разборок с чипом вспомнил незавершённое дело с кнопкой и решил довести до логического конца.

    На данный модуль уже существует некоторое количество прошивок, так же вы можете писать прошивку под себя, используя SDK, но не стал вникать в подробности написания, т.к. после изучения API nodeMCU понял, что данного функционала мне хватает с запасом и прошил оба модуля.

    Железо

    Себестоимость важный фактор для простого выключателя, так что пытался использовать как можно меньше частей. Решил сделать из того что было дома, но пришлось купить твердотельное реле. Кстати, «релюшка» стоит дороже wifi модуля и ее можно заменить на оптопару, симистор и обвязку, схемы включения легко ищутся в интернете. Был случай, когда плохой контакт в патроне лампочки выбил симистор на коротко. Посмотрим, как покажет себя оптореле, ведь раньше с ними не работал. Стоит учесть для большой нагрузки установка радиатора обязательна.

    Тут сразу столкнулся с проблемой, если на gpio при включении он уходил на землю, плата переходила или в режим прошивки или в непонятный режим, т.к кнопка у нас нормально разомкнута, с ней переделывать нечего не стал и так и оставил замыкаться на землю, а оптореле повесил на плюс через резистор и включал подачей 0, выключал подачей 1, соответственно. В итоге получилась такая схема:


    Внимание схему стоит улучшить! Выход на реле стоит подать через транзистор, а кнопку подтянуть через резистор от плюса. Ингредиенты получились такие:

    • выключатель;
    • пружинка(для переделки выключателя в кнопку);
    • сам esp8266;
    • твердотельное реле использовал(S202T02);
    • платка для конструирования;
    • резистор 470 Ом;
    • провода;
    • разъемы по вкусу;
    • зарядка от телефона 400мА 5v;
    • стабилизатор 1117 3.3v;
    • пара конденсаторов.

    Переделка выключателя не заняла много времени, выкинул стандартный светодиод. Протянул провода от модуля в центре выключателя, сам модуль расположил снаружи под пластмассовой кнопкой, а силовая часть внутри. Не много фотографий процесса (фото с телефона):

    nodeMCU

    Прошивка использует Lua язык программирования, данный язык похож чем то на Javascript. Версия ещё сыроватая, но уже базовый функционал вполне не плохо реализован. Сразу после загрузки модуль начинает исполнять файл скрипт init.lua , в чистой прошивке этого файла нет, вам приходиться его создать руками. Все операции можно осуществлять через консоль подключенным к «com» порту, для упрощения заливки файлов в модуль есть скрипт luatool . Заливка работает следующим образом и данный код полностью показывает процесс записи в файл.

    File.open("init.lua","w") file.writeline([]) file.writeline([[--comment]]) file.close()

    Пример чтения конфигурационного файла. Выглядит не очень. Может есть и другой вариант сериализованных данных.

    File.open("config") c_wifi_ssid = string.gsub(file.readline(), "n", "") c_wifi_key = file.readline() file.close()

    Пример цикла с использованием API с паузой в 1000 миллисекунд представлен ниже:

    Tmr.alarm(1000, 1, function() if wifi.sta.getip()=="0.0.0.0" then --текущий ip print("connecting to AP..."..c_wifi_ssid.."/"..c_wifi_key) else print("ip: ",wifi.sta.getip()) tmr.stop() -- alarm stop end end)

    Работа с GPIO

    Если у вас модель модуля ESP-01 новой ревизии, то вам доступно всего 2 gpio, не прибегая к грязному хаку.


    Решил отказаться от такого хака и воспользоваться тем, что есть.

    Один gpio кнопка и второй выход на твердотельное реле. Есть еще Tx, но заставить работать как gpio у меня не получилось, и для индикации я просто передаю сообщения в консоль print() . Пока закостылил именно так. Чем длиннее сообщение, тем дольше и ярче вспыхивает светодиод. Владельцы данной модификации пролетают лесом и с такими функциями как (node.key, node.led), т.к. они могут использовать только GPIO16, который тоже не разведен на плате.

    Все gpio могут работать в нескольких режимах (OUTPUT, INPUT, INT), но интересно то, что функция gpio.read() , прежде чем считать, подает низкий уровень, даже если установлен режим OUTPUT. То есть, чтобы получить текущее состояние выхода, это не подходит. Пришлось использовать внешнюю переменную и писать две функции для удобства, а уже через переменную определять активность.

    Function on() gpio.write(8,gpio.LOW) oo=1 end function off() gpio.write(8,gpio.HIGH) oo=0 end

    В качестве событий можно использовать callback gpio.trig(pin, type, function(level)) , второй параметр может принимать следующие значения «up», «down», «both», «low», «high». Тут, кажется, все ясно. Если у вас вывод находится в состоянии 1 и мы его опускаем на землю, срабатывает down, потом при поднятии срабатывает up, но, к моему сожалению, такого не происходило, в консоли я видел только down в зависимости от скорости нажатия кнопки событие срабатывало 1 или 2 раза. Решил поставить цикл с паузой и бряк по 1 на gpio.

    For i=1,1000 do print(i) tmr.delay(10) tmr.wdclr() -- сбрасывает счетчик и предотвращая авто перезагрузку end

    Но пауза не отработала, а без паузы устройство уходило в перезагрузку. Зато print(i) вносил хорошую задержку. Сделал через tmr.alarm , но в текущий момент активный цикл может быть только один, что не очень подходит.

    Function down() tmr.alarm(100, 1, function() timer = timer + 1 -- ok if gpio.read(9) == 1 then print(timer) tmr.stop() if timer < 20 then switch() else -- ... end timer = 0 end tmr.wdclr() end) end gpio.trig(9, "down", function (gp) if timer == 0 then timer = 1 down() end end)

    HTTP сервер

    Сервер запускается как 2 пальца, но никакого массива параметров запроса не получите. Пока непонятно, как оптимальнее: или писать свой велосипед, или find по подстроке. Согласитесь, выглядит ужасно. В данном примере ищется 2 параметра key и mode=off,on,party. Последний режим – это простое мигание лампочкой каждые 200мс, можно поставить и побыстрее, но побоялся за лампочку и отпореле.

    Function HTTPd() print("start http serv") srv=net.createServer(net.TCP, 5) srv:listen(80,function(conn) conn:on("receive",function(conn,payload) print(payload) if string.find(payload, "key="..c_api_key) then msg = "key_ok" if string.find(payload,"mode=on") then on() else if string.find(payload,"mode=off") then tmr.stop() off() else if string.find(payload, "mode=party") then party(200) end end end else msg = "error_key" end conn:send("

    mode= key="api_key"

    ") end) conn:on("sent",function(conn) conn:close() end) end) end

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