讓這個燈亮
我們寫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
對照表

現(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)沒有關(guān)系,只與
當(dāng)前引腳的實際高低電平有關(guān)系
現(xiàn)在看定時器函數(shù)

第一個參數(shù) 一共可以同時使用7個定時器,,id號呢是0-6
第二個參數(shù)是延時多少ms執(zhí)行最后面的函數(shù)
第三個參數(shù)是設(shè)置是只執(zhí)行一次,,還是調(diào)用啟動函數(shù)時執(zhí)行一下,還是一直間隔第二個參數(shù)的時間執(zhí)行最后面的函數(shù)
就讓它每隔1s打印一下串口打印111111
[html]view plaincopy
gpio.mode(4,gpio.OUTPUT)
gpio.write(4,1)
function?aa()--定義一個函數(shù)
print("111111")
end
tmr.alarm(0,?1000,?1,?aa)
0代表用的標(biāo)號為0的定時器
1000代表延時1000ms執(zhí)行aa
1代表
當(dāng)然您填tmr.ALARM_AUTO也行,,,,,太長啦.....我還是選擇填1
如果填寫0,那么會延時1000ms然后打印一下111111,,就是第二個參數(shù)
如果還想執(zhí)行一下就調(diào)用tmr.start(0)這個里面的0代表的標(biāo)號為0的定時器....
當(dāng)然啦關(guān)閉這個定時器tmr.start(0)
感覺第一個參數(shù) ?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文件保存到模塊里面也是通過串口
如果說哈模塊一上電就執(zhí)行了我們配置的串口程序,,,,,那么我們想把新寫的程序發(fā)給模塊就可能寫不進(jìn)去.....造成一個bug了,,,,,
解決方案是
一,重新燒寫固件
但是呢也有可能重新燒寫固件也不能把以前寫的.lua文件清除
二,先燒寫別的固件,再燒寫現(xiàn)在的
比如:可以先燒寫一個AT指令的固件,讓它運行一下,然后再重新燒寫lua開發(fā)版本的,但是也有可能不能把以前寫的.lua文件清除
三,修改程序保存的偏移量

您想哈,,我們的.lua程序肯定也在flash里面,,,我燒寫固件時把偏移量調(diào)大肯定能把我們寫的.lua代碼給清除掉.要是調(diào)整后出現(xiàn)一直發(fā)亂碼,,恭喜你哈,肯定覆蓋到了先前的.lua了...然后呢我再把偏移量調(diào)整到0000重新燒寫就好啦...
如果出現(xiàn)
等著格式化文件系統(tǒng),,就等著哈
好現(xiàn)在做一個程序我發(fā)給串口什么數(shù)據(jù),串口就回給我什么數(shù)據(jù)
下面的功能可以實現(xiàn)但是別這樣寫,我只是來解釋函數(shù)....否則親們就按照上面的方法刷固件把

第一個參數(shù)只有"data",,說明是接收串口的數(shù)據(jù)
第二個參數(shù)寫0就是說串口接收的數(shù)據(jù)存在了Revdata里面,,,說一下哈Revdata是一個字符串變量,,接著看后面也會提及...寫小于255的數(shù)就代表,接收到這個數(shù)目才執(zhí)行uart.write(0,Revdata) ,,,,如果寫別的"X" ,就代表接收到字符X后就執(zhí)行uart.write(0,Revdata)
第三個參數(shù)是函數(shù),串口接收到數(shù)據(jù)就會調(diào)用這個函數(shù),并把接收到的數(shù)據(jù)存到Revdata里面然后調(diào)用uart.write(0,Revdata) 把數(shù)據(jù)再傳回串口,,,參數(shù)0是說用串口0,,當(dāng)然咱們使用的就是串口0,,,.其實還有串口1,,不過呢串口1只有TX引腳引了出來,還有串口2,不過呢
即使uart.write(2,Revdata) 寫上串口2,信息還會默認(rèn)發(fā)給串口0
第四個參數(shù)寫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執(zhí)行下面的函數(shù),,定時器第三個參數(shù)寫的0,所以這個定時器就關(guān)閉了

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

