본문 바로가기
Hardware/MCU(Arduino,ESP8266)

아두이노 온습도 센서 - DHT11, DHT 22

by lovey25 2020. 9. 28.
반응형

온습도 센서 DHT11 그리고 DHT22를 사용해서 온도와 습도를 측정하는 방법입니다.

DHT센서 기본

DHT11 센서와 DHT22 센서의 차이는 정밀도입니다. 많은 실습 키트 그리고 예제에서 DHT11 센서를 많이 사용하는데 DHT22는 DHT11보다 좀 더 정밀하게 온도와 습도를 측정할 수 있는 센서입니다. 

DHT11, DHT22 센서 모듈

DHT11 센서와 DHT22 센서의 차이점을 간단히 비교해 보면 아래와 같습니다. 대표적인 차이는 DHT22 센서가 좀 더 넓은 범위의 온도와 습도를 좀 더 정확하게 측정할 수 있지만 대신 가격이 좀 더 비싸다는 겁니다.

DHT센서는 내부에 온도와 습도를 측정할 수 있는 부품이 각각 들어있는데요. 온도 측정은 온도에 따라 저항이 변화는 성질을 가진 서미스터를 이용해서 측정합니다. 그리고 습도를 측정하는 부분은 저도 궁금했던 부분인데 온도와 유사하게 저항의 변화를 측정하는 방법을 사용합니다. 다만 습도에 따른 변화를 측정하기 위해서 아래 그림처럼 넓은 두 개의 전극 사이에 수분을 머금을 수 있는 재료를 넣어서 습도에 따라 전극 사이의 전도율이 달라지는 차이를 간접적으로 측정하는 방식을 사용한다고 합니다.

습도 센서의 구조, 출처: https://howtomechatronics.com

Datasheet

좀더 상세한 내용은 아래 데이터 시트를 참고하시면 되겠습니다.

DHT11_datasheet.pdf
0.82MB
DHT22-datasheet.pdf
0.88MB

Hardware(결선도)

DHT 온습도 센서는 4개의 핀이 나와있는 형태인데 이를 쉽게 사용할 수 있도록 전원선 2개(GND, VCC)와 데이터 선 1개로 만들어져 있는 모듈이 있는데 여기서는 핀 3개의 모듈을 사용합니다.

DHT22 센서 모듈을 아두이노 나노에 연결해 보겠습니다. 아래와 같이 GND-GND, VCC-5V, DAT-D2 각각 연결합니다. DHT 센서는 3V에서 5V까지 사용 가능하기 때문에 3.3V로 동작하는 EPS8266 보드를 사용하는 경우에는 VCC를 3.3V에 연결하면 됩니다. 엄청 간단하죠?!

Software(펌웨어 코딩)

라이브러리

DHT센서용 라이브러리는 "DHT sensor library by Adafruit"를 사용했습니다. DHT11, DHT22 모두 지원하는 라이브러리이고 가장 많이 사용하는것 같네요. 그런데 이 라이브러리는 Adafruit Unified Sonsor 라이브러리에 의존성이 있는 것 같네요. 그래서 두 라이브러리 모드 사용하도록 해 줍니다.

PlatformIO IDE에서 필요한 라이브러리 확인

펌웨어

아두이노에 올릴 소스코드입니다. DHT sensor library에 있는 예제에서 필요없는 부분 삭제하고 일부 수정을 한 버전입니다.

#include "DHT.h"

#define DHTPIN 2     // Digital pin connected to the DHT sensor

// Uncomment whatever type you're using!
//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

// Connect pin 1 (on the left) of the sensor to +5V
// NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1
// to 3.3V instead of 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);
  dht.begin();
}

void loop() {
  // Wait a few seconds between measurements.
  delay(2000);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t)) {
    Serial.println(F("Failed to read from DHT sensor!"));
    return;
  }

  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);

  Serial.print(F("Humidity: "));
  Serial.print(h);
  Serial.print(F("% , Temperature: "));
  Serial.print(t);
  Serial.println(F("degC "));
  Serial.print(F("Heat index: "));
  Serial.print(hic);
  Serial.println(F("degC"));
}

라이브러리 사용을 위해서 첫번째 줄에서 "DHT.h"헤더를 포함시켜주었고 DHT 센서에서 데이터를 받아올 핀은 D2핀으로 지정했습니다. 그리고 6~8행에서 사용하는 센서의 타입에 따라 주석처리를 수정하면 됩니다. 저는 DHT22 센서를 사용하기 때문에 7행을 주석 해지했습니다.

그리고 10~15행에서 센서 사용방법에 대해 적혀있는데 전 모듈타입을 사용하기 때문에 크게 신경 쓰지 않아도 되는 것 같네요.

로직의 흐름은 setup함수에서 시리얼 포트와 DHT센서를 초기화 시키고 loop함수가 2초마다 반복되면서 DHT센서로부터 온습도 데이터를 받고 받아온 데이터를 시리얼 포트로 출력해주도록 되어 있습니다.

아래는 PlatformIO IDE에서 Platformio.ini파일 설정내용입니다. PlatformIO 사용하시면 참고하세요.

[env:nano]
platform = atmelavr
framework = arduino
board = nanoatmega328new
lib_deps =
  adafruit/Adafruit Unified Sensor @ ^1.1.4
  adafruit/DHT sensor library @ ^1.1.4

결과

정상적으로 업로드가 되었다면 다음과 같이 온습도가 표시되는것 보실 수 있습니다.

 

끝!

반응형

댓글