이 아두이노 튜토리얼에서는 아두이노 보드와 함께 DHT11 또는 DHT22 센서를 사용하여 온도와 습도를 측정하는 방법을 배웁니다. 아래 동영상을 시청하거나 작성된 튜토리얼을 읽어보세요.
센서 사양 및 차이점
이 센서들은 매우 저렴하면서도 뛰어난 성능을 제공하기 때문에 전자 애호가들 사이에서 인기가 높습니다. 두 센서의 주요 사양과 차이점은 다음과 같습니다.
DHT22는 더 비싼 버전으로 당연히 더 나은 사양을 가지고 있습니다. 온도 측정 범위는 -40°C ~ +125°C이며 정확도는 ±0.5°C입니다. 반면 DHT11의 온도 범위는 0°C ~ 50°C에 정확도는 ±2°C입니다. 습도 측정에서도 DHT22는 0~100% 범위에 2~5% 정확도를, DHT11은 20~80% 범위에 5% 정확도를 제공합니다.
DHT11이 DHT22보다 나은 두 가지 사양이 있습니다. 샘플링 속도가 DHT11은 1Hz(초당 1회 측정)인 반면 DHT22는 0.5Hz(2초당 1회 측정)이며, DHT11의 본체 크기가 더 작습니다. 두 센서의 동작 전압은 3~5V이며, 측정 시 최대 전류는 2.5mA입니다.
필요한 부품
DHT11 센서
DHT22 센서
아두이노 보드
브레드보드와 점퍼 와이어
DHT11 / DHT22 작동 원리
이 센서들이 실제로 어떻게 작동하는지 살펴보겠습니다. 센서는 습도 감지 소자, NTC 온도 센서(서미스터), 그리고 센서 뒷면의 IC로 구성됩니다.
습도 측정 원리
습도 측정에는 두 개의 전극 사이에 수분을 보유하는 기판이 있는 습도 감지 소자를 사용합니다. 습도가 변하면 기판의 전도도, 즉 전극 사이의 저항이 변합니다. 이 저항 변화는 IC에서 측정 및 처리되어 마이크로컨트롤러가 읽을 수 있는 형태로 변환됩니다.
온도 측정 원리
온도 측정에는 NTC 온도 센서 또는 서미스터를 사용합니다. 서미스터는 온도 변화에 따라 저항이 변하는 가변 저항입니다. 이 센서들은 세라믹이나 폴리머 같은 반도체 재료를 소결하여 만들어지며, 작은 온도 변화에도 큰 저항 변화를 제공합니다.
"NTC"는 "Negative Temperature Coefficient(음의 온도 계수)"를 의미하며, 온도가 상승하면 저항이 감소한다는 뜻입니다.
회로도
DHTxx 센서는 VCC, GND, 데이터 핀, 그리고 사용되지 않는 NC 핀 등 4개의 핀을 가지고 있습니다. 데이터 라인을 높게 유지하고 센서와 아두이노 간의 통신을 가능하게 하기 위해 5K~10K옴의 풀업 저항이 필요합니다. 일부 버전은 내장 풀업 저항이 있는 브레이크아웃 보드 형태로 제공되며 3핀만 있습니다.
DHTxx 센서는 데이터 전송을 위한 고유한 단일 와이어 프로토콜을 사용합니다. 이 프로토콜은 정밀한 타이밍을 요구하며, 데이터시트에서 타이밍 다이어그램을 확인할 수 있습니다. 하지만 DHT 라이브러리를 사용하면 이러한 타이밍 처리를 모두 자동으로 해주므로 걱정할 필요가 없습니다.
먼저 아두이노 공식 웹사이트에서 찾을 수 있는 DHT 라이브러리를 포함하고, 센서가 연결된 핀 번호를 정의한 후 DHT 객체를 생성합니다. 설정 섹션에서는 결과를 시리얼 모니터에 출력하기 위해 시리얼 통신을 시작합니다. read22() 함수를 사용하여 센서에서 데이터를 읽고 온도와 습도 값을 t와 h 변수에 저장합니다. DHT11 센서를 사용하는 경우 read11() 함수를 사용해야 합니다. 마지막으로 시리얼 모니터에 온도와 습도 값을 출력합니다.
/* DHT11/ DHT22 센서 온도 및 습도 튜토리얼
* 제작: Dejan Nedelkovski, www.HowToMechatronics.com
*/
/*
* DHT 라이브러리는 아두이노 공식 웹사이트에서 다운로드 가능
* https://playground.arduino.cc/Main/DHTLib
*/
#include <dht.h>
#define dataPin 8 // 센서가 연결된 핀 번호 정의
dht DHT; // DHT 객체 생성
void setup() {
Serial.begin(9600);
}
void loop() {
int readData = DHT.read22(dataPin); // 센서에서 데이터 읽기
float t = DHT.temperature; // 온도 값 가져오기
float h = DHT.humidity; // 습도 값 가져오기
// 시리얼 모니터에 결과 출력
Serial.print("Temperature = ");
Serial.print(t);
Serial.print(" *C ");
Serial.print(" Humidity = ");
Serial.print(h);
Serial.println(" % ");
delay(2000); // 2초 지연 (DHT22 샘플링 속도는 0.5Hz)
}
이 코드를 아두이노 보드에 업로드하면 시리얼 모니터에서 센서의 온도와 습도 결과를 확인할 수 있습니다.
또한 결과를 LCD에 표시하는 예제도 만들었습니다. 해당 소스 코드는 다음과 같습니다:
/* DHT11/ DHT22 센서 온도 및 습도 튜토리얼
* 제작: Dejan Nedelkovski, www.HowToMechatronics.com
*/
#include <LiquidCrystal.h> // LiquidCrystal 라이브러리 포함
#include <dht.h>
#define dataPin 8
LiquidCrystal lcd(1, 2, 4, 5, 6, 7); // LCD 객체 생성. 매개변수: (rs, enable, d4, d5, d6, d7)
dht DHT;
void setup() {
lcd.begin(16,2); // LCD 인터페이스 초기화, 디스플레이 크기 지정(너비와 높이)
}
void loop() {
int readData = DHT.read22(dataPin);
float t = DHT.temperature;
float h = DHT.humidity;
lcd.setCursor(0,0); // 이후 텍스트가 표시될 위치 설정
lcd.print("Temp.: "); // "Temp." 문자열 출력
lcd.print(t); // 센서에서 온도 값 출력
lcd.print(" C");
lcd.setCursor(0,1);
lcd.print("Humi.: ");
lcd.print(h);
lcd.print(" %");
delay(2000);
}