讓這個(gè)燈亮
我們寫(xiě)lua用這個(gè)軟件
鏈接:http://pan.baidu.com/s/1kVN09cr 密碼:pfv7
http://www.cnblogs.com/yangfengwu/p/6247048.html這個(gè)有點(diǎn)使用說(shuō)明
這個(gè)燈連接到了GPIO2,低電平點(diǎn)亮
[html]view plaincopy
gpio.mode(4,gpio.OUTPUT)--輸出模式
gpio.write(4,0)--輸出低電平
這兩句話(huà)就亮了
可能會(huì)有疑問(wèn),明明是GPIO2為什么填4
看資料
https://nodemcu.readthedocs.io/en/master/en/modules/gpio/#gpio-module
還有一個(gè)簡(jiǎn)介版的資料
鏈接:http://pan.baidu.com/s/1pL3FHgf密碼:l2nm
對(duì)照表
現(xiàn)在下進(jìn)去
保存到芯片里面
現(xiàn)在控制板子上的繼電器,改一下IO口就可以了
所以呢讓繼電器吸合
[html]view plaincopy
gpio.mode(2,gpio.OUTPUT)
gpio.write(2,1)
關(guān)于
gpio.read()
引腳是低電平返回0,外部引腳是高電平返回1
如果設(shè)置的輸出高電平,但是如果拉低了引腳,也是返回0,,,,和控制狀態(tài)沒(méi)有關(guān)系,只與
當(dāng)前引腳的實(shí)際高低電平有關(guān)系
現(xiàn)在看定時(shí)器函數(shù)
第一個(gè)參數(shù) 一共可以同時(shí)使用7個(gè)定時(shí)器,,id號(hào)呢是0-6
第二個(gè)參數(shù)是延時(shí)多少ms執(zhí)行最后面的函數(shù)
第三個(gè)參數(shù)是設(shè)置是只執(zhí)行一次,,還是調(diào)用啟動(dòng)函數(shù)時(shí)執(zhí)行一下,還是一直間隔第二個(gè)參數(shù)的時(shí)間執(zhí)行最后面的函數(shù)
就讓它每隔1s打印一下串口打印111111
[html]view plaincopy
gpio.mode(4,gpio.OUTPUT)
gpio.write(4,1)
function?aa()--定義一個(gè)函數(shù)
print("111111")
end
tmr.alarm(0,?1000,?1,?aa)
0代表用的標(biāo)號(hào)為0的定時(shí)器
1000代表延時(shí)1000ms執(zhí)行aa
1代表
當(dāng)然您填tmr.ALARM_AUTO也行,,,,,太長(zhǎng)啦.....我還是選擇填1
如果填寫(xiě)0,那么會(huì)延時(shí)1000ms然后打印一下111111,,就是第二個(gè)參數(shù)
如果還想執(zhí)行一下就調(diào)用tmr.start(0)這個(gè)里面的0代表的標(biāo)號(hào)為0的定時(shí)器....
當(dāng)然啦關(guān)閉這個(gè)定時(shí)器tmr.start(0)
感覺(jué)第一個(gè)參數(shù) ?tmr.ALARM_SINGLE = -1...只是感覺(jué)沒(méi)有試過(guò)
更方便點(diǎn)呢
[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
剩余的定時(shí)器的方法呢有可能tmr.delay(us)? 會(huì)用到,,就是延時(shí)多少u(mài)s......
看一下串口....
說(shuō)一下哈...配置串口是一件及其危險(xiǎn)的事情,為什么這樣說(shuō)呢!!
我們燒固件是通過(guò)串口,把我們編寫(xiě)的.lua文件保存到模塊里面也是通過(guò)串口
如果說(shuō)哈模塊一上電就執(zhí)行了我們配置的串口程序,,,,,那么我們想把新寫(xiě)的程序發(fā)給模塊就可能寫(xiě)不進(jìn)去.....造成一個(gè)bug了,,,,,
解決方案是
一,重新燒寫(xiě)固件
但是呢也有可能重新燒寫(xiě)固件也不能把以前寫(xiě)的.lua文件清除
二,先燒寫(xiě)別的固件,再燒寫(xiě)現(xiàn)在的
比如:可以先燒寫(xiě)一個(gè)AT指令的固件,讓它運(yùn)行一下,然后再重新燒寫(xiě)lua開(kāi)發(fā)版本的,但是也有可能不能把以前寫(xiě)的.lua文件清除
三,修改程序保存的偏移量
您想哈,,我們的.lua程序肯定也在flash里面,,,我燒寫(xiě)固件時(shí)把偏移量調(diào)大肯定能把我們寫(xiě)的.lua代碼給清除掉.要是調(diào)整后出現(xiàn)一直發(fā)亂碼,,恭喜你哈,肯定覆蓋到了先前的.lua了...然后呢我再把偏移量調(diào)整到0000重新燒寫(xiě)就好啦...
如果出現(xiàn)
等著格式化文件系統(tǒng),,就等著哈
好現(xiàn)在做一個(gè)程序我發(fā)給串口什么數(shù)據(jù),串口就回給我什么數(shù)據(jù)
下面的功能可以實(shí)現(xiàn)但是別這樣寫(xiě),我只是來(lái)解釋函數(shù)....否則親們就按照上面的方法刷固件把
第一個(gè)參數(shù)只有"data",,說(shuō)明是接收串口的數(shù)據(jù)
第二個(gè)參數(shù)寫(xiě)0就是說(shuō)串口接收的數(shù)據(jù)存在了Revdata里面,,,說(shuō)一下哈Revdata是一個(gè)字符串變量,,接著看后面也會(huì)提及...寫(xiě)小于255的數(shù)就代表,接收到這個(gè)數(shù)目才執(zhí)行uart.write(0,Revdata) ,,,,如果寫(xiě)別的"X" ,就代表接收到字符X后就執(zhí)行uart.write(0,Revdata)
第三個(gè)參數(shù)是函數(shù),串口接收到數(shù)據(jù)就會(huì)調(diào)用這個(gè)函數(shù),并把接收到的數(shù)據(jù)存到Revdata里面然后調(diào)用uart.write(0,Revdata) 把數(shù)據(jù)再傳回串口,,,參數(shù)0是說(shuō)用串口0,,當(dāng)然咱們使用的就是串口0,,,.其實(shí)還有串口1,,不過(guò)呢串口1只有TX引腳引了出來(lái),還有串口2,不過(guò)呢
即使uart.write(2,Revdata) 寫(xiě)上串口2,信息還會(huì)默認(rèn)發(fā)給串口0
第四個(gè)參數(shù)寫(xiě)0吧
第一種方案這樣寫(xiě)
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)
程序啟動(dòng)以后等待2s執(zhí)行下面的函數(shù),,定時(shí)器第三個(gè)參數(shù)寫(xiě)的0,所以這個(gè)定時(shí)器就關(guān)閉了
1.uart.on("data",0,function(Revdata)2.3.? ? ? ? ? ? uart.write(0,Revdata)4.5.? ? end,0)
只要一執(zhí)行這個(gè)函數(shù),那么以后串口接收到數(shù)據(jù)就會(huì)執(zhí)行
uart.write(0,Revdata)
現(xiàn)在用串口助手測(cè)試一下
現(xiàn)在我假如修改了程序想重新寫(xiě)入芯片
復(fù)位芯片后趕緊點(diǎn)擊,,當(dāng)然有兩秒時(shí)間
如果程序小有時(shí)候可以直接
如果程序大點(diǎn),,可以再?gòu)?fù)位一下模塊然后再...當(dāng)然假設(shè)下載的時(shí)間不會(huì)超過(guò)兩秒
假設(shè)程序很大
復(fù)位芯片后趕緊點(diǎn)擊,,當(dāng)然有兩秒時(shí)間
然后看這里
只要移除掉init.lua一切都好辦
那我先右擊準(zhǔn)備好點(diǎn)擊,,,,然后呢我復(fù)位一下模塊,然后在兩秒之前點(diǎn)擊就移除了init.lua
還有
也是復(fù)位后再點(diǎn)擊是,,,移除芯片內(nèi)部所有文件..........這個(gè)隨時(shí)可以用,,不用像上面似的事先編譯
當(dāng)然這只是在自己配置了串口之后的特殊情況下才會(huì)遇到的問(wèn)題哈
做到這里有些人會(huì)想,能不能配置收到什么數(shù)據(jù)就去干點(diǎn)什么
我們就配置收到H 就控制繼電器引腳輸出高電平,收到L就控制繼電器引腳輸出低電平
print("Relay=1")
print("Relay=0")
相當(dāng)于printf,,,,把里面的字符串內(nèi)容發(fā)送到串口
不過(guò)呢這個(gè)慎用,,因?yàn)橛龅?\0'就默認(rèn)發(fā)送'\0'以前的數(shù)據(jù),,,所以對(duì)于 byte類(lèi)型的 0
它認(rèn)為是?'\0',,,用它打印字符串還是蠻不錯(cuò)的
[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)
現(xiàn)在用串口調(diào)試助手測(cè)試
好現(xiàn)在換一下命令,配置收到++H 就控制繼電器引腳輸出高電平,收到++L就控制繼電器引腳輸出低電平
如果按照下面寫(xiě)竟然不管來(lái)了
[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)
現(xiàn)在發(fā)送的時(shí)候多加一個(gè)加號(hào)
也就是+++H ? ?+++L
用串口調(diào)試助手來(lái)調(diào)試,,ESPlorer 這個(gè)軟件的串口有些問(wèn)題
您會(huì)發(fā)現(xiàn)居然這樣可以
告訴您原因
其實(shí)是因?yàn)榇谙冉邮樟艘粋€(gè)+ 然后又接收的++H 所以可以控制
所以先前的++H ?是串口先接收了一個(gè)+ ?然后又接收了 +H ?所以不能控制了
不信的話(huà)可以打印一下,,修改為下面的程序
[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)
其實(shí)
這地方寫(xiě)0,就代表了串口接收到1個(gè)數(shù)據(jù)就會(huì)進(jìn)入中斷函數(shù)function(Revdata)
解決方法
我是不愿意使用控制接收到多少個(gè)字節(jié),或者加入一個(gè)標(biāo)志,,,,還記得AT指令要加換行不......那是因?yàn)?\r".接收到換行....
我的做法...我用定時(shí)器做空閑檢測(cè)
關(guān)于Lua的部分語(yǔ)法可以看,,其實(shí)了解就行,,當(dāng)時(shí)自己以為需要把lua學(xué)的很好才能用lua開(kāi)發(fā)8266,,,最后才知道只需要了解些語(yǔ)法就好了,,剩下的看8266的API文檔看怎么使用那些函數(shù)就行.....
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的程序
串口中斷接收數(shù)據(jù)
定時(shí)器做檢測(cè)
可以參考的文章
http://www.cnblogs.com/yangfengwu/p/6746403.html這個(gè)較早,后期改進(jìn)了
http://www.cnblogs.com/yangfengwu/p/7341056.html在文章中找哈
http://www.cnblogs.com/yangfengwu/p/6921832.html在文章中找哈
現(xiàn)在說(shuō)一下SPI,,其實(shí)呢為什么說(shuō)spi呢,,,,咱的模塊最終99.99%都會(huì)設(shè)計(jì)成,發(fā)給模塊串口的數(shù)據(jù)自動(dòng)轉(zhuǎn)發(fā)到網(wǎng)絡(luò),,,,,模塊網(wǎng)絡(luò)接收的數(shù)據(jù)自動(dòng)轉(zhuǎn)發(fā)到模塊的串口對(duì)吧!!!!
那么如果想靈活的配置模塊要么通過(guò)串口,要么通過(guò)其它方式比如說(shuō)SPI方式....串口剛才說(shuō)了主要用于用戶(hù)傳輸數(shù)據(jù)使用.....那么我們自己寫(xiě)的靈活配置模塊的程序也需要通過(guò)一種通信方式告訴模塊哈...當(dāng)然也可以選擇IIC,或者自己控制模塊的引腳自己編一個(gè)
感覺(jué)這篇說(shuō)的夠多的了,下一篇再說(shuō)SPI,關(guān)鍵是自己去做,,自己去做,,自己去做.........