2014年5月13日 星期二

Arduino 上使用 DHT11 溫濕度 Sensor + Bluetooth

今天我們要介紹的是如何在 Arduino 上使用 HC-05 這個藍牙模組將 DHT11 溫濕度 sensor 資訊,以無線傳輸的方式回傳至電腦端。

今天用到的材料清單如下:
  • 內建藍牙筆電(或有藍牙接收器的 PC ) x 1
  • Arduino  UNO  x 1
  • DHT11 溫濕度 Sensor  x 1
  • HC-05 藍牙模組   x 1
  • 杜邦線 (公母頭) x 7
  • 外接電源(行動電源或手機充電器) x 1
  • USB 線  x 1

若你手上的 HC-05 藍牙模組需要更改 Baud rate ,請依照 HC-05 藍牙模組設定 這篇文章先進行 Baud rate 設定。

Step 1 :

首先我們先將以下程式燒錄到 Arduino

/*

Board int.0 int.1 int.2 int.3 int.4 int.5
Uno, Ethernet 2 3
Mega2560 2 3 21 20 19 18
Leonardo 3 2 0 1
Due (any pin, more info http://arduino.cc/en/Reference/AttachInterrupt)
*/

#include <idDHT11.h>

int idDHT11pin = 2; //Digital pin for comunications
int idDHT11intNumber = 0; //interrupt number (must be the one that use
                          //the previus defined pin (see table above)
//declaration
void dht11_wrapper(); // must be declared before the lib initialization

// Lib instantiate
idDHT11 DHT11(idDHT11pin,idDHT11intNumber,dht11_wrapper);

void setup()
{
    Serial.begin(9600);
    Serial.println("idDHT11 Example program");
    Serial.print("LIB version: ");
    Serial.println(IDDHT11LIB_VERSION);
    Serial.println("---------------");
}


// This wrapper is in charge of calling 
// mus be defined like this for the lib work
void dht11_wrapper() {
    DHT11.isrCallback();
}
void loop()
{
    Serial.print("\nRetrieving information from sensor: ");
    Serial.print("Read sensor: ");
    //delay(100);
    DHT11.acquire();
    while (DHT11.acquiring());
    int result = DHT11.getStatus();


    switch (result)
    {
       case IDDHTLIB_OK: 
       Serial.println("OK"); 
       break;


       case IDDHTLIB_ERROR_CHECKSUM: 
       Serial.println("Error\n\r\tChecksum error"); 
       break;


       case IDDHTLIB_ERROR_ISR_TIMEOUT: 
       Serial.println("Error\n\r\tISR Time out error"); 
       break;


       case IDDHTLIB_ERROR_RESPONSE_TIMEOUT: 
       Serial.println("Error\n\r\tResponse time out error"); 
       break;


       case IDDHTLIB_ERROR_DATA_TIMEOUT: 
       Serial.println("Error\n\r\tData time out error"); 
       break;


       case IDDHTLIB_ERROR_ACQUIRING: 
       Serial.println("Error\n\r\tAcquiring"); 
       break;


       case IDDHTLIB_ERROR_DELTA: 
       Serial.println("Error\n\r\tDelta time to small"); 
       break;


       case IDDHTLIB_ERROR_NOTSTARTED: 
       Serial.println("Error\n\r\tNot started"); 
       break;


       default: 
       Serial.println("Unknown error"); 
       break;
    }
    Serial.print("Humidity (%): ");
    Serial.println(DHT11.getHumidity(), 2);

    Serial.print("Temperature (oC): ");
    Serial.println(DHT11.getCelsius(), 2);

    Serial.print("Temperature (oF): ");
    Serial.println(DHT11.getFahrenheit(), 2);

    Serial.print("Temperature (K): ");
    Serial.println(DHT11.getKelvin(), 2);

    Serial.print("Dew Point (oC): ");
    Serial.println(DHT11.getDewPoint());

    Serial.print("Dew Point Slow (oC): ");
    Serial.println(DHT11.getDewPointSlow());

    delay(2000);
}

