프로젝트

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

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

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
profile

남민식 2015-11-11 15:32:52

블루투스를 통해 값을 스마트폰으로 전송하고있는데 값이 너무 빨리 반복되서 올라오네요 이거 멈추는 방법 없을까요? 아님 딜레이를 늦추는 방법을 생각하고있는데.. 그부분에대한 변경을 어떻게 해야할까요? ㅠㅠ

profile

김수현 2016-02-19 03:37:37

해 보고 싶은데 감전될까 조심조심 ㄷㄷ

profile

박상훈 2016-05-24 21:40:18

아두이노:1.6.9 (Windows 7), 보드:"Arduino/Genuino Uno"

스케치는 프로그램 저장 공간 8,710 바이트(27%)를 사용. 최대 32,256 바이트.
전역 변수는 동적 메모리 288바이트(14%)를 사용, 1,760바이트의 지역변수가 남음. 최대는 2,048 바이트.
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x62
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x62
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x62
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x62
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x62
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x62
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x62
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x62
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x62
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x62
보드에 업로딩중에 문제 발생. 다음을 참고하세요. http://www.arduino.cc/en/Guide/Troubleshooting#upload

이 리포트는 파일 -> 환경설정에 "컴파일중 자세한 출력보이기"를
활성화하여 더 많은 정보를
보이게 할 수 있습니다.


이렇게 뜨는데 왜 그런지 아시나요 ? ㅜㅠㅠ

profile

박경필 2016-08-02 14:28:29

LCD에 온도도 같이 표현되고 릴레이가 일정온도 밑으로 가면 ON, 위로가면 OFF되도록 하려면
어떤 부분을 고쳐야 하는걸까요?
DHT11 함수도 알고 싶은데 어딜 보면 되나요?

profile

한성웅 2017-11-13 16:25:02

저희가 부품을 다연결시켰습니다. 업로드완료했는데 컴파일에 아무것도 안뜨고 콘센트 릴레이연결했는데 전원이 안들어와요 어떤문제인가요?

profile

손예찬 2018-06-04 10:39:03

포텐셔미터 몇옴짜리인가요?? 혹시 dfr 0054 써도 되나요??..

profile

lim 2018-09-11 17:53:29

소프트웨어 스크래치 버전을 알려주실수있나요?

profile

도동쿤 2018-11-28 00:56:58

오! 안녕하세요!
코딩하고 아두이노 그림보고 온도와 습도를 lcd에 띄우는것을 성공했습니다.
저는 여기서 릴레이키트를 이용해 가습기랑 연결하는것이 아닌 가습기 모듈을 제어하는걸 하고 싶은데
어떻게 해야 할까요??ㅜㅜ

profile

tlsthdus 2022-05-19 13:51:02

ATmega128에서도 구현이 가능한가요?