二,ESP8266 GPIO和SPI和定時(shí)器和串口(基于Lua腳本語(yǔ)言)

讓這個(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)鍵是自己去做,,自己去做,,自己去做.........

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市起宽,隨后出現(xiàn)的幾起案子牺丙,更是在濱河造成了極大的恐慌豫尽,老刑警劉巖炭晒,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件执庐,死亡現(xiàn)場(chǎng)離奇詭異贰镣,居然都是意外死亡呆躲,警方通過(guò)查閱死者的電腦和手機(jī)异逐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)插掂,“玉大人灰瞻,你說(shuō)我怎么就攤上這事「ㄉ” “怎么了酝润?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)璃弄。 經(jīng)常有香客問(wèn)我要销,道長(zhǎng),這世上最難降的妖魔是什么夏块? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任疏咐,我火速辦了婚禮,結(jié)果婚禮上脐供,老公的妹妹穿的比我還像新娘浑塞。我一直安慰自己,他們只是感情好政己,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布酌壕。 她就那樣靜靜地躺著,像睡著了一般歇由。 火紅的嫁衣襯著肌膚如雪卵牍。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天沦泌,我揣著相機(jī)與錄音糊昙,去河邊找鬼。 笑死谢谦,一個(gè)胖子當(dāng)著我的面吹牛释牺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播他宛,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼船侧,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了厅各?” 一聲冷哼從身側(cè)響起镜撩,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后袁梗,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體宜鸯,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年遮怜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了淋袖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锯梁,死狀恐怖即碗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情陌凳,我是刑警寧澤剥懒,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站合敦,受9級(jí)特大地震影響初橘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜充岛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一保檐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧崔梗,春花似錦夜只、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)爪膊。三九已至权悟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間推盛,已是汗流浹背峦阁。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留耘成,地道東北人榔昔。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像瘪菌,于是被迫代替她去往敵國(guó)和親撒会。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容