Step 2 : 接上藍牙與溫濕度 Sensor

在 Step 1 中將程式碼燒錄完成後,我們可以開始將感測器與藍牙接上 Arduino。以下的接線過程中,記得要讓 Arduino 保持斷電狀態。


Bluetooth 腳位對照表,請將各腳位對應至 Arduino 上接好


DHT 11 溫濕度 Sensor 腳位對照表,請將各腳位對應至 Arduino 上接好


Step 3 : 下載通訊軟體

因為 Arduino 在後續的使用上將會脫離與 PC 端連接,因此若要收取經由藍牙回傳至電腦端的封包資料,我們必須在接收端的電腦上安裝一套可以收取 COM port 封包的軟體,在此我們推薦使用 Tera Term  。 Tera Term 是一套 Open source 的軟體,介面簡潔好用,是我相當推薦的原因。

若你的電腦是 Windows 作業系統,請在 Tera Term 的 Download page 中挑選 exe 檔進行安裝。



Step 4 : 搜尋藍牙裝置與建立通訊埠

Arduino 上的藍牙模組要能傳送資料給 PC 前,我們需將 Arduino 電源接上,使 Arduino 處於供電狀態,並在電腦上針對該藍牙模組開啟一個適當的通訊埠(COM  port )。在此我僅示範 Windows 7 的藍牙通訊埠建立流程,詳見如下:


開啟藍牙管理中心後,點選新增裝置

搜尋到藍牙模組後,請點選該模組,並按下一步


選擇『輸入裝置的配對碼』,HC-05 藍牙模組的預設密碼為 1234



密碼驗證成功後,開始安裝驅動程式與建立 COM port



Step 5 : 開啟 Tera Term 接收資料

以上四個步驟都建立好後,開啟 Tera Term,畫面如下,請點選 Cancel


進入主畫面後,請於上方功能選單點選 Setup  ->  Serial port


開啟 Serial port 選單後,可在上方 Port 選單下拉,檢查是否有新增稍早建立的藍牙通訊埠,在下圖中我們可以看到新增的 COM 6 、COM 11,兩者擇一即可。


選擇 COM port 完成後,請檢查 Baud rate 是否正確。如果你在藍牙模組上所設定的 Baud rate 並非 9600,請依照藍牙上的 Baud rate 進行選擇。例如,你在藍牙上的 Baud rate 為 115200,那麼在 Tera Term 這個視窗中,你就需要選擇 115200 。確認後,按下 OK 即可開始通訊。


若藍牙與溫濕度 Sensor 有正常工作,電腦自藍牙接收到的溫濕度資料就像下圖一樣,分別呈現出不同的溫濕度。




以上就是透過 HC-05 藍牙模組將 Arduino 上的溫濕度 Sensor 資訊傳至電腦端的實驗步驟。透過這些步驟,你可以整合更多有意思的感測器,並透過藍牙或 Wifi 的方式傳回電腦上,讓你的 Arduino 設備不再因為線材而綁手榜腳。

2014年5月12日 星期一

Arduino + HC-05 Bluetooth module setting ( AT Mode and Baud rate setting )

Arduino 有許多容易使用的模組與 Lib ,可以讓人快速的驗證流程與效果,但為了能讀取 Arduino 上的溫濕度、光敏電阻、電壓等數位、類比訊號,我們難道就只能用 USB Cable 讀取嗎?不不,我們還有 Wifi module 和 Bluetooth module 可以幫助 Arduino 添加無線傳輸功能,讓我們拋開 USB Cable ,把 Arduino 發揮更多可能。

市面上販售的藍牙模組、Wifi 模組有許多型號,各種型號版本各有些許差異,但在這篇筆記中,我們僅探討:HC-05 這個藍牙模組。

為什麼僅探討 HC-05 模組?

1. 筆者手邊僅有這個型號的藍牙模組

