STM32/STM8技术论坛
直播中

多发事件

11年用户 109经验值
擅长:嵌入式技术 接口/总线/驱动 控制/MCU
私信 关注
[经验]

制作自己的wifi开关 ESP8266 lua开发数据存储 记录继电器断电前的状态

ESP8266控制继电器原理图
0.png


1.先测试一下简单的数据存储和读取
上电延时2秒加载file.lua文件,file.lua文件中写入数据到mode.lua文件,再延时5秒读出数据通过串口打印数据
操作流程:
(1)手写创建打开一个文件file.open("mode.lua", "w+")(写方式打开)
(2)向文件中写入数据file.writeline()
(3)读取文件并打印内容
(4)关闭文件

init.lua文件:
  1. tmr.alarm(0,2000,0,function()
  2.      dofile("file.lua")
  3. end)
init.lua文件结束
file.lua文件:
  1. if  file.open("mode.lua", "w+") then
  2.     file.writeline("abc")
  3.     file.flush()
  4.     file.writeline("222")
  5.     file.flush()
  6.     file.writeline("666")
  7.     file.close()
  8. else
  9.     print("open mode.lua faild")   
  10. end
  11. tmr.alarm(1,5000,0,function()
  12.     if file.open("mode.lua", "r") then
  13.         s1= file.readline()
  14.         print(s1)
  15.         s1= file.readline()
  16.         print(s1)
  17.         s1= file.readline()
  18.        print(s1)
  19.        file.close()
  20.     end
  21. end)
file.lua文件结束
1.png

2. 通过串口助手,发送数据控制继电器状态, 同时把继电器的状态写入mode.lua文件中当断电后,再次上电时恢复继电器的状态
当然控制继电器的状态不止可以用串口,也可以使用让模块建立TCP服务器,使用手机版的调试助手控制继电器,这里只是抛块砖...


使用串口控制继电器的lua源码只需要两个.lua文件"init.lua"和"file.lua"文件即可,ESP8266模块烧写lua开发固件后,直接把这两个.lua文件上传到模块即可
init.lua文件:
  1. RELAY_Stat = ""
  2. RELAY_Pin = 1
  3. gpio.mode(RELAY_Pin, gpio.OUTPUT)
  4. if file.open("mode.lua", "r") then
  5.     RELAY_Stat = file.readline()
  6.     print(RELAY_Stat)
  7.     file.close()
  8. end
  9. if string.find(RELAY_Stat,"RELAY=1",1) then
  10.     gpio.write(RELAY_Pin,1)
  11. elseif string.find(RELAY_Stat,"RELAY=0",1) then
  12.     gpio.write(RELAY_Pin,0)
  13. end
  14. tmr.alarm(0,4000,0,function()
  15.     print(RELAY_Stat)
  16.     dofile("file.lua")
  17. end)
init.lua文件结束
file.lua文件:
  1. UartReceCnt = 0        
  2. UartReceTempCnt = 0   
  3. UartReceData = ""   

  4. uart.on("data",0,function(data)
  5.     UartReceData = UartReceData..data
  6.     UartReceCnt = UartReceCnt + 1     
  7. end,0)   
  8. tmr.alarm(1,10,1,function()
  9.     if UartReceCnt ~= 0 then
  10.     if UartReceTempCnt == UartReceCnt then  
  11.         UartReceCnt = 0
  12.         UartReceTempCnt = 0
  13.         if UartReceData == "open" then  
  14.             gpio.write(RELAY_Pin,1)
  15.             if  file.open("mode.lua", "w+") then
  16.                 file.writeline("RELAY=1")
  17.                 file.flush()
  18.             else
  19.                 print("open mode.lua faild")
  20.             end
  21.             file.close()
  22.         elseif UartReceData == "close" then
  23.              gpio.write(RELAY_Pin,0)  
  24.              if  file.open("mode.lua", "w+") then
  25.                  file.writeline("RELAY=0")
  26.                  file.flush()
  27.              else
  28.                  print("open mode.lua faild")
  29.               end
  30.                file.close()
  31.         elseif UartReceData == "rest" then
  32.                node.restart()
  33.         end
  34.         uart.write(0,UartReceData)
  35.         UartReceData = ""  
  36.         UartReceCnt = 0
  37.     else
  38.         UartReceTempCnt = UartReceCnt  
  39.     end
  40.     end
  41. end)
file.lua文件结束
2.png

3.png

[media]http://v.youku.com/v_show/id_XMzkxMTAyOTI0MA==.html?x&sharefrom=android&sharekey=c9e039f4aa34691fa4cca95cad2da02e2[/media]

官方文档: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



lua源码数据储存.zip (830 Bytes)
(下载次数: 13, 2018-11-9 13:27 上传)



更多回帖

发帖
×
20
完善资料,
赚取积分