MATLAB和物聯網連載5: 物篇之NodeMCU
物聯網這個詞可以拆成 物+聯網。物,就是各種各樣可編程可聯網的硬體。聯網,即雲端提供的Service。前面幾篇我們介紹了Thingspeak的服務,這是物聯網的核心,當然,沒有「物」,這些服務也無從可談,所以下面幾篇,我們也稍花筆墨介紹一下「物」,如何讓這些「物」使用Thingspeak提供的數據收集和分析的功能。這篇我們先介紹NodeMCU和Thingspeak.
NodeMCU基礎篇
什麼是ESP8266,NodeMCU和DS18S20
ESP8266是上海Espressif生產的一種小型WIFI晶元,該晶元旨在給嵌入式系提供接入網路的功能。NodeMCU是一個集成了ESP8266的開源開發板,並且封裝了ESP8266的硬體操作命令,使用戶可以更容易和硬體交互。DS18B20是一個單線溫度感測器,在本教程中NodeMCU將通過DS18B20採集環境溫度,並且發布到雲端的數據收集服務thingspeak上去。
為什麼使用NodeMCU
NodeMCU是目前筆者所知最廉價的帶WIFI(ESP8266)模塊的開發板,在Amazon賣到10美金以內,Ebay則更便宜。如果有興趣自己動手做智能家居,把家裡的電器都聯網,開發板的成本是一個重要的因素。其它的類似選擇包括:SparkFun的Photon, ArduinoYun, Arduino + Zigbee, Arduino + ESP8266 , Arduino + ethernet shield,Raspberry + WIFI 或者自帶wifi的Raspberry 3. 這些開發板+通訊模塊加在一起的價格至少是NodeMCU的5到10倍,所以NodeMCU具有明顯的價格優勢。(將來肯定會有更便宜支持通訊的開發板,前幾個月http://Arduino.org宣布即將推出帶WIFI功能的開發板,但價格尚未公布)
NodeMCU用什麼編程
NodeMCU自帶LUA的解釋器,所以可以用LUA語言給其編寫控制程序,LUA是一個輕量級的腳本語言,用C語言編寫,編譯後解釋器大小僅僅100多K。LUA旨在針對內存有很大限制的嵌入式系統。NodeMCU還提供交互命令行環境,比Arduino的編程調試環境友好。 NodeMCU還可以支持Arduino的IDE對其編程,簡介參見這篇Blog:NodeMCU + Arduino IDE
NodeMCU的Setup
如何安裝Firmware
拿到NodeMCU開發板之後,第一件事是安裝/更新Firmware,可以從這裡下載到Flasher
http://www.whatimade.today/loading-the-nodemcu-firmware-on-the-esp8266-windows-guide/n
如何上載LUA程序到NodeMCU
有了Firmware之後,還需要一個LUA程序Loader,它用來連接到NodeMCU上進行交互,並且上載LUA程序到NodeMCU上,下載地址如下:
http://benlo.com/esp8266/n
如何測試NodeMCU簡單的功能: GPIO,WIFI和Hello World
通過LUA Loader連接到NodeMCU之後,我們可以在Lua Loader的界面上直接測試NodeMCU的一些基本功能:
- 首先要通過Device Manager獲得NodeMCU的COM埠號,然後在菜單的Setting->Comm Port Setting中指定要連接到這個埠
- 然後點擊Connect連接,指定波特率是9600
- 測試on board的LED: 0 GPIO16, 選擇Output,輸出1,這時板上電源附近的LED燈應該亮起來
- 測試WI-FI功能:在GUI中輸入路由器的名稱和密碼,然後點擊Set AP, WI-FI連接成功之後可以點擊GET IP查看NodeMCU的IP地址
- 最後測試通過Upload File上載LUA的HelloWorld.lua到NodeMCU中,然後點擊dofile運行該文件
print("hello world")n
這時命令行應該列印hello world輸出。
NodeMCU如何與DS18B20一起工作
DS18B20有三個管腳,中線接NodeMCU的D4,其餘一根3V3,一根GND,如下所示:
該程序可以在Lua Loader的安裝文件夾中的example中找到:
https://github.com/nodemcu/nodemcu-firmwaren
如何在Thingspeak中配置一個數據Channel並發送數據
用NodeMCU向雲端發送數據之前,我們先要在thingspeak網站上註冊一個Channel,之前的教程我們已經介紹過了,這裡不再贅述。 參見 Thingspeak tutorial 1
NodeMCU如何自動發出HTTP Request
如何發送HTTP Request
NodeMCU的Firmware中自帶了一些常用的Library,詳見:
http://www.nodemcu.com/docs/index/n
比如NET,PWM,MQTT, 這裡我們使用NET Library,下篇我們將使用PWM和MQTT Library。
NET MODULE可以用來發送HTTP Request,下面的程序片段假設已經得到了溫度,存放在變數t中:
function postToThingspeak(tmp)n-- 創建一個TCP對象n conn=net.createConnection(net.TCP, 0) nn-- 連接成功之後的Callback,發送POST REQUESTn-- 其中的api_key要替換成實際的頻道的keyn-- 其中的tmp來自函數的輸入n conn:on("connection",function(conn, payload)n cmd ="POST /update.json?api_key=YourAPIKey&field1="..tmpnt.. " HTTP/1.1rn"nt.. "Host: api.thingspeak.comrn"nt.. "Connection: closern"nt.. "Accept: */*rn"nt.. "User-Agent: Mozilla/4.0 (compatible; esp8266 Lua; Windows NT 5.1)rn"nt.. "rn";nt print(cmd);nt conn:send(cmd); nt end)n-- 得到RESPONSE的Callback:關閉這個連接 n conn:on("receive", function(conn, payload) nt conn:close()n end)n conn:connect(80,api.thingspeak.com) nendn
最後利用LUA的timer實現每隔20秒發送一次數據
tmr.alarm(1,20000,1,function()n-- getTmp僅僅example中的sd18b20.lua包裝成了一個函數n tmp = getTmp();n postToThingspeak(tmp);nend)n
因為thingspeak限制感測器連續上傳數據的間隔不能低於15秒(thingspeak其實是一個開源項目,可以通過自己deploy thingspeak來去掉這個數據流量的限制。)
如果想讓NodeMCU一啟動就自動運行溫度收集,只需要把這個程序的名字保存成init.lua即可。
NodeMCU如何自動連上WIFI
下一步是實地的deploy NodeMCU,NodeMCU的工作電源是3.3V,為了要讓開發板能夠一連接電源就自動連接到路由器上,我們需要在init.lua程序中調用如下的函數
function setupWifi()n wifi.setmode(wifi.STATION)n wifi.sta.config("NETGEAR75","nobugs")n wifi.sta.connect();n wifi.sta.setip({ip="192.168.1.7",netmask="255.255.255.0",gateway="192.168.1.1"})n tmr.alarm(1, 1000, 1, function()n if wifi.sta.getip()== nil thenn print("IP unavaiable, Waiting...")n elsen tmr.stop(1)n print("ESP8266 mode is: " .. wifi.getmode())n print("The module MAC address is: " .. wifi.ap.getmac())n print("Config done, IP is "..wifi.sta.getip())n endn end)nendn
本tutorial中介紹了NodeMCU的配置,利用溫度感測器收集環境溫度,NodeMCU發送HTTP request,thingspeak的數據收集channel的註冊和使用,最後在MATLAB的環境中獲得收集的數據。流程如下:
推薦閱讀:
※推崇Mathematica的那些人,理由是什麼?
※2017年,你用Matlab寫了多少行代碼
※Matlab如何以UTF-8編碼保存?
※matlab中的randn函數如何重複前一次的隨機數?