|
本帖最后由 快乐起航2012 于 2016-6-4 11:51 编辑
用NodeMCU(ESP8266)打造超级实用的智能插排 很少写东东,因为确实很繁琐,总是无偿使用别人的成果,今天也贡献一些,希望能给人提供一些帮助。 买了很多智能插座,但是总和期望相差不少,由于智能家居技术发展很快,现成的产品功能有限,开发不完善,利用率很低,各个公司间壁垒严重,开发进度缓慢,在苦苦煎熬中等待的升级往往也是失望,作为极客一族,看来还是自己动手做一个吧! 1、方案 NodeMCU(ESP8266)+智能插排 选NodeMCU的理由是它足够便宜,另一个就是开源,这样就不会有人为的障碍阻挡你的脚步了,站在巨人的肩膀上,让花费的时间更有意义。
选择这款插排改造,是因为它本身外形美观,也很实用,加上了wifi可谓锦上添花,价值堪比市场上的几百元的产品,不用单个插座的理由是都上了这么多电路了,只控制一路岂不可惜,选择它还有一个重要原因是它内部有足够的空间去安装wifi控制电路,我们不能总停留在一堆零件上吧,改装完我们会获得这样一个美观实用、功能超强的智能插排!
插排内部图,绿色方框空出的位置正好可以安装NodeMcu和继电器板。
2 、电路原理
是不是很简单,是因为前人已经做了很多工作了。准备好部件,先在插排内摆放好位置,接好线,其中5V电源连接到插排的USB供电电源上(原单片机供电电源功率可能偏小),12V电源连接到插排原12V电源上,切断原5V到USB连接器的供电,NodeMCU的USB口直接连接到原USB连接器插座上,这样为的是方便安装后再通过计算机给NodeMCU编程,确定需要控制的插座,剪断原铜排连线,将增加的继电器串联到插座中。这里尤其要注意的是板子上不是单纯的低压,220V、5V、12V都在同一块板上,所以在打开插座进行测量时要格外小心,改装后做好绝缘确保安全。全部安装好后要用LuaLoader软件测试一下继电器动作是否正常,一切就绪后再安装好插排盖板,这个一个精致的智能wifi插排就装好了。 3、开发软件及平台 这个插排是不是很好用重头戏在软件上,开发系统是完全开放的,只要你有想法就能给它赋予更多的智慧,实现各种需求,让它也能与时俱进,不用苦苦等待厂家升级了。 NodeMCU模块是在ESP8266模块基础上增加了USB接口电路、5V电源等,软件系统实现了简单的脚本语言Lua,方便用户编程。系统的源代码已经开源。本文只讨论到Lua,如果特殊的应用可以再修改底层代码。 Lua是什么,是一种简单的解释性脚本语言,我也学了几句,程序就算是个示意,起个抛砖引玉的作用吧。 我们选乐为物联作为插排的管理平台,当然也可以选择其他各种平台,感觉目前都不甚成熟。首先我们需要接通平台,凡事要先从简单的来,太复杂的往往走的弯路更多, 1)上传数据 a)我们先在乐为物联上设置两个继电器量; b)输入上传代码 test.lua[pre lang="lua" line="1"]local server = "tcp.lewei50.com"--"192.168.1.129"--
local port = 9960
local bConnected = false
gateWay = "xx" --设备代码
userKey = "xxxxxxxxxxxxxxxxxxxx" --你自己的key
local uSwitchNode = nil
local strOnline = ""
local str1=""
wifi.setmode(wifi.STATION)
wifi.sta.config("xxxxxxxxxxxxxx","xxxxxxx") --路由器登陆名称和密码
wifi.sta.connect()
local cnt = 0
tmr.alarm(0, 1000, 1, function()
if (wifi.sta.getip() == nil) and (cnt < 200000000) then
print("Trying Connect to Router, Waiting...")
cnt = cnt + 1
if cnt%2==1 then gpio.write(0,gpio.LOW);
else gpio.write(0,gpio.HIGH); end
else
tmr.stop(0);
gpio.write(1,gpio.LOW)
tmr.delay(500000)
gpio.write(2,gpio.LOW)
tmr.delay(500000)
gpio.write(5,gpio.LOW)
if (cnt < 20) then print("Conected to Router\r\nMAC:"..wifi.sta.getmac().."\r\nIP:"..wifi.sta.getip())
else print("Conected to Router Timeout")
end
gpio.write(0,gpio.LOW);
cnt = nil;cfg=nil;str=nil;ssidTemp=nil;
collectgarbage()
end
end)
strOnline = "{\"method\":\"update\",\"gatewayNo\":\""..gateWay.."\",\"userkey\":\""..userKey.."\"}&^!"
socket=net.createConnection(net.TCP, 0)
socket n("connection", function(sck, response)
socket:send(strOnline)
print (strOnline)
tmr.delay(500000)
str1= "{\"method\":\"upload\",\"data\":[" .. "{\"Name\":\"SW1\",\"Value\":\"99.7\"}" .. "]}&^!\r\n"
socket:send(str1)
print (str1)
bConnected = true
end)
socket n("disconnection", function(sck, response)
bConnected = false
end)
socket n("receive", function(sck, response)
--dealResponse(response)
end)
socket n("sent", function(sck, response)
print(tmr.now().."sent")
end)
socket:connect(port, server)[/code]
如上图所示,如果乐联平台上的状态显示由灰变蓝,说明数据已经上传到乐联网了。 2)增加控制功能 a)乐联上设置控制开关功能 b)lua代码修改 测试一下,如果反馈回ok说明控制功能连接成功,到此一个能连wifi的物联插诞生了,可以把玩一下了! init.lua - local luaFile = {"sta.lua"}
- for i, f in ipairs(luaFile) do
- if file.open(f) then
- file.close()
- print("Compile File:"..f)
- node.compile(f)
- print("Remove File:"..f)
- file.remove(f)
- end
- end
- local luaFile = {"mysocket.lua"}
- for i, f in ipairs(luaFile) do
- if file.open(f) then
- file.close()
- print("Compile File:"..f)
- node.compile(f)
- print("Remove File:"..f)
- file.remove(f)
- end
- end
- dofile("sta.lc");
- dofile("mysocket.lc");
- luaFile = nil
- collectgarbage();
复制代码sta.lua - gpio.mode(1,gpio.OUTPUT)
- gpio.mode(2,gpio.OUTPUT)
- gpio.mode(5,gpio.OUTPUT)
- gpio.write(1,gpio.HIGH)
- gpio.write(2,gpio.HIGH)
- gpio.write(5,gpio.HIGH)
- wifi.setmode(wifi.STATION)
- wifi.sta.config("xxxxxx","xxxxxx") --wifi路由器名称及密码
- wifi.sta.connect()
- local cnt = 0
- tmr.alarm(0, 1000, 1, function()
- if (wifi.sta.getip() == nil) and (cnt < 200000000) then
- print("Trying Connect to Router, Waiting...")
- cnt = cnt + 1
- if cnt%2==1 then gpio.write(0,gpio.LOW);
- else gpio.write(0,gpio.HIGH); end
- else
-
- tmr.stop(0);
- gpio.write(1,gpio.LOW)
- tmr.delay(500000)
- gpio.write(2,gpio.LOW)
- tmr.delay(500000)
- gpio.write(5,gpio.LOW)
-
- if (cnt < 20) then print("Conected to Router\r\nMAC:"..wifi.sta.getmac().."\r\nIP:"..wifi.sta.getip())
- else print("Conected to Router Timeout")
- end
- gpio.write(0,gpio.LOW);
- cnt = nil;cfg=nil;str=nil;ssidTemp=nil;
- collectgarbage()
- end
- end)
复制代码mysocket.lua - local server = "tcp.lewei50.com"--"192.168.1.129"--
- local port = 9960
- local bConnected = false
- local gateWay = "xx" --你的设备号,类似01等
- local userKey = "xxxxxxxxx" --你自己的Key
- local uSwitchNode = nil
- local strOnline = ""
- local str1=""
- local sw1="0"
- local sw2="0"
- local sw3="0"
- --get value from string like "p1":"1","f":"getAllSensors"
- local function getStrValue(str,strName)
- i,j = string.find(str,"""..strName.."":"")
- k,l = string.find(string.sub(str, j+1, -1),""")
- return string.sub(str, j+1,j-1+l)
- end
- function sw_refresh()
- print(sw1,sw2,sw3)
- if sw1=="1" then
- gpio.write(5,gpio.HIGH)
- else
- gpio.write(5,gpio.LOW)
- end
- if sw2=="1" then
- gpio.write(1,gpio.HIGH)
- else
- gpio.write(1,gpio.LOW)
- end
- if sw3=="1" then
- gpio.write(2,gpio.HIGH)
- else
- gpio.write(2,gpio.LOW)
- end
- end
- local function dealResponse(str)
- ufunctionName = getStrValue(str,"f")
- if(ufunctionName == "writeSerial") then
- uswitchName = getStrValue(str,"p1")
- uswitchValue = getStrValue(str,"p2")
- if uswitchName=="1" then sw1=uswitchValue end
- if uswitchName=="2" then sw2=uswitchValue end
- if uswitchName=="3" then sw3=uswitchValue end
- sw_refresh()
- nodeStr= "{"method":"response","result":{"successful":true,"message":"TD Write serial OK."}}&^!"
- socket:send(nodeStr)
- nodeStr = nil
- str = nil
- end
- str = nil
- end
- socket=net.createConnection(net.TCP, 0)
- socket:on("connection", function(sck, response)
- socket:send(strOnline)
- print (strOnline)
- tmr.delay(500000)
- str1= "{"method":"upload","data":[" .. "{"Name":"SW1","Value":"" .. sw1 .. ""},{"Name":"SW2","Value":"" .. sw2 .. ""},{"Name":"SW3","Value":"" .. sw3 .. ""}" .. "]}&^!\r\n"
- socket:send(str1)
- print (str1)
- bConnected = true
- end)
- socket:on("disconnection", function(sck, response)
- bConnected = false
- end)
- socket:on("receive", function(sck, response)
- dealResponse(response)
- print("return ok!")
- end)
- socket:on("sent", function(sck, response)
- print(tmr.now().."sent")
- end)
- strOnline = "{"method":"update","gatewayNo":""..gateWay.."","userkey":""..userKey..""}&^!"
- socket:connect(port, server)
- tmr.alarm(4, 5000, 1, function()
- str1= "{"method":"upload","data":[" .. "{"Name":"SW1","Value":"" .. sw1 .. ""},{"Name":"SW2","Value":"" .. sw2 .. ""},{"Name":"SW3","Value":"" .. sw3 .. ""}" .. "]}&^!\r\n"
- print(str1)
- socket:send(str1)
- end)
复制代码
微信控制:通过手机微信开关插座,可以做到远程控制; 定时烧茶水:每天可以定时开始烧水,烧完水好自动关闭电源;
编辑2个计划任务,一个用于打开烧茶说电源,一个任务是一小时以后关闭电源。
启动计划后,系统就在每天晚上7点给烧水插座供电,如果需要烧水可预先灌好水,按下烧水按钮,待插座通电后自动开始烧水,水烧开后自动断电,此后每天7点以后,就可以泡一杯香茶或咖啡,岂不美哉!{:soso_e113:}
自动加湿:就是在湿度过低时自动接通加湿器电源加湿,隔一定时间或湿度到达后自动断开加湿器电源,停止加湿。有人问,那湿度信号从哪里来啊,那就请到论坛找找,有很多方法的,这个才体现了万物物联的真谛!
还有很多很多新奇的功能…,欢迎交流,可以让生活更舒适简单。
我还想实现一个功能,记得住宾馆,离开房间时拿走房卡,房间里可以自动断电,方便又安全,如何在家也这样方便呢,期待你的高招...{:soso_e129:}
感谢“瘦网虫”提供的lua代码参考,乐联提供的免费平台还有很多很多人在网上提供的资料和软件。
很多人咨询插排,少量提供,极客工坊的用户另有特价
欢迎联系交流我的qq:250051104
源代码、资料、工具软件可以去qq群 475079657下载 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|