只要一執(zhí)行這個函數(shù),那么以后串口接收到數(shù)據(jù)就會執(zhí)行
uart.write(0,Revdata)
現(xiàn)在用串口助手測試一下

現(xiàn)在我假如修改了程序想重新寫入芯片
復(fù)位芯片后趕緊點擊,,當(dāng)然有兩秒時間

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

如果程序大點,,可以再復(fù)位一下模塊然后再...當(dāng)然假設(shè)下載的時間不會超過兩秒

假設(shè)程序很大
復(fù)位芯片后趕緊點擊,,當(dāng)然有兩秒時間

然后看這里

只要移除掉init.lua一切都好辦
那我先右擊準(zhǔn)備好點擊,,,,然后呢我復(fù)位一下模塊,然后在兩秒之前點擊就移除了init.lua

還有

也是復(fù)位后再點擊是,,,移除芯片內(nèi)部所有文件..........這個隨時可以用,,不用像上面似的事先編譯
當(dāng)然這只是在自己配置了串口之后的特殊情況下才會遇到的問題哈
做到這里有些人會想,能不能配置收到什么數(shù)據(jù)就去干點什么
我們就配置收到H 就控制繼電器引腳輸出高電平,收到L就控制繼電器引腳輸出低電平
print("Relay=1")
print("Relay=0")
相當(dāng)于printf,,,,把里面的字符串內(nèi)容發(fā)送到串口
不過呢這個慎用,,因為遇到'\0'就默認(rèn)發(fā)送'\0'以前的數(shù)據(jù),,,所以對于 byte類型的 0
它認(rèn)為是?'\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)
現(xiàn)在用串口調(diào)試助手測試


好現(xiàn)在換一下命令,配置收到++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)

現(xiàn)在發(fā)送的時候多加一個加號
也就是+++H ? ?+++L
用串口調(diào)試助手來調(diào)試,,ESPlorer 這個軟件的串口有些問題

您會發(fā)現(xiàn)居然這樣可以
告訴您原因
其實是因為串口先接收了一個+ 然后又接收的++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個數(shù)據(jù)就會進(jìn)入中斷函數(shù)function(Revdata)
解決方法

我是不愿意使用控制接收到多少個字節(jié),或者加入一個標(biāo)志,,,,還記得AT指令要加換行不......那是因為"\r".接收到換行....
我的做法...我用定時器做空閑檢測
關(guān)于Lua的部分語法可以看,,其實了解就行,,當(dāng)時自己以為需要把lua學(xué)的很好才能用lua開發(fā)8266,,,最后才知道只需要了解些語法就好了,,剩下的看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ù)

定時器做檢測

可以參考的文章
http://www.cnblogs.com/yangfengwu/p/6746403.html這個較早,后期改進(jìn)了
http://www.cnblogs.com/yangfengwu/p/7341056.html在文章中找哈
http://www.cnblogs.com/yangfengwu/p/6921832.html在文章中找哈
現(xiàn)在說一下SPI,,其實呢為什么說spi呢,,,,咱的模塊最終99.99%都會設(shè)計成,發(fā)給模塊串口的數(shù)據(jù)自動轉(zhuǎn)發(fā)到網(wǎng)絡(luò),,,,,模塊網(wǎng)絡(luò)接收的數(shù)據(jù)自動轉(zhuǎn)發(fā)到模塊的串口對吧!!!!
那么如果想靈活的配置模塊要么通過串口,要么通過其它方式比如說SPI方式....串口剛才說了主要用于用戶傳輸數(shù)據(jù)使用.....那么我們自己寫的靈活配置模塊的程序也需要通過一種通信方式告訴模塊哈...當(dāng)然也可以選擇IIC,或者自己控制模塊的引腳自己編一個
感覺這篇說的夠多的了,下一篇再說SPI,關(guān)鍵是自己去做,,自己去做,,自己去做.........