二,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閱讀 228,739評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,634評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,653評論 0 377
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,063評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,835評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,235評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,315評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,459評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,000評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,819評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,004評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,560評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,257評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,676評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,937評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,717評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,003評論 2 374

推薦閱讀更多精彩內容