2  我買來好久一段時間,一直沒能搞定 AT Mode 和傳輸問題

3. 網路上將近八成的藍牙模組筆記,多是探討 HC-06,其底下留言中有許多跟著步驟操
    作仍無法成功的朋友(我亦是其一),且拍賣網頁上的模組介紹,有許多將 HC-06 與 
    HC-05 搞混

4. 幾乎找不到對 HC-05 的 AT Mode 設定文章與介紹

基於以上四點理由,我覺得我該寫一篇文章分享給同樣遇到藍牙模組設定有問題的朋友們。




首先讓我們先來看一下 HC-05 的外觀:


 正面

背面


由背面我們可以看到版本編號為 V1.05 ,但若依照 V1.05 進行搜尋筆記或拍賣時,有可能會得到誤導的資料與型號。筆者依照 V1.05 於露天拍賣、淘寶、Yahoo 拍賣上搜尋,V1.05 的版本名稱為 HC-06 ,但經由實驗過程中發現,這根本是 HC-05!難怪許多網頁上的操作步驟,怎麼測試就是無法進入 AT Mode 更改 Baud rate,原來一開始就搞錯了版本。

HC-05 與 HC-06 的 AT Mode 在操作中, HC-06 較簡單, HC-05 則需要透過 key pin 的設定才可以進入 AT Mode。





進入設定步驟說明前,介紹一下我的設備與 Arduino 版本,並依照下列步驟,逐一將 HC-05 與 Arudino 連接、設定:

  • Arduino UNO           x 1
  • HC-05 藍牙模組     x 1
  • 杜邦線(公母頭)x 4
  • Arduino  IDE  1.0.5 - r2





Step 1 : 以杜邦線將 HC-05 與 Arduion 連接

接線腳位對照表
  • HC-05 GND <---> Arduino GND Pin
  • HC-05 Vcc (5V) <---> Arduino 5V
  • HC-05 TX  <---> Arduino Pin 10 (soft RX)
  • HC-05 RX  <---> Arduino Pin11 (soft TX)
  • HC-05 Key <---> Arduino Pin 9


Step 2 : 上傳程式碼至 Arduino

/*

AUTHOR: Hazim Bitar (techbitar)
DATE: Aug 29, 2013
LICENSE: Public domain (use at your own risk)
CONTACT: techbitar at gmail dot com (techbitar.com)

*/


#include <SoftwareSerial.h>

SoftwareSerial BTSerial(10, 11); // RX | TX

void setup()
{
  pinMode(9, OUTPUT);// this pin will pull the HC-05 pin 34 (key pin)HIGH 
                     // to switch module to AT mode

  digitalWrite(9, HIGH);
  Serial.begin(9600);
  Serial.println("Enter AT commands:");
  BTSerial.begin(38400);  // HC-05 default speed in AT command more
}

void loop()
{

  // Keep reading from HC-05 and send to Arduino Serial Monitor
  if (BTSerial.available())
    Serial.write(BTSerial.read());

  // Keep reading from Arduino Serial Monitor and send to HC-05
  if (Serial.available())
    BTSerial.write(Serial.read());
}

將上面程式碼複製到 Arduino IDE 中編譯、上傳,並開啟 Serial Moniter。



Step 3 : 設定 HC-05 進入 AT Mode

* 注意 : 請先將 Arduino 電源拔除再進行以下步驟


1. 確認是否線路皆依照 Step 1 接線完成

2. 把 Arduino 接上電源前,請將 HC-05 連接至 Arudino 上的 Vcc 腳位拔除,其餘四支腳位皆維
    持連接狀態

3. 確認拔除 Vcc 腳位後,現在可將 Arduino 接上電源

4. 確認 HC-05 目前沒有與任何藍牙裝置配對中

5. 將 HC-05 的 Vcc 腳位插回 Arduino Vcc

