ESP8266使用詳解--基於Lua腳本語言


這些天,,,,今天終於看到了希望,,,天道酬勤

先說實現的功能...讓ESP8266連接無線網,然后讓它建立服務器,,我的客戶端連接上以后,發給客戶端發數據模塊打印到串口,,往ESP8266串口里發數據自動轉發給網口

先看效果圖,終於不需要單片機配置了

程序源碼

我的init.lua

lighton=0
pin=4
gpio.mode(pin,gpio.OUTPUT)
tmr.alarm(1,500,1,function()
  if lighton==0 then
      lighton=1
      gpio.write(pin,gpio.HIGH)
  else
      lighton=0
       gpio.write(pin,gpio.LOW)
  end
end)

dofile("conncet_wifi.lua")
我的 conncet_wifi.lua
uart.setup(0,9600,8,0,1,0)
wifi.setmode(wifi.STATIONAP) wifi.sta.config(
"360","1234567890") wifi.sta.connect() tmr.alarm(2, 1000, 1, function() if wifi.sta.getip() == nil then print("Connecting...") else tmr.stop(2) print("Connected, IP is "..wifi.sta.getip()) end end) srv=net.createServer(net.TCP,28800) srv:listen(8080,function(conn) --print("build success") connect = conn conn:on("receive",function(conn,payload) print(payload) --conn:send("<h1> Hello, NodeMcu.</h1>") end) end)
uart.on(
"data", function(data) connect:send(data) end, 0)

 

因為可能刷的固件不一樣,如果出現下面的問題

修改為

APConfig={}
APConfig.ssid="ACLAY"
APConfig.pwd="wange903"

wifi.sta.config(APConfig)


如果想讓多個客服端連接可參考這篇文章

51采集PCF8591數據通過ESP8266上傳C#上位機

如果上面的代碼有問題,,提示已經監聽了端口不能重復監聽,可以修改為下面的

ConnectCnt = 0
ConnectListenFlage=0
UsartUsFlage = 0
connect0Flage=0
connect1Flage=0
connect2Flage=0
connect3Flage=0
connect4Flage=0
tmr.alarm(3, 1000, 1, function()
                if ConnectListenFlage == 0 then
                ConnectListenFlage = 1
              
                srv:listen(8080,function(conn0) 
                UsartUsFlage = 1

                if ConnectCnt == 0 then
                   connect0 = conn0
                   connect0Flage =1
                   connect1Flage=0
                   if connect1 ~= nil then
                      connect1:close()
                   end
                   print("0-Connectd") 
                end
                if ConnectCnt == 1 then
                   connect1 = conn0 
                   connect1Flage=1
                   connect2Flage=0
                   if connect2 ~= nil then
                      connect2:close()
                   end
                   print("1-Connectd") 
                end
                if ConnectCnt == 2 then
                   connect2 = conn0
                   connect2Flage=1
                   connect3Flage=0
                   if connect3 ~= nil then
                      connect3:close()
                   end 
                   print("2-Connectd") 
                end
                if ConnectCnt == 3 then
                   connect3 = conn0 
                   connect3Flage=1
                   connect4Flage=0
                   if connect4 ~= nil then
                      connect4:close()
                   end
                   print("3-Connectd") 
                end
                if ConnectCnt == 4 then
                   connect4 = conn0
                   connect4Flage=1
                   connect0Flage=0
                   if connect0 ~= nil then
                      connect0:close()
                   end 
                   print("4-Connectd") 
                end
            
                conn0:on("receive",function(conn0,payload) 
                print(payload) end)
                ConnectCnt = ConnectCnt+1
                if ConnectCnt == 5 then
                   ConnectCnt = 0
                end
               
             end)
          end  
end)
uart.setup(0,9600,8,0,1,0)


tmr.alarm(4, 1000, 1, function() if UsartUsFlage == 1 then uart.on("data", function(data) if connect0 ~= nil then if connect0Flage == 1 then connect0:send(data) end end if connect1 ~= nil then if connect1Flage == 1 then connect1:send(data) end end if connect2 ~= nil then if connect2Flage == 1 then connect2:send(data) end end if connect3 ~= nil then if connect3Flage == 1 then connect3:send(data) end end if connect4 ~= nil then if connect4Flage == 1 then connect4:send(data) end end tmr.stop(4) end, 0) end end)

 

這兩天測試程序還發現一個bug就是如果客戶端斷開了,應該檢測一下哪個斷開了,數據就不應該發向那個連接,,,否則就會報錯,然后模塊會復位重啟

所以加上這段代碼

 

