프로젝트

나도 메이커! 메이커스 여러분들의 작품/프로젝트를 공유하는 공간입니다.

습도에 따라 자동으로 켜지는 가습기

2014-09-17 14:35:08

개요

더운 여름이 가고 가을이 오고 있습니다.
여자분들은 특히 날씨가 점점 추워질 수록 건조함을 많이 느끼실 겁니다.
추운 날씨 뿐만 아니라 건조한 상황은 피부에 좋지 않기 때문에 가습기를 사용하시는 분들도 많이 있으실 것입니다.

출처 :  danmee.chosun.com

이런 상황에서 현재 습도에 따라서 자동으로 가습기를 on/off 할 수 있다면 어떨까요?
언제나 적당한 습도의 환경이 유지 되겠죠?

본문에서는 습도센서를 사용해 현재 습도를 측정한후 릴레이를 통해 가습기를 on/off 해보겠습니다.
또 LCD를 연결해서 현재습도를 표시하겠습니다.





미리보기 동영상


시작 전 개념이해하기

 

부품목록


NO 부품명 수량 상세설명
1 아두이노 우노 1  
2 브레드보드 1  
3 온습도 센서 1 DHT11 온습도센서 모듈을 사용했습니다.
4 LCD 1 LCD-00709을 사용했습니다.
다른 LCD를 사용하실 경우 연결방법이 다를 수 있습니다.
5 Potentiometer 1  
6 콘센트 1 직접 가습기에 릴레이를 연결할 경우 필요하지 않습니다.
7 점퍼 케이블 20  
8 5V 릴레이 모듈 1  
9 가습기 1  

부품명 아두이노 우노 브레드보드 온습도센서 LCD Potentiometer
사진 x1 x1 x1 x1 x1

부품명 콘센트 점퍼 케이블 5V 릴레이 모듈 가습기
사진 x1 x20 X1 x1

하드웨어 Making

회로도

브레드보드 레이아웃



***주의사항 

이 프로젝트는 실제 가전 제품을 사용하므로(220V) 무조건 안전하게 하셔야 합니다.

릴레이와 콘센트를 연결하고 사용하실 때 위험할 수 있습니다.
꼭 이 링크를 참고해서 연결해주세요.

*참고사항

dht11센서를 사용할 경우
  • 습도 측정 범위 : 20 ~ 90% (5% 오차)
  • 온도 측정 범위 : 0 ~ 50도 (2도 오차)


 

소프트웨어 Coding

아래의 스케치를 아두이노에 업로드하여 사용하세요.

/* 본 스케치는 여러 커뮤니티를 참고하여 
kocoafab에서 작성하였습니다.
누구나 무료로 사용하실 수 있습니다.*/

#include <LiquidCrystal.h>
#include <DHT11.h>
#define relay 9             //relay와 연결된 9번 핀
#define dht11Pin 6          //dht11과 연결된 6번 핀

LiquidCrystal lcd(12,11,5,4,3,2);   //RS 핀, E핀, 데이터 핀 4개
String lcdString = "";

DHT11 dht11(dht11Pin);      //dht11 라이브러리 사용을 위한 객체 선언
void setup() { pinMode(relay, OUTPUT); lcd.begin(16,2); //LCD 크기 지정, 2줄 16칸 lcd.clear(); //화면 지우기

Serial.begin(9600);
}

