온습도센서의 개요
우리가 기온을 측정할때 크게 온도만 측정할수있는 LM35센서와 온,습도 모두 측정할 수 있는 DHT11센서 2가지로 분류되는데 주로 많이 사용되는 센서는 DHT11 온습도 센서다.
온습도센서를 잘 살펴보면 겉에 구멍이 뚤린것을 확인할 수 있는데, 공기중의 수분을 잘 흡수하도록 설계가 되었다고 한다. 센서내부에는 미세한 전극이 있어서 공기중의 수분을 감지할때 미세하게 전류가 흘러서 변화된 저항값을 우리가 시리얼 모니터를 통해서 읽어들일 수 있게된다. 습도값의 오차가 ±5%, 온도값의 오차가±2%정도로 오차범위가 크게 차이가 없을 정도로 센서의 정확도 또한 뛰어나다.
이제 온습도 센서를 통해서 출력값이 어떻게 나타나는지 알아보도록 하자.
알아보기 앞서서 우선 온습도센서와 관련된 라이브러리를 다운받아주어야한다. 라이브러리 추가하는 방식은 아래 자세하게 설명해두었다.
온습도센서 라이브러리 다운받는 첫번째 방법 "DHT sensor library"이용
첫번째 방법은 라이브러리 관리로 들어가서 DHT11을 입력하고 스크롤을 조금 내리다보면 DHT sensor library라는 라이브러리가 보일것이다. 가장 보편적으로 쓰이는 라이브러리이므로 설치를 진행해주도록 한다.
온습도센서 라이브러리 다운받는 두번째 방법 "SimpleDHT" 이용
두번째 방법은 검색창에다가 simpleDHT를 검색하면 바로뜨는 라이브러리가 있다. 이 라이브러리 또한 많이 쓰이므로 다운받아서 유용하게 쓰도록하자.
예제실습 - 온습도센서 작동 확인
기본적인 온습도센서가 잘 작동하는지 확인하기 위해서 온습도센서와 관련된 예제를 실행시키도록 한다. 우선 첫번째 라이브러리인 DHT sensor library 를 추가하고 나서 예제 DHTtester를 실행시키면 아래와 비슷한 코드가 나타나게 된다.(필요없는 주석은 제거했다.)
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
Serial.println(F("DHTxx test!"));
dht.begin();
}
void loop() {
delay(2000);
float h = dht.readHumidity();
float t = dht.readTemperature();
float f = dht.readTemperature(true);
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
float hif = dht.computeHeatIndex(f, h);
float hic = dht.computeHeatIndex(t, h, false);
Serial.print(F("Humidity: "));
Serial.print(h);
Serial.print(F("% Temperature: "));
Serial.print(t);
Serial.print(F("°C "));
Serial.print(f);
Serial.print(F("°F Heat index: "));
Serial.print(hic);
Serial.print(F("°C "));
Serial.print(hif);
Serial.println(F("°F"));
}
예제를 실행시키고나면 주석이 너무 많아서 코드가 당황스러울수도 있는데, 깔끔하게 지워주면 위와같이 필요한 코드만 남게된다. 여기서 우리는 실수형타입으로 변수를 선언해주고, 시리얼모니터로 불러들일 준비를 하면된다.
온습도 센서는 기본적으로 총 4개의 핀으로 구성되어있는데, 모듈형 타입은 3개의 핀으로 구성되어있다.
회로구성은 간단하다. 오른쪽 사진과 알맞게 첫번째핀은 5V에, 두번째핀은 디지털2번핀에, 4번째핀은 GND에 연결시켜주면 된다. 3번째핀은 자주 쓰이지않으므로 그대로 남겨두도록 한다.
우리가 값을 읽어들일때 핵심이 2번핀인데 여기서 온습도센서 내부에있는 전류와 저항의 변화에 따라 2번핀을 통해서 우리가 신호를 받게된다. 흔히 다른센서에 사용되는 디지털 통신방식과는 달리 온습도센서는 자체적인 통신방식을 가지고있기때문에 디지털값을 특정변수로 변환시켜서 라이브러리를 통해 처리 할 필요가있다.
컴파일을 진행시키게되면 위 화면과같이 시리얼 모니터에 온도, 습도값이 출력이 되는것을 확인할 수 있다.
왼쪽은 첫번째 라이브러리 예제를 통해서, 오른쪽은 두번째 라이브러리 예제를 통해서 컴파일을 진행해보았다.
결과적으로 둘다 온도, 습도 모두 문제없이 결과값이 나오는것을 확인할 수 있다.
첫번째 예제는 화씨온도까지 같이 나오기때문에 복잡해보일 수있는데, 두번째 예제는 온도값이 섭씨로만 되어있어서 훨씬 간단하다는 장점이 있다. 각자 맞는 예제를 선택하도록 한다.
온습도센서는 매번 시리얼모니터로 확인하기 버거우므로 온습도센서로부터의 출력값을 LCD나 OLED 나타내게 하는게 훨씬 용이하게 쓰일수 있다. 주로 온습도센서를 이용해서 센서값이 나타날 수있는 LCD를 통해서 전자시계를 만드는 사례도있다.
예제실습 - LCD응용
온습도센서를 좀 더 친숙하게 다가가기위해 아래 예제는 LCD를통해서 응용을 해보도록 해보자.
이번 회로에는 LCD 16x2타입을 추가해보았다. 온습도센서의 회로구성은 위의 처음 보여주었던 회로구성과 동일하고, LCD회로를 추가하면된다. LCD의 VCC는 Vin에 연결, SDA는 아날로그 4번에, SCL은 5번에 연결하도록 한다. 우리가 LCD를 동작시키기 위해서 온습도센서와 마찬가지로 라이브러리를 설치해 주어야한다.
LiquidCrystal이라는 라이브러리인데, 아래 LCD에 관한 자세한 설명은 링크로 남겨두었다.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SimpleDHT.h>
LiquidCrystal_I2C lcd(0x27,16,2);
// for DHT11,
// VCC: 5V or 3V
// GND: GND
// DATA: 2
int pinDHT11 = 2;
SimpleDHT11 dht11;
void setup()
{
Serial.begin(9600);
}
void loop()
{
lcd.init();
byte temperature = 0;
byte humidity = 0;
int err = SimpleDHTErrSuccess;
if ((err = dht11.read(pinDHT11, &temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
Serial.print("Read DHT11 failed, err=");
lcd.setCursor(0,0);
lcd.print(err);
delay(1000);
return;
}
int tem = (int)temperature;
int hum = (int)humidity;
int index = 1.8*tem - 0.55*(1-hum / 100)*(1.8*tem - 26) + 32;
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("TEM : ");
lcd.print((int)temperature);
lcd.print("`C, ");
lcd.print((int)humidity);
lcd.print("H");
lcd.setCursor(0,1);
lcd.print("DI : ");
lcd.print(index);
}
위 코드는 두번째 라이브러리인 SimpleDHT안에있는 DHT11Defaultd 예제를 통해서 코딩을 진행하였다. 두번째 예제는 앞서 말했듯이 코드가 간결하다는 장점이 있다. 그래서 이번에는 불쾌지수를 추가하였다.
불쾌지수 공식은 위와같다. (불쾌지수 구하는 공식은 네이버나 구글에 검색해보면 상세하게 나와있다.)
온습도 센서는 온습도 값 뿐만아니라 불쾌지수를 온도와 습도만 가지고 측정이 가능하다. 값을 구하는 방식은 정수형타입으로 온도변수를 tem으로 설정을 하고 , 습도를 hum으로 설정을 한뒤에 불쾌지수 공식에 대입하기만 하면된다.
불쾌지수 결과값은 온습도와 마찬가지로 정수형타입 변수 index로 선언하고 LCD로 불러들이기만 하면된다.
컴파일을 모두 진행시키면 LCD를 통해서 온도와 습도값, 그리고 불쾌지수값을 표현할 수 있게된다.
여름철 무더운 날씨에 불쾌지수를 측정하고 싶을때마다 한번씩 LCD를 꺼내어서 각자 가정집에서 써보도록 해보자.
'Programming > Arduino' 카테고리의 다른 글
[Arduino] 아두이노 DS1302 RTC 모듈 활용하기 (6) | 2020.07.26 |
---|---|
[Arduino] 아두이노 온도센서(LM35) 쉽게 사용하기 (2) | 2020.07.23 |
[Arduino] 아두이노 초음파 센서(HC-SR04) 3가지 예제를 통해 거리를 감지해보자 (1) | 2020.07.19 |
[Arduino] 아두이노 LCD 16x2 다양한 예제 응용하기 (8) | 2020.07.17 |
[Arduino] 아두이노 조이스틱을 이용해서 쉽게 LED를 다루어 보자 (0) | 2020.07.10 |