用NodeMCU(ESP8266)打造超级实用的智能插排

选NodeMCU的理由是它足够便宜,另一个就是开源

这样就不会有人为的障碍阻挡你的脚步了,站在巨人的肩膀上,让花费的时间更有意义。

我们选乐为物联作为插排的管理平台,当然也可以选择其他各种平台,感觉目前都不甚成熟。

首先我们需要接通平台,凡事要先从简单的来,太复杂的往往走的弯路更多

用途

电脑BOIS设置通电开机,然后微信控制开关机。

虽说我手上已经有几个现成得智能插座,但是生活在于折腾折腾!

init.lua

  1. --全局变量
  2. bConnected=false
  3. Is_wifi_Ok=false
  4. Is_First=true
  5.  
  6.  
  7. local luaFile = {"sta.lua"}
  8. for i, f in ipairs(luaFile) do
  9. if file.open(f) then
  10. file.close()
  11. print("Compile File:"..f)
  12. node.compile(f)
  13. print("Remove File:"..f)
  14. file.remove(f)
  15. end
  16. end
  17.  
  18. local luaFile = {"mysocket.lua"}
  19. for i, f in ipairs(luaFile) do
  20. if file.open(f) then
  21. file.close()
  22. print("Compile File:"..f)
  23. node.compile(f)
  24. print("Remove File:"..f)
  25. file.remove(f)
  26. end
  27. end
  28.  
  29. dofile("sta.lc");
  30. dofile("mysocket.lc");
  31. luaFile = nil
  32. collectgarbage();

sta.lua

  1. --Created @ 2015/05/14 by Doit Studio
  2. --Modified: null
  3. --http://www.doit.am/
  4. --http://www.smartarduino.com/
  5. --http://szdoit.taobao.com/
  6. --bbs: bbs.doit.am
  7. gpio.write(1,gpio.LOW)
  8. gpio.write(2,gpio.LOW)
  9. gpio.write(3,gpio.LOW)
  10. gpio.write(4,gpio.LOW)
  11. gpio.write(5,gpio.LOW)
  12. gpio.write(6,gpio.LOW)
  13. gpio.mode(1,gpio.OUTPUT)
  14. gpio.mode(2,gpio.OUTPUT)
  15. gpio.mode(3,gpio.OUTPUT)
  16. gpio.mode(4,gpio.OUTPUT)
  17. gpio.mode(5,gpio.OUTPUT)
  18. gpio.mode(6,gpio.OUTPUT)
  19. gpio.write(1,gpio.HIGH)
  20. gpio.write(2,gpio.HIGH)
  21. gpio.write(3,gpio.HIGH)
  22. gpio.write(4,gpio.HIGH)
  23. gpio.write(5,gpio.HIGH)
  24. gpio.write(6,gpio.HIGH)
  25.  
  26.  
  27. wifi.setmode(wifi.STATION)
  28.  
  29. --需要修改的地方
  30. wifi.sta.config("xxxxx","12345678")
  31. --需要修改的地方
  32.  
  33.  
  34. print("\nwifi.sta.connetct...")
  35. wifi.sta.connect()
  36. local cnt = 0
  37. tmr.alarm(0, 1000, 1, function()
  38. if (wifi.sta.getip() == nil and (cnt < 20)) then
  39. print("Trying Connect to Router, Waiting...")
  40. cnt = cnt + 1
  41. --if cnt%2==1 then gpio.write(0,gpio.LOW); --闪灯
  42. --else gpio.write(0,gpio.HIGH); end
  43. else
  44. tmr.stop(0);
  45.  
  46. if (cnt < 20) then print("Conected to Router MAC:"..wifi.sta.getmac().." IP:"..wifi.sta.getip())
  47. else print("Conected to Router Timeout!!!")
  48. end
  49. --gpio.write(0,gpio.LOW); --关闭状态灯
  50. cnt = nil;cfg=nil;str=nil;ssidTemp=nil;
  51. collectgarbage()
  52. tmr.alarm(1, 3000, 1, function() --3秒检查一下状态
  53. if(wifi.sta.status()~=5) then
  54. --node.restart()
  55. end
  56. end)
  57. end
  58. end)