void loop()
{
  int err;     //에러구분 변수
  float humi;  //습도 저장 변수
  float tem;   //온도 저장 변수, 필요한 분은 사용하세요.
if((err=dht11.read(humi, tem))==0) //습도값을 에러없이 읽어 왔다면 { onOff(humi); //가습기 on/off 함수 호출 lcdHumidity(humi); //현재 습도 lcd 출력 함수 호출 } else {
//읽어오는 도중 문제가 발생할 경우 에러번호와 에러 시리얼 모니터에 출력 Serial.println(); Serial.print("Error No :"); Serial.print(err); Serial.println(); } delay(DHT11_RETRY_DELAY); //다시 읽어올때 까지 멈춤 }

//가습기 on/off 함수 호출
void onOff(float h) {

if (h < 50 ) { //습도가 50%보다 작으면
digitalWrite(relay, HIGH); //가습기 ON
}else {
digitalWrite(relay,LOW);
}
}

//현재 습도 LCD 출력 함수
void lcdHumidity(float hu) {
lcd.setCursor(0,0); //커서 0,0에 배치
lcd.print("current humidity"); //""안에 글자 출력
lcd.setCursor(1,3); //커서 위치 1,3으로 변경 후
char buffer[10]; //float를 string으로 변환하기 위한 임시 char 배열 선언
dtostrf(hu, 4, 1, buffer); //float -> char로 변환
String humidity = " : "; //두번째 줄에 출력할 구문 만들기 ( : 습도 %)
humidity += (String)buffer; //char -> string
humidity += "%";
Serial.print(humidity);
lcd.print(humidity); //현재 습도 출력
}

소프트웨어 & 하드웨어 설명

1.하드웨어 설명


dht11 모듈 대신 센서만 사용하실 경우 별도의 저항연결이 필요할 수 있습니다.
본문에서는 가습기에 직접 릴레이를 연결하지 않고 별도의 콘센트에 릴레이를 연결한 수 
콘센트에 가습기 전원을 연결하였습니다.

즉, 릴레이로 인해 콘센트에 전원이 연결되면 가습기도 켜지는 원리입니다.

2.소프트웨어 설명

 #include <LiquidCrystal.h> 
#include <DHT11.h>
두 개의 라이브러리가 필요합니다.
LiquidCrystal은 원래 저장되어 있는 라이브러리입니다.
DHT11 라이브러리는 이 링크를 통해 다운로드 해주세요.

if((err=dht11.read(humi))==0)   //습도값을 에러없이 읽어 왔다면
  {
    onOff(humi);           //가습기 on/off 함수 호출
    lcdHumidity(humi);     //현재 습도 lcd 출력 함수 호출
  }


DHT11라이브러리에 있는 read함수는 습도, 온도 값을 읽어서 변수에 저장해줍니다.
동시에 에러번호를 반환합니다.
반환된 값이 0이면 정상 동작을 의미합니다.

즉, 위 코드는 습도를 정상적으로 측정하였다면(반환 값이 0이면) 아래 두 함수를 호출하라는 뜻입니다.

void onOff(float h) {

if (h < 50 ) { //습도가 50%보다 작으면
digitalWrite(relay, HIGH); //가습기 ON
}else {
digitalWrite(relay,LOW);
}
}


습도가 50보다 작으면 릴레이의 HIGH 값을 전달하므로써 콘센트에 전류가 흐르게 합니다.
50 자리에 원하는 습도 정도에 따라 숫자를 넣어보세요.

//현재 습도 LCD 출력 함수 
void lcdHumidity(float hu) {
lcd.setCursor(0,0); //커서 0,0에 배치
lcd.print("current humidity"); //""안에 글자 출력
lcd.setCursor(1,3); //커서 위치 1,3으로 변경 후
char buffer[10]; //float를 string으로 변환하기 위한 임시 char 배열 선언
dtostrf(hu, 4, 1, buffer); //float -> char로 변환
String humidity = " : "; //두번째 줄에 출력할 구문 만들기 ( : 습도 %)
humidity += (String)buffer; //char -> string
humidity += "%";
Serial.print(humidity);
lcd.print(humidity); //현재 습도 출력
}


스케치를 작성하시다 보면 변수의 타입을 변경해야 하는 경우가 많이 발생합니다.
lcd.print함수는 float을 출력할 수 없습니다.
하지만 습도는 float타입입니다.
이럴 경우 float을 dtostrf함수를 통해 char로 변경하고 
변경된 char를 string으로 변경합니다.

dtostrf함수 () 안에는 변경할 float타입의 값, 최소한의 길이, 정확도, 변경된 값을 저장할 char 배열 변수가 들어갑니다.
정확도는 소수점 자리를 의미합니다. 1은 소수점 첫번째 자리까지만 변환된다는 의미입니다.

lcd에 출력할 문구를 변경하거나 다른 lcd를 사용해보세요.
dht11센서는 온도 측정도 가능합니다. 온도도 값도 이용해보세요.

 

kocoafab

가습기, 릴레이 모듈, 습도센서, dht11, lcd 출력, float to string