пятница, 12 сентября 2014 г.

Wi-Fi лампа. Контроль DIO модуля ESP-01 (ESP8266) по Wi-Fi

Несомненно возможности чипа ESP8266 не ограничиваются одним лишь считыванием показаний АЦП, состояний дискретных входов и работой с UART, тот же прозрачный UART мост over WLAN (для удаленной перепрошивки, к примеру). Самое простое и очевидное применение - контроль дискретных выходов, например через твердотельное реле можно управлять лампой, телевизором, тюнером и т.д. В продолжении наших материалов 1 2 3, под катом примитивный проект такого контроля по Wi-Fi на Lua...

Для контроля на выход мы решили использовать GPIO0 модуля ESP8266. Но у него есть особенность, что при подтяжке его на землю при включении питания чип переводится в режим программирования (активируется бутлоадер). Поэтому, для избежания подобного конфуза, нагрузку (оптрон, оптореле) следует включить между выходом GPIO0 (регистр 3) и плюсом питания через токоограничивающее сопротивление порядка 150 Ом, а саму логику управления сделать инверсной. Реализация подобного подхода представлена в Lua-cкриптах 'lamp.lua' и 'httpsender.lua'.

Скрипт 'lamp.lua':
-- POWER SAT Tuner
srv=net.createServer(net.TCP,5) 
srv:listen(80,function(conn) 
conn:on("receive", function(client,request)       
local buf = "";
local sel_msg= " selected=true";
local _on1,_off1="","";
local head = "HTTP/1.1 200 OK\n\n<!DOCTYPE HTML>\n<html>\n<head></head>\n<body>\n";
local _, _, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP");
if(method == nil)then 
_, _, method, path = string.find(request, "([A-Z]+) (.+) HTTP");
end
local _GET = {}      
if (vars ~= nil)then 
for k, v in string.gmatch(vars, "(%w+)=(_*-*%w+_*-*%w*)&*") do 
_GET[k] = v 
end 
end
buf = head;
buf = buf.."<h1>SAT TUNER</h1>\n";
buf = buf.."<h3>RAM: "..node.heap().."b</h3>\n";
t=gpio.read(tpin)
r=gpio.read(dpin)
buf = buf.."<h3>GPIO0 ("..r..") / GPIO2 ("..t..")</h3>\n";

--POWER    
buf = buf.."<form src=\"/\">POWER <select name=\"pin1\" onchange=\"form.submit()\">";
if(_GET.pin1~=nil)then  
if(_GET.pin1 == "ON")then
gpio.write(dpin, gpio.LOW);
elseif(_GET.pin1 == "OFF")then
gpio.write(dpin, gpio.HIGH);
end
end        
if(gpio.read(dpin) == 0)then _on1=sel_msg; else _off1=sel_msg; end
buf = buf.."<option".._on1..">ON</option><option".._off1..">OFF</option></select></form>\n";

--SETTINGS
buf = buf.."<form src=\"/\"><br><button type=\"submit\" name=\"set\" value=\"RST\">Reset WiFi</button></form>\n";
buf=buf.."</body></html>";
client:send(buf);
client:close();
collectgarbage();
if(_GET.set == "RST")then 
node.restart();   
end 
end)
end)
Скрипт 'httpsender.lua' реализует первичную настройку и подтяжку DIO, подгрузку HTTP-сервера контроля GPIO0 пользователем из браузера и минутный таймер в котором производится чтение двух DIO - GPIO0 и GPIO2, проверка подключения к домашней точке доступа с выходом в Интернет и отправка состояний DIO на сервис архивации и отрисовки трендов api.thingspeak.com:
dofile("lamp.lua")

function sendData()
t=gpio.read(tpin)
r=gpio.read(dpin)
print("Temp:"..t.." C\n")

