Maker物聯網實作:用DHx溫濕度感測模組回傳天氣溫溼度

Maker物聯網實作:用DHx溫濕度感測模組回傳天氣溫溼度

由於人類不斷破壞地球資源,大氣層的溫室效應越來越嚴重,家中許多長者,面對酷熱的天氣變化無常,常會引起疾病,在前一篇內容就有介紹使用數位化的DS18B20溫度感測器來偵測溫度,但是溫度與濕度常常是一體兩面的東西,在濕度太高時,家中年長者又會引發風濕痛,所以如果可以一併得到溫濕度的資訊,那該有多好。為了完成我們的心願,我們使用了整合型的DHx溫濕度感測模組來告訴我們溫度與濕度的資訊。

文\曹永忠、許智誠、蔡英德

溫濕度控制

目前市面上的感測器很多種,例如圖示的Dallas DS18B20 溫度感測器和DHT11溫濕度感測器等等…,種類非常多種,但是我們並非使用在數百度的高溫場所,我們大部份皆使用在一般市溫場所的溫度感測器。

我們如果要可以兼備溫度與濕度量測的功能,那麼就必須採用DHT11溫濕度感測器,因為DHT11溫濕度感測器本身就具備溫度與溼度兩種感測器的功能。

Maker物聯網實作:用DHx溫濕度感測模組回傳天氣溫溼度

▲  Dallas DS18B20 溫度感測器

Maker物聯網實作:用DHx溫濕度感測模組回傳天氣溫溼度

▲ DHT11溫濕度感測器

 

DHT11溫濕度感測模組

