2018年3月24日 星期六

【Ameba特異功能集(1-1)】省電模式教戰守則

作者:柯大
為了創造更輕便電的物聯網裝置,瑞昱阿米巴(Ameba)開發板加入了更多裝置端的省電模式,並提供Arduino開發環境不同的省電API,讓裝置可以輕易的以電池或太陽能板供電維持一段長時間的正常運作,以下來介紹實作的方式。

6種省電API功能

Realtek在2016/02/19釋出的Ameba IoT/Arduino Solution Version 1.0.5版本中,新增了對Ameba開發板的省電API功能,共提供了6組API:
void sleep(); //進入sleep
void active(); //關掉sleep(),不允許sleep
void deepsleep(uint32_t duration_ms); //進入最省電的模式深睡模式
void setPllReserved(bool reserve); //預設PLL clock關掉,防止其他週邊停止運作
void softReset(); //軟體重開機
bool safeLock(); //
要使用Ameba省電API功能,需於程式中加入以下library:
#include <PowerManagement.h>
API function 說明如下:

1. static void sleep();

呼叫這個function之後,就允許系統在閒暇的時候進入sleep(但不一定會馬上進入sleep),如果Ameba開著WiFi,WiFi依照802.11的省電模式定時起來並且醒著聽AP發出來的beacon,收完之後如果沒事就會繼續進入sleep。
如果WiFi資料量比較大的時候,WiFi會離開802.11的省電模式,此時系統也不會進入sleep,所以開著WiFi的耗電量會因為資料量與WiFi環境的乾淨程度有關。

2. static void active();

呼叫這個function等於是關掉sleep(),閒暇時不允許sleep。

3. static void deepsleep(uint32_t duration_ms);

這是最省電的模式,幾乎都關了,醒來之後會從頭開始執行,像是經過reset一樣,呼叫這個function之後會馬上進入deepsleep。
其中有個參數是duration_ms,可設定進入deepsleep之後多久之後醒來。

4. static void setPllReserved(bool reserve);

當Ameba進入sleep,如果PLL clock關掉,會讓一些週邊(Ex. UART, I2C, SPI…)無法收資料,目前預設是保留PLL不關掉,適合關掉的情況是:(1)沒有用到這些週邊,或是(2)用到這些週邊但不需要在Ameba進入sleep之後還收資料。關掉省掉的電大約是5.5mA,算是需要自己取捨的電量。

5. static void softReset();

呼叫之後馬上重開機,這是軟體行為,電路上並沒有重新上電。

6. static bool safeLock();

當Ameba進入deepsleep,會無法燒錄程式,為了避免使用者寫出程式是開啟Ameba就進入deepsleep的程式,所以使用D18這根PIN當做保護,當D18這根PIN被接到GND,就會防止Ameba進入deepsleep或sleep。
傳回值 :
true: D18 is connected to GND
false: D18 is not connected to GND
註:因為Ameba進入deepsleep之後就無法上傳程式,在deepsleep的API裡面我們將D18這根腳當作避免Ameba進入deepsleep的pin腳,只要將D18接GND,並且重開Ameba 即可重新燒錄新程式。
將D18接GND,並且重開Ameba 即可重新燒錄新程式。
將D18接GND,並且重開Ameba 即可重新燒錄新程式。

Ameba常用的省電模式

Ameba提供許多省電模式,最常用的是deepsleep與sleep。

1. Deepsleep mode

當Ameba進入deepsleep mode,會讓Ameba處於最省電的情況,它的耗電會小於20 uA (微安培),此時大部份元件都關掉了,但低解析度的timer仍在運作並且用來喚醒Ameba。這種模式適合定時運作的情境,像是每小時起來量測溫濕度、送出資料,再回到deepsleep。

2. Sleep mode

這個模式是Ameba可以維持WiFi連線的省電模式,它的耗電會因為WiFi資料量與無線環境的乾淨程度而有所不同,但是瞬間最低電流會在2.5 mA (毫安培),與WiFi起來運作之後的電流平均之後,仍然是相當省電的模式。這種應用適合需要遠端操控Ameba的情境,像是使用手機透過網路通知Ameba馬上量一次溫濕度,再回傳結果。

省電範例程式

範例一、讓Ameba處於WiFi連接的省電模式

Ameba的deepsleep無法讓WiFi處於連線狀態,如果想讓Ameba省電,並且保持WiFi連線,可以使用sleep API。
打開範例 “File” -> “Examples” -> “AmebaPowerSave” -> “SleepWithDHTUdpServ”
範例裡一樣需要設定連線AP的SSID和password。
這個範例裡,Ameba會先建立WiFi連線,進入sleep省電模式,Ameba會當作UDP server,每當接收到UDP封包內容為 ‘H’,就回傳濕度,接收到UDP封包為 ‘T’,就回傳溫度。
與deepsleep不同的地方是,當Ameba打開sleep模式,會自己找尋可以睡眠的時間,當裝置閒置時就會進入睡眠。整個睡眠與醒來的動作是自動的,不需要使用者干預。
當Ameba連線之後,我們參考之前測試TCP/UDP的工具Sokit設定Ameba的IP & port。我們每分鐘輪流問一次溫濕度,可以看到Ameba都有回應。
每分鐘輪流問一次溫濕度,可以看到Ameba都有回應。
每分鐘輪流問一次溫濕度,可以看到Ameba都有回應。
這個範例裡會偵測D18這根防止進入睡眠的pin腳,如果D18被接地,就不會讓Ameba進入sleep睡眠模式,於是我們可以測量兩種耗電:(實驗所使用的電錶為Keysight 34465A)
p7
註:實際情況裡,不會用到那麼久,它會因為升壓轉換造成能量損失,也會因為電池電壓隨時間而降低造成無法使用到全部的容量。
這裡的數據會因為網路狀況而有不同,讓Ameba保持連線的情況下會比讓Ameba進入deepsleep要耗電;但讓Ameba保持連線來提供使用者做遠端操控,這是deepsleep無法做到的,這端看使用者的應用而定。

