二,ESP8266 GPIO和SPI和定时器和串口(基于Lua脚本语言)

让这个灯亮

我们写lua用这个软件

链接:http://pan.baidu.com/s/1kVN09cr 密码:pfv7

http://www.cnblogs.com/yangfengwu/p/6247048.html这个有点使用说明

这个灯连接到了GPIO2,低电平点亮

[html]view plaincopy

gpio.mode(4,gpio.OUTPUT)--输出模式

gpio.write(4,0)--输出低电平

这两句话就亮了

可能会有疑问,明明是GPIO2为什么填4

看资料

https://nodemcu.readthedocs.io/en/master/en/modules/gpio/#gpio-module

还有一个简介版的资料

链接:http://pan.baidu.com/s/1pL3FHgf密码:l2nm

对照表

现在下进去

保存到芯片里面

现在控制板子上的继电器,改一下IO口就可以了

所以呢让继电器吸合

[html]view plaincopy

gpio.mode(2,gpio.OUTPUT)

gpio.write(2,1)

关于

gpio.read()

引脚是低电平返回0,外部引脚是高电平返回1

如果设置的输出高电平,但是如果拉低了引脚,也是返回0,,,,和控制状态没有关系,只与

当前引脚的实际高低电平有关系

现在看定时器函数

第一个参数 一共可以同时使用7个定时器,,id号呢是0-6

第二个参数是延时多少ms执行最后面的函数

第三个参数是设置是只执行一次,,还是调用启动函数时执行一下,还是一直间隔第二个参数的时间执行最后面的函数

就让它每隔1s打印一下串口打印111111

[html]view plaincopy

gpio.mode(4,gpio.OUTPUT)

gpio.write(4,1)

function aa()--定义一个函数

print("111111")

end

tmr.alarm(0, 1000, 1, aa)

0代表用的标号为0的定时器

1000代表延时1000ms执行aa

1代表

当然您填tmr.ALARM_AUTO也行,,,,,太长啦.....我还是选择填1

如果填写0,那么会延时1000ms然后打印一下111111,,就是第二个参数

如果还想执行一下就调用tmr.start(0)这个里面的0代表的标号为0的定时器....

当然啦关闭这个定时器tmr.start(0)

感觉第一个参数  tmr.ALARM_SINGLE = -1...只是感觉没有试过

更方便点呢

[html]view plaincopy

gpio.mode(4,gpio.OUTPUT)

gpio.write(4,1)

tmr.alarm(1, 1000, 1, function()

print("111111")

end)

可以看一下我这篇文章

http://www.cnblogs.com/yangfengwu/p/6404695.html

剩余的定时器的方法呢有可能tmr.delay(us)  会用到,,就是延时多少us......

看一下串口....

说一下哈...配置串口是一件及其危险的事情,为什么这样说呢!!

我们烧固件是通过串口,把我们编写的.lua文件保存到模块里面也是通过串口

如果说哈模块一上电就执行了我们配置的串口程序,,,,,那么我们想把新写的程序发给模块就可能写不进去.....造成一个bug了,,,,,

解决方案是

一,重新烧写固件

但是呢也有可能重新烧写固件也不能把以前写的.lua文件清除

二,先烧写别的固件,再烧写现在的

比如:可以先烧写一个AT指令的固件,让它运行一下,然后再重新烧写lua开发版本的,但是也有可能不能把以前写的.lua文件清除

三,修改程序保存的偏移量

您想哈,,我们的.lua程序肯定也在flash里面,,,我烧写固件时把偏移量调大肯定能把我们写的.lua代码给清除掉.要是调整后出现一直发乱码,,恭喜你哈,肯定覆盖到了先前的.lua了...然后呢我再把偏移量调整到0000重新烧写就好啦...

如果出现

等着格式化文件系统,,就等着哈

好现在做一个程序我发给串口什么数据,串口就回给我什么数据

