2015年10月1日 星期四

NodeMCU (ESP8266) 使用紀錄(暫存)

最近入手了塊 WiFi 小板子,使用 ESP8266 模組
NodeMCU官網 紹所描述的如下圖所示,使用方法 超簡單!!!
就如惡夢的開端一樣平凡

===寫在前面===
建議:
1沒有任何程式基礎的別玩這模組,最好有網頁編寫能力(前台 (HTML, JAVAScript)/後台 (Node.js) 都要)
2這模組還算新,各種支援/資源都很欠缺;現有的開發工具很難使用,操作上需要耐心
==========
模塊大小示意
左邊為 50元新台幣 右邊為 1元人民幣

硬體程式更新 
 在板子買來時,應該都預裝了較舊的系統,可以下載較新的來使用
 https://github.com/nodemcu/nodemcu-firmware/releases/tag/0.9.6-dev_20150704
 
 更新程式步驟可以參考 http://bbs.nodemcu.com/t/nodemcu/22 中的
  準備工作
  開始 的 一二步 (第三步用 telnet 進行測試的工作可以先不管)
 
 這一段很重要,必須先學會;因為在後面的操作嘗試過程中,有可能發生因程式錯誤導致模組不斷自我重啟,這時簡單的處理方式就是重新下載硬體程式 (應該也有別的方法,但是沒找到)

軟體操作環境 (NodeMCU Studio 2015)
 在 http://bbs.nodemcu.com/t/nodemcu-studio-ban-ben-geng-xin-wei-build20150111-update-to-version-build20150111/64 下載最新的軟體操作環境
 
 操作環境介紹
   
  共分五個區域 
   紅框-選單 (通常只用來 新增 lua檔案)
   橙色框-對模組進行操作 (下載所選到程式Download 執行所選到程式Execute 模組中的檔案瀏覽Explorer
   綠色框-電腦中的程式列表(此列表為電腦中程式,與模組中的不見得相同)
   藍色框-左邊選到的程式內容會在此區域顯示,可以在這邊做編輯修改,修改後的內容會直接存檔在電腦中
   紫色框-訊息區;像終端機的環境,模塊所返回的訊息會顯示在這邊,也可以直接在這邊下操作命令(注意:這區的操作需要用鍵盤輸入,不可用貼上)

  電腦一開始連接上模組時,訊息區會先跑一段亂碼出來,這沒有辦法避免,之後會顯示硬體程式的版本,若有燒錄了 init.lua 程式,則會自動執行
  
  橙色框的 Explorer ,可打開如下對話框,
  按右邊的 Load 可顯示 NodeMCU 中的檔案,於淡紫色框


硬體介紹
 注意事項寫在前面:
  板子使用 microUSB 5V供電,超過此電壓可能會 
打開異次元通道導致模組損毀
  在ESP8266上面的 GPIO 於 NodeMCU 程式上被重新對應編號,使用時須注意要按照 NodeMCU 的編號來進行操作 
 
 板子所提供的接腳角功能如下圖(左下側方塊表示顏色所對應的 pin 腳功能)
其中 D0 連接板子上的 紅色LED (反向動作,寫 gpio.HIGH 為暗)
   
    10bits ADC  一個
 GPIO     十一個 (除D0外,D1 ~ D10 均可用於 PWM 輸出)
 timer     七個 ( 0 ~ 6 )

程式編輯
 使用的語言是 Lua,不過目前只支援其中一些方法(可能是為了精簡以便在空間很迷你的模塊上實現)

 部分可使用的API介紹 http://bbs.nodemcu.com/t/nodemcu-api/28 (完整的可能須自行到 https://github.com/nodemcu/nodemcu-firmware 下載原始碼來看有加入那些功能)
 
 舉例
 system:
  node.restart() 重啟模塊

  h = node.heap() 返回系統剩餘的程式儲存空間(byte)

 timer:
  tmr.alarm(id, interval, repeat, function do())
  example:
   tmr.alarm(0, 5000, 1, function()
      adv = adc.read(0)    -- read 10bits ad value
   end)
   說明:使用timer0, 每5秒讀取一次ADC的值存放到adv中

 gpio:
  gpio.mode(pin, mode, pullup)
   mode 值:gpio.OUTPUT or gpio.INPUT or gpio.INT(中斷模式)
   pullup 值: gpio.PULLUP or gpio.FLOAT, 預設為 gpio.FLOAT

  gpio.write(pin, mode)
   mode 值: gpio.HIGH or gpio.LOW

  status = gpio.read(pin)
   pin值:0 ~ 11  (D0 ~ D11)

 wifi:
        wifi.setmode(mode)     設定WiFi的使用模式
  可以使用 Station,AP 或 (?) 模式 (wifi.STATION, wifi.SOFTAP, wifi.STATIONAP
  
子模組 wifi.sta:
   wifi.sta.config("ssid","password") 設定連接時要用的 SSID, PASSWORD

   wifi.sta.connect()    透過設定好的 SSID, PASSWORD 連接上AP

   wifi.sta.disconnect()  斷開連接

   ip, nm, gw = wifi.sta.getip()  取得 ip位址,遮罩,預設閘道

  子模組 wifi.ap:
   除 wifi.ap.config 用法要注意引述為 tuple 型別,其他可參考 sta 模塊
    cfg={}
    cfg.ssid="SSID"
    cfg.pwd="password"
    wifi.ap.config(cfg)
  
 net:
  常量 net.TCP, net.UDP
  net.createServer(type, timeout) 創建網頁伺服器. timeout為(sec)

   example:
   sr = net.createServer(net.TCP)  
   sr:listen(80,function(conn)
      conn:on("receive", function(conn, payload) print(payload) end)
      conn:send("hello world")
   end)
  說明:建立網路伺服器, 監聽 prot: 80, 當收到 receive 請求時, 在 訊息區 印出 client 傳來的內容, 並在 client 端網頁上顯示 hello world
 

其他
 HTML 超文件標示語言(英文:HyperText Markup Language,HTML)是為「網頁建立和其它可在網頁瀏覽器中看到的資訊」設計的一種標示語言。
 JavaScript 一種直譯式程式語言,是一種動態型別、基於原型的語言,內建支援類別。它的直譯器被稱為JavaScript引擎,為瀏覽器的一部分,廣泛用於用戶端的腳本語言。
 Node.js 是一個開放原始碼、跨平台的、用於伺服器端和網路應用的執行環境。Node.js應用用JavaScript語言寫成。

 HTTP協議參考:
  http://www.kafan.cn/edu/48002124.html HTTP协议详解
  
 用戶連接網頁時,會送出兩次網頁請求 (當作伺服器的 NodeMCU 於 receive 事件會觸發兩次)

 網頁連接時客戶端會送出請求 要讀取用於網頁抬頭的圖案 favicon.ico , 目前不知道有什麼方法可以下載圖檔到 NodeMCU 中

 一個網頁需要有 HTML HEAD BODY 標記
 
 HTML 中的 input 方法所得的值,會在跟伺服器提出請求時加在資料尾端一起送出(中間隔一空行)

奮戰一周的網頁截圖

1 則留言: