天天看點

二,ESP8266 GPIO和SPI和定時器和序列槽(基于Lua腳本語言)

我們寫lua用這個軟體

二,ESP8266 GPIO和SPI和定時器和序列槽(基于Lua腳本語言)

如果點選的時候提示安裝,,安裝就行,,如果沒有提示呢可以,按照下面連結的提示自己安裝哈,,,,,或者自己百度

<a href="http://jingyan.baidu.com/article/3c343ff70bc6ea0d377963df.html" target="_blank">http://jingyan.baidu.com/article/3c343ff70bc6ea0d377963df.html</a>

二,ESP8266 GPIO和SPI和定時器和序列槽(基于Lua腳本語言)
二,ESP8266 GPIO和SPI和定時器和序列槽(基于Lua腳本語言)

 讓這個燈亮

二,ESP8266 GPIO和SPI和定時器和序列槽(基于Lua腳本語言)

這個燈連接配接到了GPIO2,低電平點亮

這樣的話這個燈就亮了

可能會有疑問,明明是GPIO2為什麼填4

看資料

<a href="https://nodemcu.readthedocs.io/en/master/en/modules/gpio/#gpio-module" target="_blank">https://nodemcu.readthedocs.io/en/master/en/modules/gpio/#gpio-module</a>

還有一個簡介版的資料

對照表

二,ESP8266 GPIO和SPI和定時器和序列槽(基于Lua腳本語言)

現在下進去

二,ESP8266 GPIO和SPI和定時器和序列槽(基于Lua腳本語言)
二,ESP8266 GPIO和SPI和定時器和序列槽(基于Lua腳本語言)

可以先複位一下然後再執行操

對了要是經常出現編譯或者下載下傳到子產品出問題.........一定是序列槽子產品和WIFI子產品通信之間有問題.....盡量使用好的杜邦線,,,盡量短,,,,,再者可以考慮換成pl2303或者CP2102等.......因為自己測試的這兩種子產品比較可靠

儲存到晶片裡面

二,ESP8266 GPIO和SPI和定時器和序列槽(基于Lua腳本語言)

現在控制闆子上的繼電器,改一下IO口就可以了

二,ESP8266 GPIO和SPI和定時器和序列槽(基于Lua腳本語言)

是以呢讓繼電器吸合

關于

引腳是低電平傳回0,外部引腳是高電平傳回1

如果設定的輸出高電平,但是如果拉低了引腳,也是傳回0,,,,和控制狀态沒有關系,隻與

目前引腳的實際高低電平有關系

現在看定時器函數

二,ESP8266 GPIO和SPI和定時器和序列槽(基于Lua腳本語言)

第一個參數 一共可以同時使用7個定時器,,id号呢是0-6

第二個參數是延時多少ms執行最後面的函數

第三個參數是設定是隻執行一次,,還是調用啟動函數時執行一下,還是一直間隔第二個參數的時間執行最後面的函數

就讓它每隔1s列印一下序列槽列印111111

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...隻是感覺沒有試過

二,ESP8266 GPIO和SPI和定時器和序列槽(基于Lua腳本語言)

更友善點呢

tmr.alarm(1, 1000, 1, function()  

    print("111111")  

end)  

二,ESP8266 GPIO和SPI和定時器和序列槽(基于Lua腳本語言)

可以看一下我這篇文章

<a href="http://www.cnblogs.com/yangfengwu/p/6404695.html" target="_blank">http://www.cnblogs.com/yangfengwu/p/6404695.html</a>

剩餘的定時器的方法呢有可能tmr.delay(us) 會用到,,就是延時多少us......

看一下序列槽....

說一下哈...配置序列槽是一件及其危險的事情,為什麼這樣說呢!!

我們燒固件是通過序列槽,把我們編寫的.lua檔案儲存到子產品裡面也是通過序列槽

如果說哈子產品一上電就執行了我們配置的序列槽程式,,,,,那麼我們想把新寫的程式發給子產品就可能寫不進去.....造成一個bug了,,,,,

解決方案是

一,重新燒寫固件

但是呢也有可能重新燒寫固件也不能把以前寫的.lua檔案清除

二,先燒寫别的固件,再燒寫現在的

比如:可以先燒寫一個AT指令的固件,讓它運作一下,然後再重新燒寫lua開發版本的,但是也有可能不能把以前寫的.lua檔案清除

三,修改程式儲存的偏移量

二,ESP8266 GPIO和SPI和定時器和序列槽(基于Lua腳本語言)

您想哈,,我們的.lua程式肯定也在flash裡面,,,我燒寫固件時把偏移量調大肯定能把我們寫的.lua代碼給清除掉.要是調整後出現一直發亂碼,,恭喜你哈,肯定覆寫到了先前的.lua了...然後呢我再把偏移量調整到0000重新燒寫就好啦...

四,其實呢根本解決方案是燒寫一個空的bin檔案把原先的全都清空

這是空的bin檔案

二,ESP8266 GPIO和SPI和定時器和序列槽(基于Lua腳本語言)

可以看這個,關于各個型号的子產品的Flash大小

<a href="http://wiki.ai-thinker.com/_media/esp8266/esp8266_module_list.png" target="_blank">http://wiki.ai-thinker.com/_media/esp8266/esp8266_module_list.png</a>

如果出現

二,ESP8266 GPIO和SPI和定時器和序列槽(基于Lua腳本語言)

 等着格式化檔案系統,,就等着哈

好現在做一個程式我發給序列槽什麼資料,序列槽就回給我什麼資料

下面的功能可以實作但是别這樣寫,我隻是來解釋函數....否則親們就按照上面的方法刷固件把

第一個參數隻有"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吧

二,ESP8266 GPIO和SPI和定時器和序列槽(基于Lua腳本語言)

第一種方案這樣寫

程式啟動以後等待2s執行下面的函數,,定時器第三個參數寫的0,是以這個定時器就關閉了

隻要一執行這個函數,那麼以後序列槽接收到資料就會執行

現在用序列槽助手測試一下

現在我假如修改了程式想重新寫入晶片

複位晶片後趕緊點選,,當然有兩秒時間

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

如果程式大點,,可以再複位一下子產品然後再...當然假設下載下傳的時間不會超過兩秒

假設程式很大

然後看這裡

隻要移除掉init.lua一切都好辦

那我先右擊準備好點選,,,,然後呢我複位一下子產品,然後在兩秒之前點選就移除了init.lua

還有

也是複位後再點選是,,,移除晶片内部所有檔案..........這個随時可以用,,不用像上面似的事先編譯

當然這隻是在自己配置了序列槽之後的特殊情況下才會遇到的問題哈

做到這裡有些人會想,能不能配置收到什麼資料就去幹點什麼

我們就配置收到H 就控制繼電器引腳輸出高電平,收到L就控制繼電器引腳輸出低電平

相當于printf,,,,把裡面的字元串内容發送到序列槽

不過呢這個慎用,,因為遇到'\0'就預設發送'\0'以前的資料,,,是以對于 byte類型的 0

它認為是 '\0',,,用它列印字元串還是蠻不錯的

gpio.mode(2,gpio.OUTPUT)  

tmr.alarm(1, 2000, 0, function()  

    uart.on("data", 0,function(Revdata)  

            if Revdata == "H" then  

               gpio.write(2,1)  

               print("Relay=1")  

            end  

            if Revdata == "L" then  

               gpio.write(2,0)  

               print("Relay=0")  

            uart.write(0,Revdata) 

    end, 0)  

現在用序列槽調試助手測試

好現在換一下指令,配置收到++H 就控制繼電器引腳輸出高電平,收到++L就控制繼電器引腳輸出低電平

如果按照下面寫竟然不管來了

            if Revdata == "++H" then  

            if Revdata == "++L" then  

            uart.write(0,Revdata) -- unregister callback function  

現在發送的時候多加一個加号

也就是+++H    +++L

用序列槽調試助手來調試,,ESPlorer 這個軟體的序列槽有些問題

您會發現居然這樣可以

告訴您原因

其實是因為序列槽先接收了一個+ 然後又接收的++H 是以可以控制

是以先前的++H  是序列槽先接收了一個+  然後又接收了 +H  是以不能控制了

不信的話可以列印一下,,修改為下面的程式

            else  

               print(Revdata)----LOOK  LOOK  LOOK      

其實

這地方寫0,就代表了序列槽接收到1個資料就會進入中斷函數function(Revdata)

解決方法

我是不願意使用控制接收到多少個位元組,或者加入一個标志,,,,還記得AT指令要加換行不......那是因為"\r".接收到換行....

我的做法...我用定時器做空閑檢測

關于Lua的部分文法可以看,,其實了解就行,,當時自己以為需要把lua學的很好才能用lua開發8266,,,最後才知道隻需要了解些文法就好了,,剩下的看8266的API文檔看怎麼使用那些函數就行.....

<a href="http://www.cnblogs.com/yangfengwu/p/6357838.html" target="_blank">http://www.cnblogs.com/yangfengwu/p/6357838.html</a>

<a href="http://www.cnblogs.com/yangfengwu/p/6358444.html" target="_blank">http://www.cnblogs.com/yangfengwu/p/6358444.html</a>

<a href="http://www.cnblogs.com/yangfengwu/p/6366428.html" target="_blank">http://www.cnblogs.com/yangfengwu/p/6366428.html</a>

<a href="http://www.cnblogs.com/yangfengwu/p/6376098.html" target="_blank">http://www.cnblogs.com/yangfengwu/p/6376098.html</a>

ReadData=""  

ReadDataCopy=""  

ReadCnt=0  

ReadCntt =0

tmr.alarm(2, 5, 1, function()  

    if  ReadCnt ~= 0 then  

        if  ReadCnt == ReadCntt then  

            ReadCnt = 0  

            ReadCntt = 0  

            ReadDataCopy = ReadData  

            ReadData = ""  

            if  ReadDataCopy == "++H" then  

                gpio.write(2,1)  

            if  ReadDataCopy == "++L" then  

                gpio.write(2,0)  

        else  

            ReadCntt = ReadCnt      

        end  

    end  

           ReadData = ReadData..Revdata  

           ReadCnt = ReadCnt + 1   

空閑中斷..............

可以先看一下自己51的程式

序列槽中斷接收資料

定時器做檢測

可以參考的文章

現在說一下SPI,,其實呢為什麼說spi呢,,,,咱的子產品最終99.99%都會設計成,發給子產品序列槽的資料自動轉發到網絡,,,,,子產品網絡接收的資料自動轉發到子產品的序列槽對吧!!!!

那麼如果想靈活的配置子產品要麼通過序列槽,要麼通過其它方式比如說SPI方式....序列槽剛才說了主要用于使用者傳輸資料使用.....那麼我們自己寫的靈活配置子產品的程式也需要通過一種通信方式告訴子產品哈...當然也可以選擇IIC,或者自己控制子產品的引腳自己編一個

感覺這篇說的夠多的了,下一篇再說SPI,關鍵是自己去做,,自己去做,,自己去做.........

繼續閱讀