範例二、將DHT資料上傳到LASS之後進入睡眠

使用Ameba通常都會使用到它的WiFi功能,實際的省電使用情況也會因為如何使用WiFi功能而有不同。這個範例裡會先量測DHT的溫濕度數據,打開WiFi並連上AP,取得NTP時間,連上LASS的MQTT server,將量測的溫濕度數據上傳,再進入deepsleep。每10分鐘重覆這樣的動作。
打開範例 “File” -> “Examples” -> “AmebaPowerSave” -> “DeepSleepWithDHTLass”
修改程式裡相關的設定,包括:
– DHT的型號:DHT11/DHT22/DHT21
– 連上AP的方式:ssid, password
– 目前的GPS位置:latitude & longitude
編譯並上傳之後,量測到的耗電會因為許多因素而影響,包括WiFi網路環境是否乾淨、網路連線是否順暢、Server是否馬上回應。但一般應該會在十多秒內完成。
範例測試的結果裡,我上傳所花的時間是13s,量得的Ameba module耗電平均為1.3mA。
這個數據比範例 “DeepSleepWithDHT” 要大上許多,因為Ameba在工作模式下的耗電通常大於29mA,甚至在WiFi連線時至少會大於68mA,與deepsleep的0.018 mA相比,我們要讓Ameba儘量待在deepsleep才會取得最大的省電效益。
為了比較未省電的情況,我們將程式碼修改如下,讓它平常保持網路連線,每10分鐘量一次,量完再上傳至LASS的MQTT Server:
void setup()
{
dht.begin();
initializeWiFi();
initializeMQTT();
}
void loop()
{
if (gatherHumidityAndTemperature() == DATA_CNT_FOR_UPLOAD) {
retrieveNtpTime();
if (!client.connected()) {
reconnectMQTT();
}

publishResults();
pDhtData-&gt;dataCount = 0;
}

// store data back to flash memory
FlashMemory.update();
delay(measureInterval * 1000);
}
這種方式量測到的平均耗電為67mA,和我們用2顆AA電池來比較耗電 (實驗所使用的電錶為Keysight 34465A)。
P8
可以看到沒省電的情況下只能用一天,但經過省電並且單獨供電給Ameba module可以使用2.8個月。
註:實際情況裡,不會用到那麼久,它會因為升壓轉換造成能量損失,也會因為電池電壓隨時間而降低造成無法使用到全部的容量。

省電秘技:如何單獨供電給Ameba

在Ameba的開發板上,我們都是使用下圖左上方的USB供電,這裡的USB供電會提供整塊開發板的電源,包括一個DAP的控制元件、LED指示燈、周邊的電容與電阻,以及經過電壓轉換之後,提供3.3V工作電壓給Ameba。
Ameba一般使用下圖左上方的USB供電。
Ameba一般使用下圖左上方的USB供電。
如果我們單獨供應3.3V的電源給Ameba,而不是使用USB供電給整塊板子,Ameba還是可以運作的。板子上其它元件讓使用者便於開發,當開發完成之後,就可以只供電給Ameba。

如何單獨供電給Ameba

單獨供電給Ameba需要對R43這個電阻做處理,不想更動硬體或不需要體驗到非常省電的模式者可以跳過這一章。
板子上R43的地方是個電阻,電阻左邊是經過降壓模組的3.3V電源,這個3.3V電源只單獨供應給電阻右邊的Ameba Module。
板子上R43的地方是個電阻
板子上R43的地方是個電阻,需解焊它
我們需要解焊R43這個電阻,它會露出左右各一個金屬連接點,我們再將左右分別焊上杜邦線即可。
解焊後出現兩接頭,再焊上杜邦線。
解焊後出現兩連接點,再焊上杜邦線。
解焊的方式,需要將R43的左邊與右邊同時受熱,才有辦法將R43這個電阻取下。比較浪費資源但快速的方式是將焊錫塗滿R43,讓焊錫覆蓋到左邊與右邊,這樣就可以將R43取下。
取下之後,會看到兩個接點,為了之後使用上方便,我們將左邊與右邊都焊上杜邦線。焊完之後將兩條線做固定,可以黏膠帶、使用熱融膠、或是像下圖卡住固定。
如圖中,這樣我們一樣可以使用USB供電。當我們想單獨對Ameba供電時,將紅線與黑線分開,由黑線供應3.3V的電源,以及接上電源的GND即可。

省電秘技:如何將Ameba的黃紅LED關閉

作者:柯大
為了更省電,有Ameba技術同好者提出了想將於設計物聯網裝置時將開發板上紅、黃LED閃爍關閉,以達到更省電的目的。
針對這個需求可利用下列二個方式將Ameba上的 黃、紅LED 閃爍關閉。

方式一:暫時關閉

