ESP8266控制继电器原理图
1.先测试一下简单的数据存储和读取
上电延时2 秒加载file.lua文件,在file.lua文件中写入数据到mode.lua文件,再延时5秒读出数据通过串口打印数据
操作流程:
(1) 手写创建打开一个文件file.open("mode.lua", "w+")(写方式打开)
(2) 向文件中写入数据file.writeline()
(3) 读取文件并打印内容
(4) 关闭文件
init.lua文件:
- tmr.alarm(0,2000,0,function()
- dofile("file.lua")
- end)
复制代码
init.lua文件结束
file.lua文件:
- if file.open("mode.lua", "w+") then
- file.writeline("abc")
- file.flush()
- file.writeline("222")
- file.flush()
- file.writeline("666")
- file.close()
- else
- print("open mode.lua faild")
- end
- tmr.alarm(1,5000,0,function()
- if file.open("mode.lua", "r") then
- s1= file.readline()
- print(s1)
- s1= file.readline()
- print(s1)
- s1= file.readline()
- print(s1)
- file.close()
- end
- end)
复制代码
file.lua文件结束
2. 通过串口助手,发送数据控制继电器状态, 同时把继电器的状态写入mode.lua文件中当断电后,再次上电时恢复继电器的状态
当然控制继电器的状态不止可以用串口,也可以使用让模块建立TCP服务器,使用 手机版的调试助手控制继电器,这里只是抛块砖...
使用串口控制继电器的lua源码只需要两个.lua文件"init.lua"和"file.lua"文件即可,ESP8266模块烧写lua开发固件后,直接把这两个.lua文件上传到模块即可
init.lua文件:
- RELAY_Stat = ""
- RELAY_Pin = 1
- gpio.mode(RELAY_Pin, gpio.OUTPUT)
- if file.open("mode.lua", "r") then
- RELAY_Stat = file.readline()
- print(RELAY_Stat)
- file.close()
- end
- if string.find(RELAY_Stat,"RELAY=1",1) then
- gpio.write(RELAY_Pin,1)
- elseif string.find(RELAY_Stat,"RELAY=0",1) then
- gpio.write(RELAY_Pin,0)
- end
- tmr.alarm(0,4000,0,function()
- print(RELAY_Stat)
- dofile("file.lua")
- end)
复制代码
init.lua文件结束
file.lua文件:
- UartReceCnt = 0
- UartReceTempCnt = 0
- UartReceData = ""
- uart.on("data",0,function(data)
- UartReceData = UartReceData..data
- UartReceCnt = UartReceCnt + 1
- end,0)
- tmr.alarm(1,10,1,function()
- if UartReceCnt ~= 0 then
- if UartReceTempCnt == UartReceCnt then
- UartReceCnt = 0
- UartReceTempCnt = 0
- if UartReceData == "open" then
- gpio.write(RELAY_Pin,1)
- if file.open("mode.lua", "w+") then
- file.writeline("RELAY=1")
- file.flush()
- else
- print("open mode.lua faild")
- end
- file.close()
- elseif UartReceData == "close" then
- gpio.write(RELAY_Pin,0)
- if file.open("mode.lua", "w+") then
- file.writeline("RELAY=0")
- file.flush()
- else
- print("open mode.lua faild")
- end
- file.close()
- elseif UartReceData == "rest" then
- node.restart()
- end
- uart.write(0,UartReceData)
- UartReceData = ""
- UartReceCnt = 0
- else
- UartReceTempCnt = UartReceCnt
- end
- end
- end)
复制代码
file.lua文件结束
官方文档: https://nodemcu.readthedocs.io/en/master/en/modules/file/
用到的函数简单介绍:
1. file.open(filename, mode) 打开文件以进行访问,可能会创建它(对于写入模式)
参数: fliename 要打开的文件
mode: r 读模式(默认)
w 写模式
a 附加模式
r+ 更新模式,保留所有先前的数据
w+ 更新模式,删除所有先前的数据
a+ 追加更新模式,保留以前的数据,只允许在文件末尾写入
返回: 文件对象,如果文件打开确定。nil如果文件未打开或不存在(读取模式)
2. file.writeline(string) 将字符串写入打开的文件,并在末尾附加' n'
参数: string 要写入文件的内容
返回:true 如果写得好,nil 就出错了
3. file.readline() 从打开的文件中读取下一行。行被定义为以EOL (' n')字节结尾的零个或多个字节。如果下一行超过1024,则此函数仅返回前1024个字节。
参数: 无
返回: 文件内容以字符串形式逐行显示,包括EOL(' n')。nilEOF 时返回
4. file.close() 关闭打开的文件(如果有)。
参数 无
返回: nil
5. file.flush() 刷新对文件系统的任何挂起写入,确保重启时不会丢失任何数据
参数: 无
返回: nil
|