為了讓Arduino開發板簡化使用,我們使用了DHT11溫濕度感測模組,本模組只要將Vcc接到Arduino開發板+5V腳位,Gnd接到Arduino開發板Gnd腳位,DataVcc接到Arduino開發板Digital Input 腳位2,接腳圖可參考表1之Arduino開發板外部插斷接腳圖,詳細內容請參考(https://www.arduino.cc/en/Reference/AttachInterrupt),並執行下列程式,若網友想要自行組立DHT11溫濕度感測器的線路,可以參考圖示的DHT11溫濕度感測器與單晶片開發板連接線路圖。

Maker物聯網實作:用DHx溫濕度感測模組回傳天氣溫溼度

▲ DHT11溫濕度感測模組

表 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

7

 

 

表 2 DHT11溫濕度感測模組接腳圖

DHT11溫濕度感測模組 

Arduino開發板接腳

解說

Data

Arduino digital Input pin 2

DHT11資料輸出腳位

5V

Arduino pin 5V

5V 陽極接點

GND

Arduino pin Gnd

共地接點

 

其餘關於DHT11溫濕度感測器的細部資料,本篇使用的DHT-11函式庫,是採用網路上Nicolas(niesteszeck@gmail.com)針對DHT11 Temperature and Humidity Sensor所撰寫的Arduino library,Nicolas在GitHub, Inc.撰寫之程式碼(GitHub, 2013),其下載網址為:https://github.com/niesteszeck/idDHT11 ,特此感謝分享。

Maker物聯網實作:用DHx溫濕度感測模組回傳天氣溫溼度

▲  DHT11溫濕度感測器與單晶片開發板連接線路簡圖

DHT11溫濕度感測器讀取溫濕度測試程式,參考Nicolas(niesteszeck@gmail.com)針對DHT11 Temperature and Humidity Sensor所撰寫的Arduino librar,其中所附的範例程式idDHT11_Lib_example所改寫得程式,其下載網址為:https://github.com/niesteszeck/idDHT11,特此感謝分享。

表 3 DHT11溫濕度感測器讀取溫濕度測試程式

DHT11溫濕度感測器讀取溫濕度測試程式(DHT_11_test1)

/*

  Board                    int.0           int.1   int.2   int.3   int.4   int.5

 Uno, Ethernet              2        3

 Mega2560       2 ZX              3        21      20      19      18

 Leonardo         3        2        0        1

 Due              (any pin, more info http://arduino.cc/en/Reference/AttachInterrupt)

 

 This example, as difference to the other, make use of the new method acquireAndWait()

 */

// use digital pin 2 to connect DHT-11 data pin

 

#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);

 

  int result = DHT11.acquireAndWait();

  switch (result)

  {

  case IDDHTLIB_OK:

    Serial.println("OK");

    break;

  case IDDHTLIB_ERROR_CHECKSUM:

    Serial.println("Error\n\r\tChecksum error");

    break;

  case IDDHTLIB_ERROR_TIMEOUT:

    Serial.println("Error\n\r\tTime 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);

}

參考資料來源:https://github.com/niesteszeck/idDHT11

由上述程式執行後,可以見圖示DHT11溫濕度感測器讀取溫濕度測試程式畫面結果,也可以輕易讀到外界的溫度與濕度了。

Maker物聯網實作:用DHx溫濕度感測模組回傳天氣溫溼度

▲ DHT11溫濕度感測器讀取溫濕度測試程式畫面結果

DHT22溫濕度感測模組

本實驗為了讓Arduino開發板進階使用,使用了更進階的的DHT22溫濕度感測模組如圖示所示,本模組只要將Vcc接到Arduino開發板+5V腳位,Gnd接到Arduino開發板Gnd腳位,DAT接到Arduino開發板Digital Input 腳位2,接腳圖見表4 Arduino開發板外部插斷接腳圖,詳細內容請參閱http://arduino.cc/en/Reference/AttachInterrupt),並執行下列程式。

       Maker物聯網實作:用DHx溫濕度感測模組回傳天氣溫溼度

▲ DHT22溫濕度感測模組

表 4 DHT22溫濕度感測模組接腳圖

DHT22溫濕度感測模組 

Arduino開發板接腳

解說

DAT

Arduino digital Input pin 2

DHT22資料輸出腳位

5V

Arduino pin 5V

5V 陽極接點

GND

Arduino pin Gnd

共地接點

其餘關於DHT22溫濕度感測器的細部資料,本篇使用的DHT-22函式庫,是採用網路上Seeed-Studio針對DHT22 Temperature and Humidity Sensor所撰寫的Arduino library,Seeed-Studio在GitHub, Inc.撰寫之程式碼,其下載網址為:https://github.com/Seeed-Studio/Grove_Temperature_And_Humidity_Sensor,特此感謝分享。

我們將表 5之DHT22溫濕度感測器讀取溫濕度測試程式撰寫好之後,編譯完成後上傳到Arduino開發板,

表 5 DHT22溫濕度感測器讀取溫濕度測試程式

DHT22溫濕度感測器讀取溫濕度測試程式(DHT_22_test1)

// Example testing sketch for various DHT humidity/temperature sensors

// Written by ladyada, public domain

 

#include "DHT.h"

 

#define DHTPIN 2 // what pin we're connected to

 

// Uncomment whatever type you're using!

//#define DHTTYPE DHT11 // DHT 11

#define DHTTYPE DHT22 // DHT 22 (AM2302)

//#define DHTTYPE DHT21 // DHT 21 (AM2301)

 

// Connect pin 1 (on the left) of the sensor to +5V

// Connect pin 2 of the sensor to whatever your DHTPIN is

// Connect pin 4 (on the right) of the sensor to GROUND

// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor

 

DHT dht(DHTPIN, DHTTYPE);

 

void setup()

{

    Serial.begin(9600);

    Serial.println("DHTxx test!");

 

    dht.begin();

}

 

void loop()

{

    // Reading temperature or humidity takes about 250 milliseconds!

    // Sensor readings may also be up to A0 seconds 'old' (its a very slow sensor)

    float h = dht.readHumidity();

    float t = dht.readTemperature();

 

    // check if returns are valid, if they are NaN (not a number) then something went wrong!

    if (isnan(t) || isnan(h))

    {

        Serial.println("Failed to read from DHT");

    }

    else

    {

        Serial.print("Humidity: ");

        Serial.print(h);

        Serial.print(" %\t");

        Serial.print("Temperature: ");

        Serial.print(t);

        Serial.println(" *C");

    }

}

參考資料來源:Grove- Temperature and Humidity Sensor

(http://www.seeedstudio.com/wiki/Grove-_Temperature_and_Humidity_Sensor)

上述程式執行後,可以見到圖示DHT22溫濕度感測器讀取溫濕度測試程式畫面結果,也可以輕易讀到外界的溫度與濕度了。

Maker物聯網實作:用DHx溫濕度感測模組回傳天氣溫溼度

▲ DHT22溫濕度感測器讀取溫濕度測試程式畫面結果

作者介紹

曹永忠 (Yung-Chung Tsao):目前為自由作家、台灣資訊傳播學會秘書長,專研於軟體工程、軟體開發與設計、物件導向程式設計,商品攝影及人像攝影。長期投入資訊系統設計與開發、企業應用系統開發、軟體工程、新產品開發管理、商品及人像攝影等領域,並持續發表作品及相關專業著作。

Email:prgbruce@gmail.com ,Line ID:dr.brucetsao Maker物聯網實作:用DHx溫濕度感測模組回傳天氣溫溼度

Arduino部落格:http://taiwanarduino.blogspot.tw/

範例原始碼網址:https://github.com/brucetsao/arduino_RFProgramming

臉書社群(Arduino.Taiwan):https://www.facebook.com/groups/Arduino.Taiwan/

Arduino活動官網:http://arduino.kktix.cc/

Youtube:https://www.youtube.com/channel/UCcYG2yY_u0m1aotcA4hrRgQ

曹永忠
作者

曹永忠,國立中央大學資訊管理學系博士,目前在暨南大學電機工程學系兼任助理教授與自由作家,專注於軟體工程、軟體開發與設計、物件導向程式設計......並持續發表作相關專業著作。

使用 Facebook 留言
發表回應
謹慎發言,尊重彼此。按此展開留言規則