1.按住CON2旁邊的按鈕不放
2.按一下CON1旁邊的按鈕再放開
暫時關閉LED之操作方式
暫時關閉LED之操作方式

方式二:更新DAP Firmware

想要更省電的話,還有一招,就是更換DAP firmware,讓黃、紅LED 永遠關閉,請參考以下操作:
1. 按住CON2旁邊的按鈕不放
2. 按一下CON1旁邊的按鈕再放開
3. 放開CON2旁邊的按鈕
更換DAP 的操作方式
更換DAP 的操作方式
4. 此時會出現一個磁碟槽,上面的標籤為 「CRP DISABLED」
CRP DISABLED的磁碟槽
CRP DISABLED的磁碟槽
打開這個磁碟,裡面有個檔案「firmware.bin」,它是目前這片Ameba使用的DAP firmware。
磁碟中會出現firmware.bin的檔案
磁碟中會出現firmware.bin的檔案
5. 要更換firmware,可以先將這個 firmware.bin 備份起來,然後刪掉,再將新的DAP firmware用檔案複製的方式放進去
7.將新的firmware: DAP_FW_Ameba_V10_2_2-2M_LED_Disable 拷貝到標籤為「CRP DISABLED」的磁碟槽上
8.最後將USB重新插拔,新的firmware就生效了
9.現在開始Ameba板子上的 黃、紅LED 閃爍即永遠關閉了
10.可參考按照下列連結:
http://www.amebaiot.com/change-dap-firmware/
11.更新firmware前,最好將原來的firmware.bin備份起來,以便日後可以再恢復讓LED可以閃爍
12.在Macbook的Mac上,利用VMware建Windows的人,請把檔案在Mac抓下來丟到 Vmware (XP) 裡面,再從Vmware直接將檔案寫到「CRP DISABLD」的資料夾,這樣就會成功了,原本備份的檔案,如果從是Mac端會產生檔案太大,寫不進去狀況,但如果丟到VM裡面去寫OK了!

【Ameba特異功能集(二)】忠實看門狗:WatchDog Timer (WDT)

作者:柯大
物聯網裝置對於感測資料的蒐集常需1年365天、1天24小時不間斷地,將感測值透過不同的通訊網路傳輸至雲端,但因網路狀態不穩或因其他外在的雜訊、電磁干擾,以及程式本身長時間運作的問題等各種情況,導致裝置系統無法如預期正常運作,結果當機,碰到這種情形,也只能靠人工重新開機裝置,或按下重新開機鈕「Reset」。
在萬物聯網的情形下,您的裝置可能安裝於一些外部環境,例如:架設於高架道路上,用來偵測與累計每天有多少輛車輛,以及超過多少高度,若這樣的系統當機了,就得派人去現場按重新開機,造成很大的不便、危險性及人力成本;或是在工廠輸送帶的生產線上,設置一個控制或感測生產線運作狀況的裝置,每當這個裝置當機了,就必須停止整條生產線,等待重新開機,才能恢復原有生產程序,這些影響都造成很大的不便,為了解決這個問題,可以嘗試在裝置上加入看門狗的功能,以下提供解決方案:

在裝置中加入看門狗 (WatchDog Timer)功能

Ameba物聯網開發板針對Arduino IDE開發環境,在V1.0.5版加入了WDT(Watch Dog Timer)功能,因應上述狀況,讓開發者利用此API功能自動偵測裝置運作情形,並在程式中加入WDT自動計時,當遇到系統故障或連網沒回應超過所要求的時間,就可自動reset裝置重新開機。

看門狗計時器就會對系統發出重設、重新開機或關閉的信號,使系統從懸停狀態回復到正常運作狀態。
有關對WatchDog Timer的說明可參考下列網站:
  1.  維基百科
  2.  Arduino.cc網站

3組自動Reset的API

2016年12月19日Realtek IoT/Arduino Solution (Version 1.0.5) ,新增開發板可設定自動Reset 的「Watchdog Timer」API功能:

void wdt_enable(timeout);  //開啟看門狗Watchdog計時器功能,並設定重新timeout reset時間
void wdt_reset();         //清除watchdog計時器的值,重新依前面wdt_enable(timeout)所設定timeout reset時間倒數計時
void wdt_disable()        //關閉看門狗Watchdog功能
要使用Ameba Watchdog API功能需於程式中加入 library:
#include "wiring_watchdog.h"

範例一


#include "wiring_watchdog.h"   // 加入Watchdog API library 
int timeout = 3500;           // 設定Watchdog Timeout 自動Software reset 功能,
最大值是8000ms = 8 秒。
void setup() {
  Serial.print("set watchdog timeout: "); 
  Serial.print(timeout);
  Serial.println(" ms");
  wdt_enable(timeout);   //開啟watchdog計時器功能,並設定重新timeout reset時間
}
 
void loop() {
  for (int i=1; i<=8; i++) {
    Serial.print("delay ");
    Serial.print(i);
    Serial.println("s");
    delay(i*1000);     //當delay 超過所設定timeout 值,Ameba的watchdog 自動對Ameba 板做software reset 
    Serial.println("feed watchdog");
    wdt_reset();      //清除watchdog計時器的值,重新計算timeout reset時間
  }
}

範例二