下面的功能可以实现但是别这样写,我只是来解释函数....否则亲们就按照上面的方法刷固件把

第一个参数只有"data",,说明是接收串口的数据

第二个参数写0就是说串口接收的数据存在了Revdata里面,,,说一下哈Revdata是一个字符串变量,,接着看后面也会提及...写小于255的数就代表,接收到这个数目才执行uart.write(0,Revdata) ,,,,如果写别的"X" ,就代表接收到字符X后就执行uart.write(0,Revdata)

第三个参数是函数,串口接收到数据就会调用这个函数,并把接收到的数据存到Revdata里面然后调用uart.write(0,Revdata) 把数据再传回串口,,,参数0是说用串口0,,当然咱们使用的就是串口0,,,.其实还有串口1,,不过呢串口1只有TX引脚引了出来,还有串口2,不过呢

即使uart.write(2,Revdata) 写上串口2,信息还会默认发给串口0

第四个参数写0吧

第一种方案这样写

gpio.mode(4,gpio.OUTPUT)

gpio.write(4,1)

tmr.alarm(1,2000,0, function()

uart.on("data",0,function(Revdata)

uart.write(0,Revdata)

end,0)

end)

程序启动以后等待2s执行下面的函数,,定时器第三个参数写的0,所以这个定时器就关闭了

1.uart.on("data",0,function(Revdata)2.3.            uart.write(0,Revdata)4.5.    end,0)

只要一执行这个函数,那么以后串口接收到数据就会执行

uart.write(0,Revdata)

现在用串口助手测试一下

现在我假如修改了程序想重新写入芯片

复位芯片后赶紧点击,,当然有两秒时间

如果程序小有时候可以直接

如果程序大点,,可以再复位一下模块然后再...当然假设下载的时间不会超过两秒

假设程序很大

复位芯片后赶紧点击,,当然有两秒时间

然后看这里

只要移除掉init.lua一切都好办

那我先右击准备好点击,,,,然后呢我复位一下模块,然后在两秒之前点击就移除了init.lua

还有

也是复位后再点击是,,,移除芯片内部所有文件..........这个随时可以用,,不用像上面似的事先编译

当然这只是在自己配置了串口之后的特殊情况下才会遇到的问题哈

做到这里有些人会想,能不能配置收到什么数据就去干点什么

我们就配置收到H 就控制继电器引脚输出高电平,收到L就控制继电器引脚输出低电平

print("Relay=1")

print("Relay=0")

相当于printf,,,,把里面的字符串内容发送到串口

不过呢这个慎用,,因为遇到'\0'就默认发送'\0'以前的数据,,,所以对于 byte类型的 0

它认为是 '\0',,,用它打印字符串还是蛮不错的

[html]view plaincopy

gpio.mode(4,gpio.OUTPUT)

gpio.mode(2,gpio.OUTPUT)

gpio.write(4,1)

tmr.alarm(1, 2000, 0, function()

uart.on("data", 0,function(Revdata)

ifRevdata == "H" then

gpio.write(2,1)

print("Relay=1")

end

ifRevdata == "L" then

gpio.write(2,0)

print("Relay=0")

end

uart.write(0,Revdata)

end, 0)

end)

现在用串口调试助手测试

好现在换一下命令,配置收到++H 就控制继电器引脚输出高电平,收到++L就控制继电器引脚输出低电平

如果按照下面写竟然不管来了

[html]view plaincopy

gpio.mode(4,gpio.OUTPUT)

gpio.mode(2,gpio.OUTPUT)

gpio.write(4,1)

tmr.alarm(1, 2000, 0, function()

uart.on("data", 0,function(Revdata)

ifRevdata == "++H" then

gpio.write(2,1)

print("Relay=1")

end

ifRevdata == "++L" then

gpio.write(2,0)

print("Relay=0")

end

uart.write(0,Revdata) -- unregister callback function

end, 0)

end)

现在发送的时候多加一个加号

