资讯详情

esp01S 配网及连接mqtt

esp01S 配网及连接mqtt

  • 设备入手
    • 刷nodeMcu固件
    • 配网方案
    • LUA代码参考
    • 其他代码

设备入手

马爸爸家开始了esp01s Relay配置模块继电器esp01s,全裸板,没有程序,需要刷。

刷nodeMcu固件

没什么好说的。https://nodemcu-build.com/index.php选择项目,生成固件,然后使用flash_download_tools_v3.6.7刷到esp01s里即可。

配网方案

参考了https://www.secpulse.com/archives/82363.html文件和思路发生了变化,上电后自动运行init.lua,查找网络配置文件config.lua,如果没有,启动ap模式,加载httpserver,手机连接模块AP,进行配网,将网络参数保存到模块中config.lua内部,连接网络,执行mqtt.lua,连接mqtt,就可以控制了。 下次启动或断电后启动时,自动运行init.lua,查找网络配置文件config.lua,配置后,将存在模块连接网络并执行mqtt.lua,连接mqtt,可正常控制。 wifi即使名称或密码,即使配置文件config.lua存在与网络无关。目前的处理方法是init.lua内置时间限制,超过时间仍无法连接到网络,启动ap模式,加载httpserver,手机连接模块AP,可重新配网。

LUA代码参考

init.lua:

if file.exists("config.lua") then     dofile('config.lua')     wifi.sta.config(cfg)     print("connect wifi ssid: "..cfg.ssid.." pwd: "..cfg.pwd)     count=0     mytimer = tmr.create()     mytimer:register(1000, tmr.ALARM_AUTO, function()         if count==10 then             mytimer:stop()              print('connect sta fail,restarthttpserver...')             dofile('wifi_set_ap.lua')             dofile('start_http.lua')         end         if wifi.sta.getip() ~= nil then             print(wifi.sta.getip())             mytimer:stop()
            print('{"status":"connect success."}')
            wifi.setmode(wifi.STATION)
            --mqtt
            dofile('mqtt.lua')
        else
            count=count+1           
        end
    end)
    mytimer:start()
    else
    dofile('wifi_set_ap.lua')
    dofile('start_http.lua')
end

配网代码start_http.lua:

dofile('httpServer.lua')
dofile('table_to_string.lua')

httpServer:listen(80)
TMR_WIFI = 4

httpServer:use('/', function(req, res)
        if wifi.getmode() == 3 then
            res:sendFile("index.html")
        else
            res:send("<h1>Hello,nodeMCU</h1>")
        end
end)

httpServer:use('/config', function(req, res)
    if req.query.ssid ~= nil and req.query.pwd ~= nil then
        local cfg = { 
        }
        cfg.ssid = req.query.ssid
        cfg.pwd = req.query.pwd
        wifi.sta.config(cfg)
        print("connect wifi ssid: "..cfg.ssid.." pwd: "..cfg.pwd)
        -- 配网信息保存
        file = file.open("config.lua", "w")
        file:writeline("cfg = {}")
        file:writeline("cfg.ssid = \""..req.query.ssid.."\"")
        file:writeline("cfg.pwd = \""..req.query.pwd.."\"")
        file:close() 
        dofile('config.lua')
        wifi.sta.config(cfg)
        print("connect wifi ssid: "..cfg.ssid.." pwd: "..cfg.pwd)
        count=0
        mytimer = tmr.create()
        mytimer:register(1000, tmr.ALARM_AUTO, function() 
            if wifi.sta.getip() ~= nil then
                print(wifi.sta.getip())
                mytimer:stop()
                print('{"status":"connect success."}')
                wifi.setmode(wifi.STATION)
                dofile('mqtt.lua')
            end
        end)
        mytimer:start()      
    end
end)

httpServer:use('/scanap', function(req, res)
    print("Scanning AP...")
    wifi.sta.getap(1, function(table)
        local aptable = { 
        }
        for ssid,v in pairs(table) do
            local ssid, rssi, authmode, channel = string.match(v, "([^,]+),([^,]+),([^,]+),([^,]*)")
            aptable[ssid] = channel
        end
        local retResult = table_to_string(aptable)
        res:send(retResult)
    end)
end)

其他代码

其他的操作就很简单了,可以通过以下链接获取所有代码和所用到的工具。 esp8266继电器配网+断电保存+可重复配网全部代码及工具.zip 本人纯小白,折腾了两天,希望对大家有参考作用。

标签: 41s连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台