NODEMCU调试心得4 - 关于nodemcu的点点滴滴2

时间:2022-01-18 13:42:46

关于nodemcu的点点滴滴

继续上一节的内容

step2

lua是脚本语言,我们可以把每一条语言存储到.lua文件中,然后用dofile()一起执行。
- 把我们上一节的代码输入到ESplore的左侧空白窗口(如果窗口已经有代码了,就选择file/New新建空白文档),代码为:

  list = {1, 2, "You want"};
record = {a=1, b=2, d = " high a big news!"};
list[4] = " high a big news!";
record.c = "You want";
print(list[3]..list[4]);
print(record.c..record["d"]);
  • 选择file-save to disk, 存为bignews.lua,如下图

NODEMCU调试心得4 - 关于nodemcu的点点滴滴2
NODEMCU调试心得4 - 关于nodemcu的点点滴滴2

  • ESPlor会自动上传.lua文件,逐行读取代码,并执行,最后给出回显。
  • 你也可以手动执行文件,在右侧下方命令行输入并回车:

    dofile("bignews.lua")

    在命令行中使用dofile(),可以执行已上传的.lua文件,

  • 同样我们也可以在.lua文件中调用dofile()。
  • 这一点非常有用,通常用在初始化文件init.lua中

step3

这一部分,我们了解一下lua的文件系统操作
- 在右下方命令行输入一下代码,得到nodemcu的信息:

  majorVer, minorVer, devVer, chipid, flashid, flashsize, flashmode, flashspeed = node.info();
print("NodeMCU "..majorVer.."."..minorVer.."."..devVer)
  • 在命令行输入一下代码,得到文件系统中保存的文件信息。

    l = file.list();
    for k,v in pairs(l) do
    print("name:"..k..", size:"..v)
    end

在Lua的文件系统中,init.lua为初始化文件。当nodemcu上点或重启,就自动执行。

  • #### 在init.lua 文件中加入dofile()命令,就可以自动执行已经上传的.lua文件。

step4

  • 在原init.lua文件最后,增加dofile()命令,代码如下所示,点击esplore最下方一行的save to ESP,如下图所示:

NODEMCU调试心得4 - 关于nodemcu的点点滴滴2
NODEMCU调试心得4 - 关于nodemcu的点点滴滴2

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

dofile("connect.lua")
  • 你还要上传文件conncet.lua,代码如下:

      SSID = "NETGEAR56"
    password = "greenjungle5"
    print(wifi.sta.getip())
    --nil
    wifi.setmode(wifi.STATION)
    wifi.sta.config(SSID,password)
    wifi.sta.connect()
    tmr.alarm(1, 1000, 1, function()
    if wifi.sta.getip() == nil then
    print("Connecting...")
    else
    tmr.stop(1)
    print("Connected, IP is "..wifi.sta.getip())
    end
    end)

    uart.setup(0,9600,8,0,1,0)
    sv=net.createServer(net.TCP, 2880)
    print("creat server")
    global_c = nil
    sv:listen(8080, function(c)
    if global_c~=nil then
    global_c:close()
    end
    global_c=c
    c:on("receive",function(sck,pl) uart.write(0,pl) end)
    end)

    uart.on("data",4, function(data)
    if global_c~=nil then
    global_c:send(data)
    end
    end, 0)
  • conncet.lua 代码的前两行, SSID和password为路由器的账号和密码。

  • init.lua和conncet.luay已经上传文件系统;nodemcu重新上电,或者重启(即按nodemcu板上的RST按键)。nodemcu将自动执行init.lua,自动连接路由,返回nodemcu的IP地址,并创建服务器。
  • 打开USR-TCP232-Test.exe,在界面窗口右上角,server IP输入刚才返回的nodemcu的IP(注意是你自己的nodemcuIP,不是图中所示的),如下图设置,点击connect

NODEMCU调试心得4 - 关于nodemcu的点点滴滴2
NODEMCU调试心得4 - 关于nodemcu的点点滴滴2

  • 然后就可以通过USR-TCP232-Test.exe右侧下方的窗口,向nodemcu发送消息,如下图
    NODEMCU调试心得4 - 关于nodemcu的点点滴滴2
    NODEMCU调试心得4 - 关于nodemcu的点点滴滴2

  • 同样,你也可以通过Esplore右侧下方的命令行,向USR-TCP232-Test发送消息,如下图
    NODEMCU调试心得4 - 关于nodemcu的点点滴滴2
    NODEMCU调试心得4 - 关于nodemcu的点点滴滴2

