안녕하세요.
기계과 감성쟁이입니다.
오늘은 온습도센서 모듈(DHT22)을 사용하여
이 좋은 날씨를 한번 파악해보겠습니다.
1. 온습도센서의 원리
온습도센서에는 두 가지 방식이 있습니다.
정전용량센서와 저항센서죠.
1) 정전용량센서
대학물리학 수업에서 배우 듯이
유전율은 온도, 습도, 전자기장의 주파수 등에 영향을 받는데,
특히 온,습도에 민감한 매질을 축전기 사이에 넣어서 그 변화량으로 값을 추측해내는 것입니다.
2) 전기저항센서
저항 공식 에서 는 비저항(resistivity)이라고 하며,
유전율과 마찬가지로 온도와 습도에 영향을 받습니다.
즉, 저항값의 변화로 온 · 습도를 계산합니다.
2. DHT-22 온습도 센서 모듈
제가 사용하는 DHT-22 모듈은 2번에 해당하는
전기저항센서입니다.
모듈 데이터 시트입니다.
은도 측정 범위 : -40ºC ~ 80ºC (측정단위 : 0.1ºC, 오차 : ±0.5ºC)
습도 측정 범위 : 0 ~ 100 % RH (상대습도, 측정단위 : 0.1% RH, 오차 : ±2~5% RH)
전압 : 3.3V ~ 5.5V DC
정도가 중요한 사안이 되겠네요.
* 상대습도는 특정한 온도의 대기 중에 포함되어 있는 수증기의 압력을 그 온도의 포화 수증기 압력으로 나눈 것을 말합니다.
3. DHT 라이브러리를 이용하여 사용해보기
또는 아두이노 IDE 속 라이브러리 매니저를 통해
DHT 라이브러리를 다운받아주세요.
LED는 일단 무시해주세요.
뒷부분에 써먹을거에유.
(+), DATA, (-) 차례대로 꽂아주세요.
저거 왜 중간에 살짝 빠졌대
제 모델은 데이터시트와 모양이 다릅니다.
조금 업그레이드 된 버전 같은데
한 유튜버 분의 말에 따르면,
저항이 달린 형태라고 합니다.
그래서 따로 풀업저항을 달아주지 않았어요.
#include "DHT.h"
#define DHTPIN 11 // 11번핀에 연결
#define DHTTYPE DHT22 // 센서 모델 설정
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
dht.begin();
}
void loop() {
float humi = dht.readHumidity();
float temp = dht.readTemperature();
if(isnan(humi) || isnan(temp)) {
Serial.println("Fail. Try again");
delay(2000);
return;
} // 값을 못읽을 경우
Serial.print("Temperature : ");
Serial.print(temp);
Serial.println("ºC");
Serial.print("Humidity : ");
Serial.print(humi);
Serial.println("%");
delay(2000);
}
데이터 시트에 따르면,
정보수집 주기가 2초라서 딜레이는 2초로 설정했습니다.
isnan () 함수는 is not a number의 약자로,
Input이 숫자가 아니면 True, 숫자면 False 를 반환합니다.
믈통 속에 살짝 넣으니
습도가 상승하네요.
잘 됩니다.
4. 리모컨 이용하기
#include <DHT.h>
#include <IRremote.h>
#define DHTPIN 11
#define DHTTYPE DHT22
int ir_recieve = 3; // ir센서는 3번핀
IRrecv irrecv(ir_recieve);
decode_results signals;
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
irrecv.enableIRIn();
dht.begin();
}
void loop() {
irrecv.decode(&signals);
while (signals.value == 0xFFA25D) {
float humi = dht.readHumidity();
float temp = dht.readTemperature();
if(isnan(humi) || isnan(temp)) {
Serial.println("Fail. Try again");
delay(2000);
return;
}
Serial.print("Temperature : ");
Serial.print(temp);
Serial.println("ºC");
Serial.print("Humidity : ");
Serial.print(humi);
Serial.println("%");
irrecv.decode(&signals);
irrecv.resume();
if (signals.value == 0xFF629D){
Serial.println ("stop...");
return;
}
delay(2000);
}
}
이거 하면서 스스로 너무 멍청했던건
if 안에 ==가 아니라 =를 넣었다는 겁니다...
if 안에서 저게 작동을 연산자가 작동해서,,,
계속 같은 값이 객체 속으로 입력되더군여,,, 내 시간 ㅠㅠ
LED는 그냥 안썼습니다.
LED, 온습도센서, 적외선센서 세개 연결하니 적외선센서가 죽으려고 하길래요...
다음엔 ESP 8266을 이용하여
인터넷에서 현재 시간을 가져와서
시간과 함께 온습도를 출력해보도록 하겠습니다.