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 設備不再因為線材而綁手榜腳。

10 則留言:

  1. 請文如果想把藍芽傳輸對象從電腦變成手機APP呢? 可以麻煩給些建議嗎? (初學者)

    回覆刪除
  2. 您可能需要先翻閱 APP 教學書籍,針對藍牙資料接收、發送章節先學習藍牙封包格式。有許多現成的 Android APP 可以下載測試,以下為 Google Play 上搜尋的範例:https://play.google.com/store/apps/details?id=com.app.control&hl=zh_TW

    回覆刪除
  3. 您好:

    我看有些藍牙教學有時用Wire或是SoftwareSerial來協助資料的讀寫
    想請問您的寫法爲何只用Serial.println就可以呢?
    謝謝

    回覆刪除
    回覆
    1. 您好

      採用 Software Serial 能讓 digital Pin 模擬為 RX TX 腳位, 可讓 Arduino 在下載程式或使用 USB 通訊過程中, 不需要先拆除 RX TX 上的 Serial 接線.

      無論是直接採用 Serial 或 Software Serial 都是可行的, 最大差異在於 Serial 所通訊的腳位是 RX TX 腳位, 因此下載程式時, 需先拔除才不會與 USB 衝突, 導致無法下載程式

      刪除
  4. 您好,不好意思打擾了。

    版主所使用DHT11的library與官網(Arduino)所提供的版本不同,
    不知道能否向版主索取該版本的library? 目前還是arduino新手,
    希望能透過此教學進一步學習。 謝謝

    不好意思

    回覆刪除
    回覆
    1. 您好,這裡有 DHT11 的 library ,請下載後解壓縮放至 Arduino library 即可
      https://github.com/niesteszeck/idDHT11

      刪除
  5. 您好,最後一張圖片呈現的是偵測一次溫濕度後,重複印出,請問能夠每偵測一次,就印出一次嗎?

    回覆刪除
    回覆
    1. 可以的,這部分請使用「迴圈」程式進行控制就可以達到您要的效果,謝謝!

      刪除
  6. 請問HC-06模組也能像上述一樣回傳值至電腦嗎

    回覆刪除