#include "wiring_watchdog.h"   // 加入WatchDog Timer API library 
int timeout = 3500;           // 設定Watchdog Timeout 自動Software reset 功能,
最大值是8000ms = 8 秒。
void setup() {
  Serial.print("set watchdog timeout: "); 
  Serial.print(timeout);
  Serial.println(" ms");
  wdt_enable(timeout);   //開啟watchdog計時器功能,並設定重新timeout reset時間
}

void loop() {
  wdt_reset();    // 進入Ameba執行廻圈,清除watchdog計時器的值,重新計算timeout reset時間
  getSystemDatetime();
  wdt_enable(1000); //開啟watchdog計時器功能,並設定重新timeout rese時間=1秒
wdt_reset();      // 進入一段SD卡存取程式,加入wdt_reset()清除watchdog計時器的值,重新計算timeout reset時間,如果下面讀取錯誤造成當機,系統即會自動reset
  if (SD.exists(logDir)) {   // SD卡偵測目錄是否存在
    }
  else {
    SD.mkdir(logDir);    // SD卡建立log目錄
  }

Serial.println(F("Start state#1."));
wdt_enable(3000); //開啟watchdog計時器功能,並設定重新timeout rese時間=3秒
 wdt_reset();     // 進入一段讀取電表程式,加入wdt_reset()清除watchdog計時器的值,重新計算timeout reset時間,如果下面讀取錯誤造成當機,系統即會自動reset
Meter_no =1 ;
readAPMRdata();   // 讀取電表副程式
trans2value();
displayData();

Serial.println(F("Start state#2.")); 
wdt_enable(2000); //開啟watchdog計時器功能,並設定重新timeout rese時間=2秒
 wdt_reset();     // 進入一段寫入記錄程式,加入wdt_reset()清除watchdog計時器的值,重新計算timeout reset時間,如果下面讀取錯誤造成當機,系統即會自動reset
 writelogFile();    // 寫入記錄副程式

Serial.println(F("Start state#3."));
wdt_enable(2000);   //開啟watchdog計時器功能,並設定重新timeout rese時間=2秒
wdt_reset();        // 進入ftp傳輸程式,加入wdt_reset()清除watchdog計時器的值,重新計算timeout reset時間,如果下面讀取錯誤造成當機,系統即會自動reset
 ftpBackup();       // ftp 上傳資料副程式
wdt_disable();     //廻圈結束關閉看門狗Watchdog功能

}   // End of Loop() 

小結

物聯網裝置受到外擾因素的影響很多,但並不是所有裝置都適合人工去重開,「WatchDog Timer」提供了我們解法,以後「Reset」不需要人工操控,也能自動重啟呢!

公私有雲整合開發 - Mini AirBox遇上QNAP QIoT Suite Lite

作者:柯大
本文針對 QNAP QIoT Suite Lite 物聯網開發平台,利用 Mini AirBox 空氣盒子,將感測資料透過 WiFi 通訊以MQTT 協定傳送到 QNAP NAP QIoT 平台,一次享盡公私有雲的所有好處!
QNAP 研發的 QIoT Suite Lite 多樣化實用模組,可以串聯起Mini AirBox 空氣盒子,讓你打造自己的 Mini AirBox 空氣盒子氣象觀測站,進而能將測到的溫濕度、PM 2.5Co2 等各種氣候指數,透過Wi-Fi通訊傳送到  QNAP TS-453B NAS ,將空氣盒子收集到的資料做長期的追蹤與分析。

組裝自己的氣象觀測站之前需要⋯⋯

這次組裝所採用的迷你空氣盒子開發套件:
WiFi 通訊模組:
QNAP NAS Server(內建 QIoT Suite Lite 物聯網開發平台):

認識QIoT Suite Lite

利用 QNAP 的Docker 架構 NAS,藉由 Container Station 安裝物聯網套件。為了讓大家更方便的建立應用,QNAP推出 QIoT Suite Lite ,包含 GatewayRules Engine 及視覺化資料的Dashboard。從裝置連結到 NAS 再到資料呈現,一次搞定。
QIoT Suite Lite 提供了三個重要元素來打造 IoT 應用環境:裝置閘道 (Device Gateway)、規則引擎 (Rules Engine) 與資料儀表板 (Dashboard),支援 MQTT/MQTTSHTTP/HTTPS  CoAP 等多種通訊協定連接 IoT 物件,可將感應裝置所產生的資料傳輸到裝置閘道。
QIoT Suite Lite 採用 Node-RED 服務作為規則引擎,能夠直覺地定義數據資料的邏輯與判讀方式,其圖像化的可拖曳式工具,幾乎不需要額外的程式撰寫即可完成。QIoT 儀表板則內含多樣小工具,協助使用者以視覺化的儀表板遠端監控和管理物聯網應用。
QIoT Suite Lite 支援(但不限於)的開發板包括 Arduino YunRaspberry Pi  Intel Edison 三款;亦提供完整 API 可將儲存在 QNAP NAS 中的各項裝置數據介接至其他儀表板工具(如 Microsoft Power BI)去做進一步分析。
QIoT Suite Lite 更可應用於進階的物聯網情境,比如霧運算 (Fog Computing),可將多台 QNAP NAS 配置為霧運算分層次分區域運算處理架構的分散式節點,以更有效率的方式,在更接近於資料來源處的節點進行資料處理。
基於私有雲架構的 QIoT Suite Lite 亦彈性支援公有雲,帶來一次盡享公私有雲好處的優勢。使用者可將龐大的物聯網資料儲存在費用較低廉的 QNAP NAS 私有雲上,將篩選後的重要資料轉接或匯出至第三方付費公有雲後,再去做更深度的資料分析,以最經濟的方式享受高效益的物聯網服務。
QIoT Suite Lite 架構
QIoT Suite Lite 從建立物件到規則並以視覺式呈現介面方式建立及管理一個完整的物聯網應用系統。
並可結合 NAS 利用各種 QNAP 認證的 Container 建立 MQTT broker  Node-RED Server MongoDB等服務,再以Dashboard 方式呈現感測物聯網資料。