这里,也许你发现了不对劲的地方,

  • 你的.lua文件没法上传执行了,
  • 可能你的串口命令行也用不了。

这是因为,

  • uart口一直被conect程序占用,没法向flash上传,
  • 因为uart被占用,也没法用串口输入命令。

如果你需要更新.lua文件,你能做的可能之有

  • ### 重新烧写固件

step5

这一部分介绍一下如何快速烧写硬件
- 首先你要下载nodemcu的一键烧写程序,点击这里
- 在文件夹中nodemcu-flasher-master\Win64\Release打开exe程序,如果是32位windows,请选择Win32文件夹下的文件
- 打开后,界面自动识别nodemcu的连接串口,更新最新版的modemcu固件,只需点击flash
NODEMCU调试心得4 - 关于nodemcu的点点滴滴2
NODEMCU调试心得4 - 关于nodemcu的点点滴滴2

  • 系统将自动烧写固件,下方显示二维码和进度条,如下图所示:
    NODEMCU调试心得4 - 关于nodemcu的点点滴滴2
    NODEMCU调试心得4 - 关于nodemcu的点点滴滴2

  • 进度条满格后,下载成功,就可以重新上传.lua文件了。

到这里,恭喜你已经完成了一个完整的开发流程,包括:

  • 运行IDE ESPlorer
  • 运行lua命令行
  • 运行 .lua文件
  • 烧写(为了上传新的程序)

所以,为了避免反复刷固件,在init.lua中dofile()命令通常用--注释。调试时在命令行中使用dofile(),调试无误后再取消注释

最后,我们做个好玩的东西,用网络客户端远程控制nodemcu的LED或者GPIO端口,甚至更新.lua文件,做你任何想做的事情

我们需要用到node.input,它可以将接收到的字符串送到lua解释器进行执行,你完全可以用它对nodemcu进行云端控制和云端升级

STEP 6

我们把之前的代码做点少量的修改
- 新建conncet_wifi.lua,代码如下,点击Save to Esp

    SSID = "Your SSID"
password = "Your password"

print(wifi.sta.getip())
--nil
wifi.setmode(wifi.STATION)
wifi.sta.config(SSID,password)
wifi.sta.connect()
tmr.alarm(1, 1000, 1, function()
if wifi.sta.getip() == nil then
print("Connecting...")
else
tmr.stop(1)
print("Connected, IP is "..wifi.sta.getip())
end
end)
  • 新建client_command.lua, 代码如下,点击Save to Esp

    uart.setup(0,9600,8,0,1,0)
    sv=net.createServer(net.TCP, 2880)
    print("creat server")
    global_c = nil
    sv:listen(8080, function(c)
    if global_c~=nil then
    global_c:close()
    end
    global_c=c
    c:on("receive",function(sck,pl) node.input(pl) end)
    end)
  • 新建init.lua,代码如下,点击Save to Esp

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

    dofile("connect.wifi")
    dofile("client_command.lua")
  • 可以在串口发送窗口上练习一下mode模块和file模块指令的操作,但是不要删除上述三个文件

  • 如果没有收到IP地址,可以在命令行中手动执行dofile(“connect_wifi.lua”)
  • 关闭串口连接,拔下usb线,找一个5V手机充电器,连到nodemcu的usb线上,给nodemcu上电
  • 上电后,nodemcu自动执行init.lua程序,蓝色LED以10秒为周期闪烁;
  • 保险起见,按一下板子上的RST按键
  • 打开USR-TCP232-Test.exe 完全按step4的步骤操作,连接客户端
  • 当LED亮时,在USR-TCP232-Test输入gpio.write(pin,gpio.HIGH)并发送。如果发送成功,LED立刻熄灭,否则LED持续点亮5秒
  • 当LED亮时,在USR-TCP232-Test输入gpio.write(pin,gpio.LOW)并发送。如果发送成功,LED立刻点亮,否者LED持续熄灭5秒
  • 此外,通过USR-TCP232-Test命令行,也可以执行dofile(),node.restart()等命令;控制其它GPIO等硬件外设;上传或删除.lua文件

这部分就到这里,下一部分讲一下function和数据结构,祝大家玩得开心!