conn0:on("disconnection",function(sck,c) --print(sck) if sck == connect0 then connect0 = nil print("disconnect0") end if sck == connect1 then connect1 = nil print("disconnect1") end if sck == connect2 then connect2 = nil print("disconnect2") end if sck == connect3 then connect3 = nil print("disconnect3") end if sck == connect4 then connect4 = nil print("disconnect4") end end)

 

放一個全的

 

ConnectCnt = 0//連接計數 ConnectListenFlage=0//監聽標志,只執行一次監聽 UsartUsFlage = 0//允許串口數據發向網口 tmr.alarm(2, 1000, 1, function() if NetMode == 0 then//TCP Sever模式 if ConnectListenFlage == 0 then ConnectListenFlage = 1 srv:listen(ConnectPort,function(conn0) UsartUsFlage = 1 --print(conn0) if ConnectCnt == 0 then connect0 = conn0 if connect1 ~= nil then connect1:close() end connect1 = nil print("0-Connectd") end if ConnectCnt == 1 then connect1 = conn0 if connect2 ~= nil then connect2:close() end connect2 = nil print("1-Connectd") end if ConnectCnt == 2 then connect2 = conn0 if connect3 ~= nil then connect3:close() end connect3 = nil print("2-Connectd") end if ConnectCnt == 3 then connect3 = conn0 if connect4 ~= nil then connect4:close() end connect4 = nil print("3-Connectd") end if ConnectCnt == 4 then connect4 = conn0 if connect0 ~= nil then connect0:close() end connect0 = nil print("4-Connectd") end conn0:on("disconnection",function(sck,c) //斷開連接函數 --print(sck) if sck == connect0 then connect0 = nil print("disconnect0") end if sck == connect1 then connect1 = nil print("disconnect1") end if sck == connect2 then connect2 = nil print("disconnect2") end if sck == connect3 then connect3 = nil print("disconnect3") end if sck == connect4 then connect4 = nil print("disconnect4") end end) conn0:on("receive",function(conn0,payload) uart.write(0,payload)end) --print(payload) end) ConnectCnt = ConnectCnt+1 if ConnectCnt == 5 then ConnectCnt = 0 end end) end end

 

串口函數里面

 if UsartUsFlage == 1 then if NetMode == 0 then if connect0 ~= nil then connect0:send(RevData) end if connect1 ~= nil then connect1:send(RevData) end if connect2 ~= nil then connect2:send(RevData) end if connect3 ~= nil then connect3:send(RevData) end if connect4 ~= nil then connect4:send(RevData) end end

 

 

現在一步步的做

首先親們一定是把Esp8266刷了基於Lua腳本語言開發的固件

可以參考這篇文章ESP8266刷AT固件與nodemcu固件

 

我也重新刷一下

我現在使用的這一款,,這上面有一個燈,這款是人家做的開發板,所以集成了USB轉串口,,

首先是做一個程序讓燈閃,這樣做就只是做指示燈,正好看一下它的一些API函數

復位一下模塊

 

關於這句要說一下,,,,這個模塊默認上電執行的是  init.Lua中的程序,因為剛刷新完固件所以模塊里面沒有任何文件,,

我們編寫一個程序把它保存為一個后綴名為.lua的文件,,這些文件呢,點擊

文件就保存到ESP8266內部了,我上面寫了兩個文件一個名為init.lua(必須的,一上電模塊就執行的文件),另一個conncet_wifi.lua

要想使用這個文件只需要

先寫init.lua

 

可以給模塊重新上電試一下,或者復位,模塊總是執行這個程序

 

 我為了方便用電腦上位機測試,所以就讓模塊工作在AP+STATION模式下,讓模塊連接我的360wifi

先設置模塊的模式,然后是連接我的無線

 

 為了保證模塊一上電就執行

接着就是建立服務器

 

對了具體的關於 ::::::號有沒有疑問,其實自己現在也有,不過自己看到了Lua講解::::號的地方,先知道這樣用,,,,,自己看懂了再在關於lua入門里面寫一下

網口已經能接收到數據然后發送到串口了

現在要做的是往模塊串口發數據然后傳給網口

完成后可以給模塊重新上電,或者復位一下,因為模塊這樣寫進去可能不是從init.lua開始執行的

用別的串口調試助手連接上模塊,因為這個軟件的串口是發的命令

好了,,,,

補充

上面的AP加STATION模式下模塊是發出WIFI信號的,而且設置了模塊監聽的端口是8080,所以可以完全連接模塊發出的無線網,然后和模塊進行通信,

只不過模塊IP地址填寫的是模塊默認的ip  192.168.4.1  端口號  8080

連接模塊的無線

對了串口每隔500ms會打印Connecting...

是由於Lua程序中寫的模塊是如果沒有連接到路由器就會打印

如果不想要可以去掉

最后呢!提供一下自己做的板子

輕松使用8266

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM