讓這個燈亮
我們寫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,關鍵是自己去做,,自己去做,,自己去做.........