if wifi.sta.getip()== nil then
print("IP unavaiable, Waiting...")
else
-- conection to thingspeak.com
print("Sending data to thingspeak.com")
conn=net.createConnection(net.TCP, 0) 
conn:on("receive", function(conn, payload) print(payload) end)
-- api.thingspeak.com
conn:connect(80,'184.106.153.149') 
conn:send("GET /update?key=APIKEY&field1="..t.."&field2="..r.." HTTP/1.1\r\n") 
conn:send("Host: api.thingspeak.com\r\n") 
conn:send("Accept: */*\r\n") 
conn:send("User-Agent: Mozilla/4.0 (compatible; esp8266 Lua; Windows NT 5.1)\r\n")
conn:send("\r\n")
conn:on("sent",function(conn)
print("Closing connect")
conn:close()
-- print("Sleep 40 sec down...")
-- node.dsleep(COUNTSLEEP)
end)
conn:on("disconnection", function(conn)
print("Disconnect...")
end)
end
end

-- send data every 60000 ms to thing speak
tmr.alarm(0, 60000, 1, function()
sendData() 
end) 
Общий скрипт, осуществляющий авторан 'init.lua' по классике - настраиваем подключение клиентом к существующей точке доступа с заданным SSID и паролем доступа и по таймеру раз в две секунды проверяем подключение на основе получения IP адреса от DHCP сервера точки доступа. Если IP адрес получен, останавливаем таймер и вызываем основной Lua-скрипт 'httpsender.lua':
-- registr = 3, pin - GPIO0 na plus optron cherez 1 kOm
dpin=3
gpio.mode(dpin, gpio.OUTPUT);
gpio.write(dpin, gpio.HIGH);
-- GPIO2 (используем для настройки, подтянут к 1)
tpin=4
gpio.mode(tpin,gpio.INPUT,gpio.PULLUP)
-- sleep us = 40 sec
COUNTSLEEP = 40000000

print("Setting up Wi-Fi...")
wifi.setmode(wifi.STATION)
wifi.sta.config("SSID1","passwords")
wifi.sta.connect()
local cnt=0

tmr.alarm(1, 1000, 1, function()
if wifi.sta.getip()==nil then
print("IP unavaiable, Waiting...")
cnt = cnt + 1
if (cnt > 30) then
tmr.stop(1)
cnt=0

print("Soft AP started")
wifi.setmode(wifi.SOFTAP)
wifi.ap.config({ssid="SSID2",pwd="passwords"})
print('IP:',wifi.ap.getip())
print('MAC: ',wifi.ap.getmac())
dofile("lamp.lua")
collectgarbage()
end
else
tmr.stop(1)
print("Config done, IP is "..wifi.sta.getip())
dofile("httpsender.lua")
end
end)
При первом подключении модуль пытается присоединиться к точке доступа в течении 30 секунд, при неуспешной попытке поднимает свою программную точку доступа и запускает сервер контроля нагрузки. При успешном подключении к точке доступа, производится запуск сервера контроля нагрузки и клиента отправки данных на удаленный тренд в Интернете.

Результат работы:


 

Видео контроля из браузера смартфона:


Проекты на базе ESP8266
  1. Прозрачный мост UART/Wi-Fi --- Wi-Fi/UART на базе ESP8266 на Lua 
  2. Wi-Fi лампа. Контроль DIO модуля ESP-01 (ESP8266) по Wi-Fi  
  3. Монтаж мезонином прозрачного моста Wi-Fi-UART на ESP8266
  4. Автономный датчик температуры по Wi-Fi на базе ESP8266
  5. Аномальная разрядная кривая ионисторов проекта "вечный" Wi-Fi логгер. Луна однако
  6. Работа "вечного" Wi-Fi логгера на солнечную панель из... аморфного кремния 
  7. #ESP.Meteo: Wi-Fi логгер с автономным питанием в Twitter-e  
  8. Вывод отладочной информации с ESP-12 на дисплей SSD1306

Комментариев нет:

Отправить комментарий

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