mysocket.lua

  1. local server = "tcp.lewei50.com"--"192.168.1.129"--
  2. local port = 9960
  3. local bConnected = false
  4. --需要修改的地方
  5. local gateWay = "01"
  6. local userKey = "faedd4cc354d49fexxxxxxxxxx"
  7. --需要修改的地方
  8.  
  9. local uSwitchNode = nil
  10. local strOnline = ""
  11. local str1=""
  12. local sw1="0"
  13. local sw2="0"
  14. local sw3="0"
  15. local errcnt=0
  16. local IsSendOK=true
  17.  
  18.  
  19. --get value from string like "p1":"1","f":"getAllSensors"
  20. local function getStrValue(str,strName)
  21. i,j = string.find(str,"\""..strName.."\":\"")
  22. k,l = string.find(string.sub(str, j+1, -1),"\"")
  23. return string.sub(str, j+1,j-1+l)
  24. end
  25.  
  26. function sw_refresh(sel,val)
  27. print(sw1,sw2,sw3)
  28. if(sel=="1") then
  29. if val=="1" then
  30. sw1="1"
  31. gpio.write(1,gpio.HIGH)
  32. else
  33. sw1="0"
  34. gpio.write(1,gpio.LOW)
  35. end
  36. end
  37. if(sel=="2") then
  38. if val=="1" then
  39. sw2="1"
  40. gpio.write(2,gpio.HIGH)
  41. else
  42. sw2="0"
  43. gpio.write(2,gpio.LOW)
  44. end
  45. end
  46. if(sel=="3") then
  47. if val=="1" then
  48. sw3="1"
  49. gpio.write(3,gpio.HIGH)
  50. else
  51. sw3="0"
  52. gpio.write(3,gpio.LOW)
  53. end
  54. end
  55. if(sel=="4") then
  56. if val=="1" then
  57. gpio.write(4,gpio.HIGH)
  58. else
  59. gpio.write(4,gpio.LOW)
  60. end
  61. end
  62. if(sel=="5") then
  63. if val=="1" then
  64. gpio.write(5,gpio.HIGH)
  65. else
  66. gpio.write(5,gpio.LOW)
  67. end
  68. end
  69. if(sel=="6") then
  70. if val=="1" then
  71. gpio.write(6,gpio.HIGH)
  72. else
  73. gpio.write(6,gpio.LOW)
  74. end
  75. end
  76. end
  77.  
  78. local function dealResponse(str)
  79. ufunctionName = getStrValue(str,"f")
  80. if(ufunctionName == "writeSerial") then
  81. uswitchName = getStrValue(str,"p1")
  82. uswitchValue = getStrValue(str,"p2")
  83. sw_refresh(uswitchName,uswitchValue)
  84. nodeStr= "{\"method\":\"response\",\"result\":{\"successful\":true,\"message\":\"TD Write serial OK.\"}}&^!"
  85. socket:send(nodeStr)
  86. nodeStr = nil
  87. str = nil
  88. end
  89. str = nil
  90. end
  91.  
  92. socket=net.createConnection(net.TCP, 0)
  93. socket:on("connection", function(sck, response)
  94. socket:send(strOnline)
  95. print (strOnline)
  96. tmr.delay(500000)
  97. str1= "{\"method\":\"upload\",\"data\":[" .. "{\"Name\":\"SW1\",\"Value\":\"" .. sw1 .. "\"},{\"Name\":\"SW2\",\"Value\":\"" .. sw2 .. "\"},{\"Name\":\"SW3\",\"Value\":\"" .. sw3 .. "\"}" .. "]}&^!\r\n"
  98. socket:send(str1)
  99. print (str1)
  100. bConnected = true
  101. end)
  102.  
  103. socket:on("disconnection", function(sck, response)
  104. bConnected = false
  105. end)
  106.  
  107. socket:on("receive", function(sck, response)
  108. dealResponse(response)
  109. print("return ok!")
  110. end)
  111.  
  112. socket:on("sent", function(sck, response)
  113. print(tmr.now().."sent")
  114. end)
  115.  
  116.  
  117. strOnline = "{\"method\":\"update\",\"gatewayNo\":\""..gateWay.."\",\"userkey\":\""..userKey.."\"}&^!"
  118. socket:connect(port, server)
  119.  
  120. tmr.alarm(4, 5000, 1, function()
  121. if(not IsSendOK) then
  122. errcnt=errcnt+1
  123. if(errcnt>10) then
  124. --node.restart()
  125. end
  126. end
  127. str1= "{\"method\":\"upload\",\"data\":[" .. "{\"Name\":\"SW1\",\"Value\":\"" .. sw1 .. "\"},{\"Name\":\"SW2\",\"Value\":\"" .. sw2 .. "\"},{\"Name\":\"SW3\",\"Value\":\"" .. sw3 .. "\"}" .. "]}&^!\r\n"
  128. print(str1)
  129. socket:send(str1)
  130. IsSendOK=false
  131. end)

LuaLoader.exe上传LUA文件
ESP8266Flasher.exe烧录固体
nodemcu_float_0.9.6-dev_20150704.bin

很多人问的问题实在比较简单,这些还是baidu吧,因为基础不一样,需求也不一样,有些弯路也是需要走走的。以下链接供参考

用NodeMCU(ESP8266)打造超级实用的智能插排
http://www.geek-workshop.com/forum.php?mod=viewthread&tid=24907&highlight=%B2%E5%C5%C5

DIY超级智能插排来了!!!(NodeMCU、射频、温湿度DHT、DS18B20)
http://www.geek-workshop.com/forum.php?mod=viewthread&tid=27421&highlight=%B2%E5%C5%C5

用DIY智能插排自动开关路由器电源
http://www.geek-workshop.com/forum.php?mod=viewthread&tid=24980&highlight=%B2%E5%C5%C5

乐为物联开发者指南
http://www.lewei50.com/dev/content/about?sk=63

lua教程
http://www.yiibai.com/lua/

Lua 语言 15 分钟快速入门
http://blog.jobbole.com/70480/

NodeMCU之旅(一):构建、刷入固件,上传代码
http://www.cnblogs.com/wangzexi/p/5696925.html

发表评论

邮箱地址不会被公开。 必填项已用*标注