QIoT Suite Lite +Mini Airbox建置教學

接著將介紹由迷你空氣盒子結合 QNAP QIoT Suite Lite,以最經濟的私有雲儲存方案,一次就能享盡公私有雲的所有好處!
QIoT Suite Lite 結合 QNAP NAS 安全、大容量的私有雲儲存技術,讓使用者能彈性調度數據資料的儲存空間。安全的私有雲不僅可支援傳統、無法連網的工廠設備,毋須連上公開網路,一樣能將數據資料透過 QIoT Suite Lite 傳送至QNAP NAS 中,體驗到高效益的物聯網服務。
Mini AirBox 空氣盒子可以偵測室內外空氣品質,包含溫溼度、PM 2.5Co2…等,而且內建鋰電池,還可以用行動電源充電、攜帶方便。對內對外都可為自己的小孩家人朋友們把關空氣品質,並可透過藍牙傳送數值至手機 APP 記錄資料及查看統計曲線。
只要具有基礎 Arduino 開發經驗,就能打造出屬於自己的氣象觀測站!
Mini AirBox使用的材料表:
Mini AirBox 內定組裝完成之通訊介面為藍牙,再利用手機APP讀取感測值記錄。
可下載不同APP來使用:
Mini AirBox專用的開發板底板MiniDuino 專利設計 8Pin 多功能擴充界面提供藍牙、WiFiLoRa 等不同通訊傳輸模組。
8Pin 多功能擴充界面可直接插入藍牙模組,即可成為藍牙裝置,若想將Mini AirBox 改為連網裝置,只要將原藍牙模組改換成 WiFi 模組即可連上雲端。
接下來介紹如何將 Mini AirBox 運用 ESP8266 WiFi 模組,利用 MQTT 傳輸協定,將迷你空氣盒子感測值連線上傳至QNAP NAS QIoT Suite Lite 平台。

一、更換為 ESP8266 WiFi 模式

1. 將原MiniDuino 8Pin多功能介面中的 3Pin 連接至 ESP8266 模組:MiniDuino 8Pin 上面 D1 接腳接到 ESP8266 RX 接腳,5V  VCCGND  GND,程式碼則可與用原來 Bluetooth 用同一支,再加一條跳線將 D13 接到 5V 即可完成,原 Arduino Code 不用更動。
2.程式利用跳線自動判斷是否為藍牙模組或 ESP8266 WiFi 模組,即可利用 ESP8266 連網上傳空氣感測資料至 QIoT Suite Lite 上。
3.  ESP8266 模組燒入 NodeMCU firmware,並用 ESPloer 寫入三支 LUA 程式,做為接收 Mini AirBox 感測數值的程式,並連網以 MQTT 上傳資料給 NAS QIoT Suite Lite 更換好模組,置入 Mini AirBox 內盒即成。
開機畫面:
顯示畫面:

二、燒錄 NodeMCU 方式:

1.下載 NodeMCU  bin 檔:https://github.com/nodemcu/nodemcu-firmware/releases
2.下載 ESP8266 專用燒錄程式:https://github.com/nodemcu/nodemcu-flasher
3.ESP8266 接腳圖
4.使用 USB to RS232(TTL 電壓準位線材連接電腦
►接線方式
(1) USB to TTL  TX 要接 ESP8266 WiFi 模組的RX
(2) USB to TTL  RX 要接 ESP8266 WiFi 模組的TX
(3) USB to TTL  5V 要接 ESP8266 WiFi 模組的VCC
(4) USB to TTL  GND 要接 ESP8266 WiFi 模組的GND
5.須將 ESP8266 模組之 IO0  GND 後進入燒錄模式,並於開始燒錄系統時將 RST 接腳接觸 GND 進行 Reset,燒錄程式即可將 NodeMCU  bin 檔燒錄至 ESP8266 中。
6.執行燒錄系統程式步驟:
(1)選擇COM Port
(2)Config Tab選擇所下載的 NodeMCU  bin 檔。
(4)可切到 Log Tab 確認 USB 線是否與 ESP8266 模組正確連線且 Ready
(5) Operation Tab ,按 Flash(F) 鍵即開始燒錄 NodeMCU 系統。(記得須先將 ESP8266模組之 IO0  GND 進入燒錄模式,並於開始燒錄系統時將 RST 接腳接觸 GND 進行Reset,才會開始燒錄)
(6)燒錄完成畫面如下:
(7)可切到 Log Tab 確認是否燒錄成功,若成功將出現下列畫面,即可將 USB 拔除。

三、利用ESPLORER工具寫入LUA程式

1.下載 ESPLORER 軟體:https://github.com/4refr0nt/ESPlorer
在下載頁面http://esp8266.ru/esplorer-latest/?f=ESPlorer.zip,再將ESPlorer.zip解壓縮至一個目錄中。
2執行 EsPlorer.bat(須將 USB  ESP8266 的連插回 PCIO0  RST 接腳移除)
3.進入 LUA 程式編輯畫面:
4. 選擇 COM Port
5. 選擇傳輸率,ESP8266 NodeMCU 燒錄完預設為 115200bps,再按 Open
6. 在左半邊 CODE 頁面視窗寫一下簡單測試程式,再按看一下結果。
print(‘hello world’);
7. 分別開啟 init.luaWiFi.luamqtt.lua三支程式,並寫入 ESP8266 NodeMCU 之檔案系統。
(1)init.lua 程式於 ESP8266 NodeMCU 啟動後會自動執行。
(2)Lua 程式中 dofile(‘ ‘); 指令是執行 NodeMCU 檔案系統內的 .Lua 程式,例如:dofile(‘filename.lua’);
(3)可按查看 NodeMCU 檔案系統內的已儲存的檔案:
8. “init.luamqtt.luawifi.lua”分別寫入到 NodeMCU 檔案系統
(1)init.lua 設定 ESP8266 UART baud rate 9600
(2) mqtt.lua 是主要傳送MQTT訊息的程式(包含host,port,usernsme,password,topic都要在此設定)
(3)wifi.lua 是設定ESP8266 WiFi
9.程式碼如下:
(1)wifi.lua
ssid = “WiFi-AP”
passwd = “WiFi-password”
print(“set up wifi mode”)
wifi.setmode(wifi.STATION)
wifi.sta.config(ssid,passwd)
–here SSID and PassWord should be modified according your wireless router
wifi.sta.connect()
tmr.alarm(1, 1000, 1, function()
    if wifi.sta.getip()== nil then
        print(“Waiting…”)
    else
        tmr.stop(1)
        print(“OK”)
        –print(“Config done, IP is “..wifi.sta.getip())
        –dofile(“yourfile.lua”)
    end
end)
(2)mqtt.lua
host = “x.x.x.x”     //MQTT Broker Server
port = 1883
clientId = “AirBox_1500742900”  // QIoT建立時產生的Client Id
user = “9e4a6881-7255-471c-9a71-a66d212458b5”  // QIoT產生的user
pwss = “r:622218ee6e42ae77100e237d402942bc” // QIoT產生的pwss
topic = “qiot/things/admin/AirBox/air”   // QIoT產生的MQTT topic
m = mqtt.Client(clientId, 120, user, pwss)
m:lwt(“/lwt”, “offline”, 0, 0)
m:on(“connect”, function(client) print (“OK”) end)
–m:on(“offline”, function(client) print (“offline”) end)
m:connect(host, port, 0, function(client)
  print(“OK”)
(3)init.lua
dofile(“wifi.lua”)
uart.setup(0, 9600, 8, uart.PARITY_NONE, uart.STOPBITS_1, 1)  //配合原藍牙傳輸率設定為9600
print(“OK”)
10.分別載入及執行測試 3  .lua 程式

四、Mini AirBox程式修改

1. Mini Airbox SendBT.ino 部分修改為:
  Serial.write(“val=\””);
  Serial.print(F(“E”));
  Serial.print(pm25);
  Serial.print(F(“,”));
  Serial.print(t);
  Serial.print(F(“,”));
  Serial.print(h);
  Serial.print(F(“,”));
  Serial.print(CO2);
  Serial.write(“\”;dofile(‘mqtt.lua’)\r\n”);
2.Mini Airbox主要是把原來送給 BT 的,改成送給 ESP8266 資料串及執行指令給 ESP8266執行

五、QIoT 環境建立

1.啟動 QIoT Suite Lite
2.建立 IoT Application
3.增加感測裝置
4.建立連線方式:
5.取得 MQTT 連線參數:clientIdusername passwordhostport 等資訊。
6.取得 MQTT 連線 topic 參數:
7.連線後利用 MQTTBox 測試接收 topic 資料:
8.使用 Node-RED 接收 MQTT 資料並利用 Dashboard 顯示:
9.Node-RED Dashboard source Code
(可利用Node-RED import clipboard 匯入)
[{“id”:”a0c69b59.1a67f8″,”type”:”ui_gauge”,”z”:”120555ad.f91cca”,”name”:””,”group”:”658b4bb2.9a50c4″,”order”:0,”width”:0,”height”:0,”gtype”:”gage”,”title”:”CO2″,”label”:”PPM”,”format”:”{{value}}”,”min”:0,”max”:”5000″,”colors”:[“#00b500″,”#e6e600″,”#ca3838″],”seg1″:”1500″,”seg2″:”2500″,”x”:721.7656784057617,”y”:635.7501153945923,”wires”:[]},{“id”:”8e6b714a.ae61a”,”type”:”change”,”z”:”120555ad.f91cca”,”name”:””,”rules”:[{“t”:”move”,”p”:”payload.value”,”pt”:”msg”,”to”:”payload”,”tot”:”msg”}],”action”:””,”property”:””,”from”:””,”to”:””,”reg”:false,”x”:502.5000915527344,”y”:631.0001382827759,”wires”:[[“cdd991e2.314b4″,”a0c69b59.1a67f8”]]},{“id”:”cdd991e2.314b4″,”type”:”ui_chart”,”z”:”120555ad.f91cca”,”name”:””,”group”:”658b4bb2.9a50c4″,”order”:0,”width”:0,”height”:0,”label”:”CO2(PPM)”,”chartType”:”line”,”legend”:”false”,”xformat”:”HH:mm:ss”,”interpolate”:”linear”,”nodata”:””,”ymin”:”100″,”ymax”:”3000″,”removeOlder”:”30″,”removeOlderPoints”:””,”removeOlderUnit”:”60″,”cutout”:0,”colors”:[“#1f77b4″,”#aec7e8″,”#ff7f0e”,”#2ca02c”,”#98df8a”,”#d62728″,”#ff9896″,”#9467bd”,”#c5b0d5″],”x”:741.5000686645508,”y”:567.9999523162842,”wires”:[[],[]]},{“id”:”90f4fdaf.eff3c”,”type”:”change”,”z”:”120555ad.f91cca”,”name”:””,”rules”:[{“t”:”move”,”p”:”payload.col4″,”pt”:”msg”,”to”:”payload.value”,”tot”:”msg”}],”action”:””,”property”:””,”from”:””,”to”:””,”reg”:false,”x”:497.7657012939453,”y”:566.7500228881836,”wires”:[[“8e6b714a.ae61a”]]},{“id”:”c338e157.c9566″,”type”:”csv”,”z”:”120555ad.f91cca”,”name”:””,”sep”:”,”,”hdrin”:””,”hdrout”:””,”multi”:”one”,”ret”:”\\n”,”temp”:””,”x”:149.50000762939453,”y”:321.00002098083496,”wires”:[[“2bdd4726.cb0fe8″,”640b2f28.c4026″,”90f4fdaf.eff3c”,”8301e6a4.295b28″]]},{“id”:”993377b6.e7fca8″,”type”:”change”,”z”:”120555ad.f91cca”,”name”:””,”rules”:[{“t”:”move”,”p”:”payload.value”,”pt”:”msg”,”to”:”payload”,”tot”:”msg”}],”action”:””,”property”:””,”from”:””,”to”:””,”reg”:false,”x”:192.76564025878906,”y”:125.75001239776611,”wires”:[[“c338e157.c9566”]]},{“id”:”2bdd4726.cb0fe8″,”type”:”change”,”z”:”120555ad.f91cca”,”name”:””,”rules”:[{“t”:”move”,”p”:”payload.col2″,”pt”:”msg”,”to”:”payload.value”,”tot”:”msg”}],”action”:””,”property”:””,”from”:””,”to”:””,”reg”:false,”x”:485.76564025878906,”y”:290.75001430511475,”wires”:[[“737662fa.72e72c”]]},{“id”:”640b2f28.c4026″,”type”:”change”,”z”:”120555ad.f91cca”,”name”:””,”rules”:[{“t”:”move”,”p”:”payload.col3″,”pt”:”msg”,”to”:”payload.value”,”tot”:”msg”}],”action”:””,”property”:””,”from”:””,”to”:””,”reg”:false,”x”:491.76563262939453,”y”:430.75009059906006,”wires”:[[“58c50f34.43071”]]},{“id”:”8301e6a4.295b28″,”type”:”function”,”z”:”120555ad.f91cca”,”name”:”get_PM25″,”func”:”msg.payload = msg.payload.col1.substring(1)\nreturn msg;”,”outputs”:1,”noerr”:0,”x”:471.3908500671387,”y”:195.02734184265137,”wires”:[[“8fd44775.be11a8″,”c3bb17ae.434ef8”]]},{“id”:”130b393b.7717c7″,”type”:”json”,”z”:”120555ad.f91cca”,”name”:”input”,”x”:288.3828125,”y”:53.59765625,”wires”:[[“993377b6.e7fca8”]]},{“id”:”737662fa.72e72c”,”type”:”change”,”z”:”120555ad.f91cca”,”name”:””,”rules”:[{“t”:”move”,”p”:”payload.value”,”pt”:”msg”,”to”:”payload”,”tot”:”msg”}],”action”:””,”property”:””,”from”:””,”to”:””,”reg”:false,”x”:494.50006103515625,”y”:354,”wires”:[[“767706a5.089868″,”e920f594.4dd108”]]},{“id”:”58c50f34.43071″,”type”:”change”,”z”:”120555ad.f91cca”,”name”:””,”rules”:[{“t”:”move”,”p”:”payload.value”,”pt”:”msg”,”to”:”payload”,”tot”:”msg”}],”action”:””,”property”:””,”from”:””,”to”:””,”reg”:false,”x”:502.5001220703125,”y”:500.00006198883057,”wires”:[[“634ccf4c.b43e4″,”3463c266.bef8ae”]]},{“id”:”8fd44775.be11a8″,”type”:”ui_chart”,”z”:”120555ad.f91cca”,”name”:””,”group”:”ec6ebb08.209478″,”order”:0,”width”:0,”height”:0,”label”:”PM2.5(ug/m3)”,”chartType”:”line”,”legend”:”false”,”xformat”:”HH:mm:ss”,”interpolate”:”linear”,”nodata”:””,”ymin”:”0″,”ymax”:”100″,”removeOlder”:”30″,”removeOlderPoints”:””,”removeOlderUnit”:”60″,”cutout”:0,”colors”:[“#1f77b4″,”#aec7e8″,”#ff7f0e”,”#2ca02c”,”#98df8a”,”#fd0600″,”#ff9896″,”#9467bd”,”#c5b0d5″],”x”:717.5000839233398,”y”:133.00003576278687,”wires”:[[],[]]},{“id”:”c3bb17ae.434ef8″,”type”:”ui_gauge”,”z”:”120555ad.f91cca”,”name”:””,”group”:”ec6ebb08.209478″,”order”:0,”width”:0,”height”:0,”gtype”:”gage”,”title”:”PM2.5″,”label”:”ug/m3″,”format”:”{{value}}”,”min”:0,”max”:”100″,”colors”:[“#00b500″,”#e6e600″,”#ca3838″],”seg1″:”30″,”seg2″:”50″,”x”:701.382942199707,”y”:201.21101570129395,”wires”:[]},{“id”:”8dfde0cf.ab26c”,”type”:”mqtt in”,”z”:”120555ad.f91cca”,”name”:”AirBox-air”,”topic”:”qiot/things/admin/AirBox/air”,”qos”:”0″,”broker”:”cb8b7f67.8092″,”x”:122,”y”:38,”wires”:[[“130b393b.7717c7”]]},{“id”:”767706a5.089868″,”type”:”ui_chart”,”z”:”120555ad.f91cca”,”name”:””,”group”:”a34f86b4.ad7138″,”order”:0,”width”:0,”height”:0,”label”:”溫度(℃)”,”chartType”:”line”,”legend”:”false”,”xformat”:”HH:mm:ss”,”interpolate”:”linear”,”nodata”:””,”ymin”:”0″,”ymax”:”100″,”removeOlder”:”30″,”removeOlderPoints”:””,”removeOlderUnit”:”60″,”cutout”:0,”colors”:[“#1f77b4″,”#aec7e8″,”#ff7f0e”,”#2ca02c”,”#98df8a”,”#d62728″,”#ff9896″,”#9467bd”,”#c5b0d5″],”x”:717.5001907348633,”y”:283.00007152557373,”wires”:[[],[]]},{“id”:”e920f594.4dd108″,”type”:”ui_gauge”,”z”:”120555ad.f91cca”,”name”:””,”group”:”a34f86b4.ad7138″,”order”:0,”width”:0,”height”:0,”gtype”:”gage”,”title”:”溫度“,”label”:”℃”,”format”:”{{value}}”,”min”:0,”max”:”100″,”colors”:[“#00b500″,”#e6e600″,”#ca3838″],”seg1″:”30″,”seg2″:”50″,”x”:705.7656173706055,”y”:353.7500047683716,”wires”:[]},{“id”:”634ccf4c.b43e4″,”type”:”ui_chart”,”z”:”120555ad.f91cca”,”name”:””,”group”:”d410888.400eb78″,”order”:0,”width”:0,”height”:0,”label”:”溼度(%)”,”chartType”:”line”,”legend”:”false”,”xformat”:”HH:mm:ss”,”interpolate”:”linear”,”nodata”:””,”ymin”:”0″,”ymax”:”100″,”removeOlder”:”30″,”removeOlderPoints”:””,”removeOlderUnit”:”60″,”cutout”:0,”colors”:[“#1f77b4″,”#aec7e8″,”#ff7f0e”,”#2ca02c”,”#98df8a”,”#d62728″,”#ff9896″,”#9467bd”,”#c5b0d5″],”x”:730.5000534057617,”y”:435.0000686645508,”wires”:[[],[]]},{“id”:”3463c266.bef8ae”,”type”:”ui_gauge”,”z”:”120555ad.f91cca”,”name”:””,”group”:”d410888.400eb78″,”order”:0,”width”:0,”height”:0,”gtype”:”gage”,”title”:”溼度“,”label”:”RH(%)”,”format”:”{{value}}”,”min”:0,”max”:”100″,”colors”:[“#00b500″,”#e6e600″,”#ca3838″],”seg1″:”30″,”seg2″:”50″,”x”:715.7656631469727,”y”:506.75001525878906,”wires”:[]},{“id”:”658b4bb2.9a50c4″,”type”:”ui_group”,”z”:””,”name”:”QIoT_CO2″,”tab”:”3615d9b9.f2f096″,”disp”:true,”width”:”6″},{“id”:”ec6ebb08.209478″,”type”:”ui_group”,”z”:””,”name”:”QIoT_PM25″,”tab”:”3615d9b9.f2f096″,”disp”:true,”width”:”6″},{“id”:”cb8b7f67.8092″,”type”:”mqtt-broker”,”z”:””,”broker”:”220.134.193.170″,”port”:”1883″,”clientid”:””,”usetls”:false,”compatmode”:true,”keepalive”:”60″,”cleansession”:true,”willTopic”:””,”willQos”:”0″,”willPayload”:””,”birthTopic”:””,”birthQos”:”0″,”birthPayload”:””},{“id”:”a34f86b4.ad7138″,”type”:”ui_group”,”z”:””,”name”:”QIOT_Temp”,”tab”:”3615d9b9.f2f096″,”disp”:true,”width”:”6″},{“id”:”d410888.400eb78″,”type”:”ui_group”,”z”:””,”name”:”QIoT_Humi”,”tab”:”3615d9b9.f2f096″,”disp”:true,”width”:”6″},{“id”:”3615d9b9.f2f096″,”type”:”ui_tab”,”z”:””,”name”:”QIoT_MiniAirBox”,”icon”:”dashboard”}]

結語

從硬體到軟體超詳細的手把手教學,你是否也學會了呢?一起來運用 Mini AirBox 空氣盒子和 QNAP NAP QIoT 平台,打造自己的隨身氣象觀測站,氣象觀測達人就是你!