nodemcu入門,遠程點亮LED燈

一、前言

    拿到這個模塊(nodemcu)後,第一個想要實現的功能就是,能夠在電腦上或者是手機上來控制這個模塊上的一個LED燈的亮滅。也就是通過在電腦(或者手機)和模塊之間建立網絡連接,然後通過電腦(或者手機)發送一個數據讓網絡模塊上的一個IO口拉高(或拉低)。一般最常用的網絡連接方式有TCP和UDP兩種吧,這裏只是用了TCP這一種。通過在nodemcu上建立TCP服務器端,在電腦(或手機)上建立TCP客戶端,兩者建立連接後既可以通信啦。最開始我還以爲要把TCP協議的每一個部分都看懂才能實現這個高大上的功能呢(最開始真的覺得很高大上,但其實也就是那麼回事),所以我在網上找TCP協議的各種解釋,看TCP協議發送的每一個數據包的每個字節和每個比特的意義,結果看到最後還是一頭霧水。其實根本沒有那麼麻煩,只要調用API,固定的那幾句程序就可以創建一個TCP服務器端。然後在電腦上通過網絡調試助手創建一個客戶端端,只要客戶端和服務器端的IP地址和端口號對上了,就可以實現這個功能那。當然,我這麼說是爲了告訴大家實現這個功能並不難。要是真正的研究網絡協議的話,還有好長的路要走。(現在我連編一個Widows下的應用程序都不會)好,下面我來一步一步的說一下我是怎麼實現這個入門級的功能的。

二、主要所需硬件和軟件

     1、nodemcu模塊

    2、網絡調試助手軟件(PC端或手機端)

    3、ESPlorer

三、nodemcu簡單介紹

   我的這個模塊就是網上花30塊錢買的,挺便宜的。需要注意的是nodemcu模塊最開始出廠的時候應該默認是用AT指令庫(通過寫AT指令來操作),我們一般是導入nodemcu專門的固件庫(通過在ESPlorer上寫lua程序來操作)。燒固件這部分我就不說了,網上有很多這部分的教程的。也就是說下面的程序都是要在nodemcu的固件庫成功燒寫後,才能正確執行的。那麼怎麼才能說明成功燒寫呢?燒完固件庫後,打開ESPlorer。檢測到com口後點擊open,如下圖

這樣肯定是有問題的。就是那個波特率必須要調,我用的是9600,這個波特率一般的nodemcu上是有說明的吧。反正最常用的就是9600和115200。調完9600後就出現下面的一段話,就是說檢測到了固件庫。


這裏需要注意的是,有時候必須按一下復位鍵,纔可以檢測到固件庫。另外我記得有一次我是點了兩下那個DTR纔好用的,注意是兩次。那個DTR正常情況下肯定是綠色的。

    必須要知道的是,nodemcu上電覆位後會自動執行 init.lua 這個程序。然而最開始你沒有往模塊裏面導這個程序,所以你按下復位鍵後回顯示can't open init.lua


所以你就寫一個程序,把它命名爲 init.lua 導進去唄。下面的是點亮LED燈的程序,我的這個模塊LED的正接的VCC,負接的pin4 ,所以就是把 pin4 拉低。點擊Save to ESP導入程序就行。再強調一次,文件名字必須是 init.lua


把程序中的 gpio.write(pin,gpio.LOW) 改成 gpio.write(pin,gpio.HIGH) 再導入就可以熄滅LED。這一部分先說到這。

四、網絡調試助手

    再來說一說怎麼用網絡調試助手來創建客戶端和服務器,網絡調試助手沒有的話,自己在網上隨便找一個下載就行。

我們可以在一個電腦上開兩個調試助手來稍微測試一下。當然電腦必須先聯網。



    一般打開軟件後,選擇TCP Server和TCP Client後它會自動檢測本機IP地址的。客戶端的IP地址和端口號必須和服務器端所在的IP地址和端口號保持一致。然後首先點擊服務器端的“連接“(也就是建立服務器),再點擊客戶端的“連接”(也就是建立客戶端並和服務器建立連接)。就完成了客戶端和服務器之間的網絡連接了,可以傳送數據了。在客戶端輸入字母 q 點擊發送,可以在服務器端接收到。當然也可以在服務器端發送數據,客戶端接收數據。下面我們要做的就是在nodemcu模塊上創建服務器來接收數據。

五、建立TCP連接實現無線點燈

    1、nodemcu創建服務器端

    首先要保證電腦和nodemcu連接在同一局域網下,我的就是把他們都連到了我手機的熱點上。還要知道的是,nodemcu可以導入多個程序,只是他會首先執行 init.lua ,可以在 init.lua 裏調用其他的程序。這裏我就直接給程序啦,因爲lua語言瞭解的也不多,所以有些語法也沒搞懂什麼意思,但是其實主要就是調一些固件庫裏的API。這裏的 init.lua 函數要稍微改一下。

最後一句就是執行 wifi.lua 。所以我們要寫一個 wifi.lua 的程序導入到nodemcu裏。如下

wifi.setmode(wifi.STATIONAP)  
wifi.sta.config("lalalala","12341234") --手機熱點的名稱和密碼
wifi.sta.connect()  --接入手機熱點
tmr.alarm(2,1000,1,function()
    if wifi.sta.getip() == nil then
        print("connecting...")
    else tmr.stop(2)
        print("connected,Ip is "..wifi.sta.getip()) --得到的是nodemcu的IP,後面客戶端要連接的就是這個地址
    end
end)


pin=4
gpio.mode(pin,gpio.OUTPUT)

srv=net.createServer(net.TCP,28800)  --創建tcp服務器
srv:listen(8888,function(conn)    --8888爲端口號,可以改,但必須與客戶端的端口號保持一致
    conn:on("receive",function(conn,payload) --接受客戶端傳來的數據,並存入payload
    
    if (payload >= "31") then   --如果接受到的數據大於“31”,注意這裏的比較大小是字符串的比較
        gpio.write(pin,gpio.LOW)  --點亮LED
        print(1)
    elseif (payload <="31") then  --如果接受到的數據小於“31”,注意這裏的比較大小是字符串的比較
        gpio.write(pin,gpio.HIGH)  --熄滅LED
        print(0)
    else
        print(3)  --這裏的print(3)和前面的print都是爲了從左邊觀察,沒什麼用
    end
        
    print(payload)  --打印輸出接受到的數據
    end)
end)
 

成功導入後,只要連接上了手機的熱點就可以得到nodemcu的IP地址的,可以通過print函數在右邊顯示出來。

    這裏的 wifi.lua 實現的功能就是,首先連接上自己手機的熱點,然後創建TCP服務器。等待與客戶端建立連接並接受其數據,如果數據大於 “31”就點亮LED,如果數據小於 “31” 就熄滅LED。這裏大小的比較是字符串的比較。到這nodemcu的服務器端就創建好了。

    上面有一句 wifi.lua:16 :only one tcp server allowed,可能是因爲我以前導入過一次wifi.lua 吧,沒什麼問題的。

2、網絡調試助手創建客戶端

    打開網絡調試助手

這裏服務器的ip地址和端口號必須要和前面nodemcu的對應。

    然後就可以在電腦上的網絡調試助手裏向服務器發送一個 “41”來點亮LED(只要比“31”大就行),也可以在向服務器端發送一個“21”來熄滅LED(只要比“31”小就行)。

五、後記

   到這裏基本的功能就算是實現了,但是我還想通過手機上的APP來控制LED。雖然也可以在手機上下載一個網絡調試助手來實現,但不是我想要的。等有時間自己編個 Android APP 來實現吧,應該不算太難。












發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章