zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    sqlserver创建linkserver ,链接oracle
    sqlserver将数据分隔成两大列
    oracle递归查询
    Oracle安装文档以及imp导入表数据命令说明书
    Oracle 栏位级联修改
    Oracle获取时间
    vue install 报错 npm ERR! Unexpected end of JSON input while parsing near '...//registry.npmjs.org/'解决方案
    websocket
    element 选择框多选校验
    js 面向对象
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/6407727.html
Copyright © 2011-2022 走看看