也就是+++H    +++L

用串口调试助手来调试,,ESPlorer 这个软件的串口有些问题

您会发现居然这样可以

告诉您原因

其实是因为串口先接收了一个+ 然后又接收的++H 所以可以控制

所以先前的++H  是串口先接收了一个+  然后又接收了 +H  所以不能控制了

不信的话可以打印一下,,修改为下面的程序

[html]view plaincopy

gpio.mode(4,gpio.OUTPUT)

gpio.mode(2,gpio.OUTPUT)

gpio.write(4,1)

tmr.alarm(1, 2000, 0, function()

uart.on("data", 0,function(Revdata)

ifRevdata == "++H" then

gpio.write(2,1)

print("Relay=1")

else

print(Revdata)----LOOK  LOOK  LOOK

end

ifRevdata == "++L" then

gpio.write(2,0)

print("Relay=0")

end

uart.write(0,Revdata) -- unregister callback function

end, 0)

end)

其实

这地方写0,就代表了串口接收到1个数据就会进入中断函数function(Revdata)

解决方法

我是不愿意使用控制接收到多少个字节,或者加入一个标志,,,,还记得AT指令要加换行不......那是因为"\r".接收到换行....

我的做法...我用定时器做空闲检测

关于Lua的部分语法可以看,,其实了解就行,,当时自己以为需要把lua学的很好才能用lua开发8266,,,最后才知道只需要了解些语法就好了,,剩下的看8266的API文档看怎么使用那些函数就行.....

http://www.cnblogs.com/yangfengwu/p/6357838.html

http://www.cnblogs.com/yangfengwu/p/6358444.html

http://www.cnblogs.com/yangfengwu/p/6366428.html

http://www.cnblogs.com/yangfengwu/p/6376098.html

[html]view plaincopy

gpio.mode(4,gpio.OUTPUT)

gpio.mode(2,gpio.OUTPUT)

gpio.write(4,1)

ReadData=""

ReadDataCopy=""

ReadCnt=0

ReadCntCopy=0

tmr.alarm(2, 5, 1, function()

if  ReadCnt ~= 0 then

ifReadCnt == ReadCntt then

ReadCnt =0

ReadCntt =0

ReadDataCopy =ReadData

ReadData =""

ifReadDataCopy == "++H" then

gpio.write(2,1)

end

ifReadDataCopy == "++L" then

gpio.write(2,0)

end

else

ReadCntt =ReadCnt

end

end

end)

tmr.alarm(1, 2000, 0, function()

uart.on("data", 0,function(Revdata)

ReadData =ReadData..Revdata

ReadCnt =ReadCnt + 1

end, 0)

end)

空闲中断..............

可以先看一下自己51的程序

串口中断接收数据

定时器做检测

可以参考的文章

http://www.cnblogs.com/yangfengwu/p/6746403.html这个较早,后期改进了

http://www.cnblogs.com/yangfengwu/p/7341056.html在文章中找哈

http://www.cnblogs.com/yangfengwu/p/6921832.html在文章中找哈

现在说一下SPI,,其实呢为什么说spi呢,,,,咱的模块最终99.99%都会设计成,发给模块串口的数据自动转发到网络,,,,,模块网络接收的数据自动转发到模块的串口对吧!!!!

那么如果想灵活的配置模块要么通过串口,要么通过其它方式比如说SPI方式....串口刚才说了主要用于用户传输数据使用.....那么我们自己写的灵活配置模块的程序也需要通过一种通信方式告诉模块哈...当然也可以选择IIC,或者自己控制模块的引脚自己编一个

感觉这篇说的够多的了,下一篇再说SPI,关键是自己去做,,自己去做,,自己去做.........

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,482评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,377评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,762评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,273评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,289评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,046评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,351评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,988评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,476评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,948评论 2 324
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,064评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,712评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,261评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,264评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,486评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,511评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,802评论 2 345

推荐阅读更多精彩内容