6. 上述步驟都正確執行後, HC-05 的 LED 燈應該維持兩秒閃爍一次的頻率。若燈號狀態正
    常,此時已進入 AT Mode

7. 為了驗證是否正確登入 AT Mode ,請開啟 Serial Moniter ,並設定視窗右下角的 Baud rate 為
    9600,於 Serial Moniter 上方欄位中輸入大寫 " AT " ,將收到回應 " OK "

8. 如果依舊沒有辦法收到 " OK " 回覆,請再次檢查您的線路與步驟是否正確


進入 AT 模式後,若設定皆正常,於畫面應顯示 " Enter AT commands ",而非亂碼,若呈現亂碼請注意右下角 Baud rate 速率與格式設定。輸入 " AT ",可得到回應 " OK " 。

改變 HC-05 Baud rate , 請輸入 " AT+UART=115200,1,0 ",改變成功可得到回覆 " OK ",其中 115200 為最高 Baud rate 值,1 則是停止位元,0 為檢查位元,調整 Baud rate 時,僅需調整前面的 Baud rate 值即可。


請注意程式碼中的 Serial.begin(9600) 與 BTSerial.begin(38400),這兩者的數值請勿調整

Step 4 : 設定 HC-05 各項 AT 指令

以下為常用指令,若需參考其他 HC-05 指令,可點選以下連結:
http://www.electronicaestudio.com/docs/istd016A.pdf

返回初始預設值 : AT+ORGL

查詢版本 : AT+VERSION?

更改藍牙名稱 : AT+NAME=XXXX  (其中 XXXX 為欲設定的名稱 )

更改 Baud rate : AT+UART=XXXX,1,0  (其中 XXXX 為欲設定的 baud rate 值 )

更改密碼 : AT+PSWD= XXXX ( 其中 XXXX 為新密碼 )




障礙排除

如果 HC-05 與 Arduino 的接線皆正常,程式也沒有錯誤,打開 Serial Moniter 設定與 Baud rate 也正常,但無論怎麼輸入 " AT " 都無法得到 " OK " ,請參考以下解決方案

燈號狀態


  • 若燈號為兩秒閃爍一次,請重新確認 BTSerial.begin(38400) 是否正確,並請重新操作上述步驟


  • 若燈號為快速閃爍,請依照以下步驟設定


1. 拔除 USB 線,使 Arduino 處於斷電狀態

2. 將 Pin 9 的腳位拔除後,插入 Vcc 3.3V 腳位

3. 插上 USB 後,檢查 HC-05 燈號,若燈號為兩秒閃爍一次,此時已正確進入 AT Mode,若燈
    號為快速閃爍,請重新操作一次接線步驟



以上為進入 HC-05  AT Mode 設定,若你在其他 Blog 或 論壇上找到的操作方法無法正常設定,或許你手上的藍牙模組有可能與我的相同是『掛羊頭賣狗肉』的 HC-05 ! 

2014年5月5日 星期一

2.4Ghz 與 5Ghz 穿透性與傳輸效果

近期有朋友買了 5Ghz 的 AP 設備後,分享了相關心得,但令他不解的是:為何 5Ghz 的網通設備,其穿透率不如 2.4Ghz 的高?在此我們不討論詳盡的物理實驗與計算,僅回歸探討「波長」與「能量」還有「繞射」等基本科普問題。


見圖 1, 首先讓我們複習「波」的基本定義。於橫軸上有一波形,以橫軸為零點,橫軸以上的波形,其峰頂點稱為「波峰」,由波峰至橫軸的距離稱為「振幅」;橫軸以下的波形,其低點稱為「波谷」兩個波峰之間的距離稱之為「波長」。


波長越長,其頻率越低,能量也較低,因此穿透率較差;相反的,波長越短,能量越高,頻越也高,其穿透率也較強。


圖 1(轉自網路)



生活中我們從無線電、3G基地台、可見光、紅外線、X光、微波爐等,這些都是以波的是形式存在我們四周,見圖 2:

圖 2(轉自 wiki 百科)



再來讓我們談談繞射問題,圖 3 為著名的楊氏雙縫實驗(繞射、干涉於雙縫實驗同時發生),相信各位高中物理課程都有實驗過,在 Wiki 上對於繞射的定義如下:

繞射(英語:diffraction)是指波遇到障礙物時偏離原來直線傳播的物理現象。


在古典物理學中,波在穿過狹縫、小孔或圓盤之類的障礙物後會發生不同程度的彎散傳播。假設將一個障礙物置放在光源和觀察屏之間,則會有光亮區域與陰晦區域出現於觀察屏,而且這些區域的邊界並不銳利,是一種明暗相間的複雜圖樣。這現象稱為繞射,當波在其傳播路徑上遇到障礙物時,都有可能發生這種現象。


圖 3  楊氏干涉與繞射雙縫實驗(轉自 wiki 百科)




複習了波的基本物理後,我們可以開始探討:為何 2.4Ghz 於室內的傳撥能力優於 5Ghz ?


圖 4 2.4Ghz 與 5Ghz 比較表

圖 4 左側示意圖中,我將每個波的粒子以小人偶代替,藉此以簡單的方式陳述 2.4 G 為何繞射能力較優,圖 4 右側為 2.4Ghz 與 5Ghz 比較表,從表中得知 5Ghz 穿透能力較 2.4Ghz 強,但為何 5Ghz 於室內傳輸的狀況較差? 註:圖 4 中的擬人說法,於實際物理實驗與理論中其實是不大正確的,但這僅是為了概述說明波長於繞射實驗的影響所做的簡單陳述,若有任何問題,歡迎指教。

當每個小人偶依序排隊要通過狹縫時,可以看到 5Ghz 的波長短,頻率高,因此小人偶欲通過狹縫時較為擁擠,雖穿透能力較強,但其能量都耗費於「穿透」上,因此其剩餘能力用於繞射上就顯得心有餘而力不足,因此繞射的效果較差。相反的, 2.4Ghz 波長較長,頻率低,小人偶彼此之間的距離拉大,通過狹縫的程度較為容易,且經由繞射與反射,使 2.4Ghz 於是內的傳輸狀況優於 5Ghz。


因此透過上述說明與比較表,我們來歸納以下兩點 2.4Ghz 與 5Ghz 的比較:

傳輸能力

5Ghz 的能量較強,傳輸速率快,若在開闊地點,例如台北地下街、美食街等開放式地形,不需將能量耗費於穿透障礙物或建築物時,5Ghz 在此類環境中更能擔任高負載性的群眾上網需求應用;2.4Ghz 若是家居環境下,雖有牆壁、家具等障礙物,但傳輸範圍不需高達數十、數百公尺以上,因此透過繞射與反射即可達到一定程度的訊號傳撥。當然若有更穩定的頻寬需求,加裝 Router 是最基本的解決方案,並非一定要更換 5Ghz 網通設備不可。


設備普及率與價格

目前市面上的網通設備依舊是以 2.4Ghz 為大宗,無論是 802.11 a/b/g ,2.4Ghz 的產品幾乎都有滿足需求的選項可供購買,但 5Ghz 的產品為數不多,穩定性也與價格高低有關。如果你在家中只是想要用 iPad 躺在床上看看韓劇來自星星的你,對你而言,用 2.4Ghz 和 5Ghz 有差嗎?我想差異不會太大,畢竟家中成員同一時間使用 AP 的人數不會太多,因此網路速度影響有限。所以是否真的需要 5Ghz ,除了衡量使用環境外,當然還有你的荷包與使用人數作為網通設備的採購考量。


如何挑選適合的網通設備,這端看各位所要架設的範圍與地區來決定,若是位於室內,目前還是推薦以 2.4Ghz 為佳;若使用地點為開闊地形,那麼 5Ghz 將有助於良好的高速上網體驗。