Вай фай переключатель своими руками

Управление светом по WiFi своими руками

За основу устройства была взята плата микроконтроллера ESP8266-01 с WiFi интерфейсом самая простая:

Для включения/отключения лампы мне понадобилось реле:

Для питания управляющей части мне понадобился блок питания на 5 вольт и стабилизатор напряжения на 3.3 вольта.

Большинство телефонных зарядок выдают напряжение 5 вольт, если не говорить про более современные. У меня была вот такая вот простая зарядка за 100 рублей.

Данную зарядку я разобрал. Вытащил внутренности из корпуса, убрал USB разъем.

Плата esp8255-01 имеет напряжение питания 3.3 вольта, но рядом с лампочкой только 220 вольт, поэтому здесь я использовал зарядку от телефона. А для получения 3,3 вольт из 5, использовал вот такой вот линейный стабилизатора напряжения:

На его выходе будет 3.3 вольта как раз для питания платы ESP32-01. Собирать все буду на самой обычной монтажной плате:

Подключение и сборка

220 вольт подается на блок питания, с его выхода получается 5 вольт, далее 5 вольт подается на входы питание реле (VCC и GND) и на стабилизатор напряжения, где на выходе получается 3,3 вольта, + поступает на контакты VCC и CH_EN, GND на GND ESP8266-01. На вход IN1 подключается выход ESP8266-01 GPIO0, для управления реле. Лампочку я подключил между фазой (L) и нормально разомкнутым контактом реле (NO). Контакт COM подключил на нейтральный провод (N), контакт NC остается свободным.

Все элементы спаял на монтажной плате, получилось вот так:

Источник

Ещё один Wi-Fi выключатель

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

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

  • Единая точка отказа т.к. вся логика на сервере;
  • Медленная скорость;
  • К каждому выключателю придется тянуть от 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([[print("Hello World!")]]) 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, не прибегая к грязному хаку.

Читайте также:  Карту wi fi от byfly

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

Один 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=[on,off,party] key='api_key'

"..msg.."

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

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

Читайте также:  Режим wi fi hotspot
Wi-Fi

Для подключения в качестве клиента хватит такого кода, ip получим по DHCP:

wifi.setmode(wifi.STATION) wifi.sta.config(c_wifi_ssid,c_wifi_key) wifi.sta.autoconnect(1) 

В третьем примере видно, как можно определить, подключилась точка или нет. Другие режимы wifi я не использовал, так что возможны подводные камни.

В целом, с небольшими хитростями (костылями) была написана логика простого выключателя. А кнопкой можно управлять прямо из консоли. Поставив программу BetterTouchTool, можно комбинацией клавиш «curl`ить» сервер выключателя. Нашлось применение кнопке EJECT.

Резюме

Нисколько не жалею, что выбрал nodeMCU: не пришлось залезать в дебри официального SDK. Не надо каждый раз компилировать код, а саму программу легко разбить на модули и заливать отдельными кусочками. За это пришлось поплатиться иногда непонятным поведением. Главное, что вся логика находится на самом выключателе, и он при недоступности wifi будет выполнять свою главную функцию, ну, только если сгорит. Самому проекту nodeMCU я желаю скорейшего развития и в дальнейшем попробую сделать что-нибудь ещё, благо остался еще один модуль.

Источник

Оцените статью
Adblock
detector