가습기를 만들어 보자

by 하민정 | 2017-01-10 14:37
iot 가습기 쉽고간편하게 스마트홈 아두이노 안전한집 촉촉한집

재료

  • 아두이노 우노 1개
  • 10K 옴 저항 1개
  • 릴레이 1개
  • 점퍼 와이어 1개
  • DHT 11 온도&습도 센서 1개


겨울철 '건조함을 극복' 하기 위해 가습기는 우리에게 필수 입니다. 

하지만, 가습기의 위생 문제로 선뜻 사용하기 어려워 집니다. 


아두이노를 이용해 '우리가 원하는 일정 습도 이하에서만' 작동하도록 만들어, 

우리의 요구에 맞는 가습기를 만들어 봅시다. 


Step 1. 준비물 


- 아두이노 우노 

- 릴레이 

- DHT 11 온도 & 습도 센서 

- 10k 옴 저항 

- 점퍼 와이어 


Step 2. 하드웨어 연결방법 



1) 릴레이의 왼쪽 핀은 아두이노의 디지털 8번핀에, 

     가운데 핀은 브래드 보드의 + 버스에, 

     오른쪽 핀은 - 버스에 연결합니다. 


2) DHT 11 센서의 왼쪽핀은 아두이노의 A0 핀에, 

     가운데 핀은 브래드 보드의 + 버스에, 

     오른쪽 핀은 브래드 보드의 - 버스에 연결합니다. 


3) 분압계를 브래드 보드의 + 버스, - 버스에 연결하고, 위의 그림과 같이 LCD 와 연결합니다. 


4) LCD를 브래드 보드에 연결하여, 아두이노의 출력을 LCD 로 연결할 수 있도록 합니다. 


※ 이번 프로젝트는 220V 의 실제 가전 제품을 사용하므로, 안전에 주의하여 사용해야 합니다. 


Step 3. 코드 


1
2
3
4
5
6
7
8
9
#include <LiquidCrystal.h> 
#include <DHT11.h> 
 
if( ( err= dht11.read(humi)) ==0 ) 
    onOff(humi); 
    lcdHumidity(humi); 
 
cs


< LiquidCrystal.h > 와 < DHT11.h >라는 두개의 라이브러리가 필요합니다. 

DHT11 라이브러리에 있는 read 함수는 습도, 온도 값을 읽어서 변수에 저장해 줍니다. 

동시에 에러 번호를 if 문을 통해서 반환합니다. 

반환된 값이 0일 경우 정상 동작을 의미합니다. 

정상 동작의 경우 onOff 와 lcdHumidity 라는 두 함수를 호출하게 됩니다. 


1
2
3
4
5
6
7
8
9
//가습기 on/off 함수 호출
void onOff(float h) {
 if (h < 50 ) { //습도가 50%보다 작으면 
   digitalWrite(relay, HIGH); //가습기 ON 
 }else { 
   digitalWrite(relay,LOW); 
 }
 
cs


반환된 습도가 50도 보다 작은 경우 릴레이에 HIGH 값을 전달하여, 

콘센트에 전류가 흐르게 합니다. 

특정 습도 이하인 경우에 릴레이를 동작시키기 위하여, 

50 이외에도 사용자가 원하는 습도로 설정할 수 있습니다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
//현재 습도 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); //현재 습도 출력
}
cs


LCD 에 출력해야 하는 습도는 float 타입이지만, 

< lcd.pint > 를 이용하면 float 타입을 출력할 수 없는 문제점이 있습니다. 

따라서 이때 아두이노의 < dtosrtf > 라는 함수를 이용합니다. 

이를 통해 float 를 char 로 변경하고, 

변경된 char 를 string 으로 변경합니다. 


다음은 전체 코드입니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#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); //현재 습도 출력
}
cs


Step 4. 수행 결과 




센서를 통해 입력된 값으로, 현재 습도가 39.0 % 임을 출력하고 있습니다.  

우리가 설정한 습도인 50.0 % 보다 낮으므로, 

가습기는 작동하게 됩니다. 



댓글 5

MADE BY