재료

  • 점퍼 와이어 1개
  • DHT 11 (온습도 센서) 1개
  • 10K 옴 저항 1개
  • LCD 1개
  • 브래드 보드 1개
  • 아두이노 우노 1개
  • 가변저항 1개

                                            

겨울철 불청객 두 가지는 바로 '건조함' 그리고 '추위' 입니다.

두개의 불청객으로 부터 벗어나기 위해서는 

주기적으로 온도와 습도를 체크해 주는 것이 중요합니다. 


아두이노와 센서만으로 보다 쉽고 정확하게 온습도계를 만드는 프로젝트 

Hackster에서 접하게 되어 소개합니다. 


이 프로젝트에서는 DHT 11 센서를 사용합니다. 

DHT 11에는 온도센서와 습도센서가 있는데,

먼저, 서미스터(Thermistor: thermally sensitive resistor) 라 하는 온도센서를 사용합니다. 

이는 반도체의 저항이 온도에 따라 변하는 특성을 이용합니다. 

습도센서 역시 저항이 습도에 따라 변하는 특성을 이용하여, 정전용량 습도 센서를 사용합니다. 


이를 통해 DHT11 센서로 측정가능한 온도와 습도 범위 및 오차는 다음과 같습니다. 

온도0-50 ℃ 오차

± 2  

습도20-90 % RH오차± 5 % RH

생각보다 크지 않은 오차 내에서 온도와 습도를 측정할 수 있음을 알 수 있습니다. 

( RH : Relative Humidity 상대습도로 대기 중에 포함되어 있는 수증기량과 

측정 당시의 온도에서 포함할 수 있는 최대 수증기량의 비를 백분율로 표시한 것입니다. )


Step 1. 준비물 


- 아두이노 우노 

- 온습도 센서 

- LCD 

- 가변저항

- 10k 옴 저항

- 브래드 보드 

- 점퍼 와이어


Step 2. 하드웨어 연결방법 


⓵ 아두이노와 브래드 보드를 연결합니다. (5V 핀을 + 버스에, GND 핀을 - 버스에 연결합니다. ) 


⓶ DHT 11 센서의 2번째 핀에 10k 옴 저항을 연결합니다. 


⓷ LCD 의 16번핀, 5번핀, 1번핀을 -버스에, 

     LCD 의 15번핀, 2번핀을 + 버스에 연결합니다. 


⓸ LCD 와 아두이노를 연결합니다.

     LCD의 11번핀 - 13번핀 까지를 아두이노의 10번핀 - 12번핀 까지 연결합니다. 

     LCD의 4번과 6번핀을 아두이노의 3번,4번핀에 연결합니다. 


⓹ 가변저항의 상당 단자를 + 버스에 연결합니다. 

     가운데 단자를 LCD 의 3번핀에 연결합니다. 

     하단 단자를 - 버스에 연결합니다. 


⓺ DHT 11 센서의 1번 전원핀을 + 버스에 연결합니다. 

     10K 옴 저항이 연결된 DHT 11 센서의 2번 데이터핀을 아두이노의 6번핀에 연결합니다. 

     DHT 11 센서의 4번 GND 핀을 -버스에 연결합니다. 


Step 3. 코드 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// LCD를 쉽게 제어하기 위한 라이브러리를 추가합니다.
#include <LiquidCrystal.h>
// DHT11 센서를 쉽게 제어하기 위한 라이브러리를 추가합니다.
#include <DHT11.h>
 
// LCD 객체를 생성하고 보드의 3, 4, 10, 11, 12, 13번핀을 사용하도록 설정합니다.
LiquidCrystal lcd(3,4,10,11,12,13);
 
// DHT11객체를 생성하고 보드의 6번핀을 데이터 통신으로 사용하도록 설정합니다.
DHT11 dht11(6);
 
// 실행시 가장 먼저 호출되는 함수이며, 최초 1회만 실행됩니다.
// 변수를 선언하거나 초기화를 위한 코드를 포함합니다.
void setup() {
    // 조도센서의 동작 상태를 확인하기 위하여 시리얼 통신을 설정합니다. (전송속도 9600bps)
    // 메뉴 Tool -> Serial Monitor 클릭
    Serial.begin(9600);
    // 16개의 셀과 2줄을 사용하도록 설정합니다.
    lcd.begin(16,2);
    // LCD를 초기화 합니다.
    lcd.clear();
}
 
cs


 LCD 를 쉽게 제어하기 위해서 < LiquidCrystal.h> 라이브러리를 참조하고, 

DHT 11 센서를 쉽게 제어하기 위해서 < DHT11.h> 라이브러리를 참조합니다. 


LCD 객체인 lcd 를 생성하고, 아두이노의 3, 4, 10, 11, 12, 13번핀을 사용하도록 설정합니다. 

DHT 11 객체인 dht11 를 생성하고, 아두이노의 6번핀을 데이터 통신으로 사용하도록 설정합니다. 


 setup 에서 시리얼 통신을 설정하고, lcd 에서 16개의 셀과 2줄을 사용하도록 설정합니다. 


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
void loop() {
    int err;
    float humi;
    float tem;
 
    // dht11.read() 함수는 DHT11 센서로부터 측정된 값을 읽으며,
    // 성공시에는 0을 반환하고, 실패시 에러코드를 반환합니다.
    if ((err = dht11.read(humi, tem)) == 0) {
 
        // float 데이터 타입의 습도 값을 문자 배열로 변환하고 소숫점 2자리만 유지하도록 합니다.
        char humiCharValue[10];
        dtostrf(humi, 4, 2, humiCharValue);
 
        // 습도 정보를 표시하기 위한 문자열을 생성합니다.
        String humiDisplayStr = "Humidity: ";
        humiDisplayStr += (String)humiCharValue;
        humiDisplayStr += " %";
 
        // 1번째 줄 0번째 셀부터 입력하게 합니다.
        lcd.setCursor(0,1);
        // 현재 습도를 LCD에 출력합니다.
        lcd.print(humiDisplayStr);
 
        // float 데이터 타입의 온도 값을 문자 배열로 변환하고 소숫점 2자리만 유지하도록 합니다.
        char temCharValue[10];
        dtostrf(tem, 4, 2, temCharValue);
 
        // 온도 정보를 표시하기 위한 문자열을 생성합니다.
        String temDisplayStr = "Temp  : ";
        temDisplayStr += (String)temCharValue;
        temDisplayStr += "'C";
 
        // 0번째 줄 0번째 셀부터 입력하게 합니다.
        lcd.setCursor(0,0);
        // 현재 온도를 LCD에 출력합니다.
        lcd.print(temDisplayStr);
    }
 
    // 에러 발생시 에러번호와 에러를 시리얼 모니터에 출력합니다.
    else {
        Serial.println();
        Serial.print("Error No :");
        Serial.print(err);
        Serial.println();
    }
    // DHT11_RETRY_DELAY는 DHT11.h에 정의되어있으며, 1초(1000)입니다.
    // 따라서 1초동안 대기합니다.
    delay(DHT11_RETRY_DELAY);
}
 
cs


 loop 에서 humiCharValue 를 통해 데이터 타입의 습도 값을 문자 배열로 변환하고, 

소숫점 2자리만 유지하도록 합니다. 

float 형을 문자열로 변환하기 위해서 아두이노에서 제공하는 'dtostrf '함수를 이용하였습니다. 


습도정보를 표시하기 위한 문자열을 생성한 뒤, 

lcd 의 1번째 줄 0번째 셀부터 입력하게 합니다. 

LiquidCrystal.h 에서 제공하는 print( ) 함수를 통해 현재 습도를 LCD 에 출력합니다. 


 온도 값을 temCharValue 라는 문자 배열로 변환하고

소숫점 2자리만 유지하도록 합니다. 

dtostrf 함수를 이용하여 float 배열을 문자열로 변환하여 줍니다. 


온도 정보를 표시하기 위한 문자열을 생성한 뒤, 

lcd 의 1번째 줄 0번째 셀부터 입력하게 합니다. 

마찬가지로 print( ) 함수를 통해 현재 온도를 LCD 에 출력합니다. 


▶ 측정에서 오류 발생시, 에러번호와 에러를 시리얼 모니터에 출력합니다. 


 다음은 전체 코드입니다. 

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
66
67
68
69
70
71
72
73
74
75
// LCD를 쉽게 제어하기 위한 라이브러리를 추가합니다.
#include <LiquidCrystal.h>
// DHT11 센서를 쉽게 제어하기 위한 라이브러리를 추가합니다.
#include <DHT11.h>
 
// LCD 객체를 생성하고 보드의 3, 4, 10, 11, 12, 13번핀을 사용하도록 설정합니다.
LiquidCrystal lcd(3,4,10,11,12,13);
 
// DHT11객체를 생성하고 보드의 6번핀을 데이터 통신으로 사용하도록 설정합니다.
DHT11 dht11(6);
 
// 실행시 가장 먼저 호출되는 함수이며, 최초 1회만 실행됩니다.
// 변수를 선언하거나 초기화를 위한 코드를 포함합니다.
void setup() {
    // 조도센서의 동작 상태를 확인하기 위하여 시리얼 통신을 설정합니다. (전송속도 9600bps)
    // 메뉴 Tool -> Serial Monitor 클릭
    Serial.begin(9600);
    // 16개의 셀과 2줄을 사용하도록 설정합니다.
    lcd.begin(16,2);
    // LCD를 초기화 합니다.
    lcd.clear();
}
 
// setup() 함수가 호출된 이후, loop() 함수가 호출되며,
// 블록 안의 코드를 무한히 반복 실행됩니다.
void loop() {
    int err;
    float humi;
    float tem;
 
    // dht11.read() 함수는 DHT11 센서로부터 측정된 값을 읽으며,
    // 성공시에는 0을 반환하고, 실패시 에러코드를 반환합니다.
    if ((err = dht11.read(humi, tem)) == 0) {
 
        // float 데이터 타입의 습도 값을 문자 배열로 변환하고 소숫점 2자리만 유지하도록 합니다.
        char humiCharValue[10];
        dtostrf(humi, 4, 2, humiCharValue);
 
        // 습도 정보를 표시하기 위한 문자열을 생성합니다.
        String humiDisplayStr = "Humidity: ";
        humiDisplayStr += (String)humiCharValue;
        humiDisplayStr += " %";
 
        // 1번째 줄 0번째 셀부터 입력하게 합니다.
        lcd.setCursor(0,1);
        // 현재 습도를 LCD에 출력합니다.
        lcd.print(humiDisplayStr);
 
        // float 데이터 타입의 온도 값을 문자 배열로 변환하고 소숫점 2자리만 유지하도록 합니다.
        char temCharValue[10];
        dtostrf(tem, 4, 2, temCharValue);
 
        // 온도 정보를 표시하기 위한 문자열을 생성합니다.
        String temDisplayStr = "Temp  : ";
        temDisplayStr += (String)temCharValue;
        temDisplayStr += "'C";
 
        // 0번째 줄 0번째 셀부터 입력하게 합니다.
        lcd.setCursor(0,0);
        // 현재 온도를 LCD에 출력합니다.
        lcd.print(temDisplayStr);
    }
 
    // 에러 발생시 에러번호와 에러를 시리얼 모니터에 출력합니다.
    else {
        Serial.println();
        Serial.print("Error No :");
        Serial.print(err);
        Serial.println();
    }
    // DHT11_RETRY_DELAY는 DHT11.h에 정의되어있으며, 1초(1000)입니다.
    // 따라서 1초동안 대기합니다.
    delay(DHT11_RETRY_DELAY);
}
 
cs


Step 4. 수행 결과 



※ 위에서 제시한 하드웨어 연결방법과 같은 방식으로 구성하였지만, 

여기서 추가적으로 하나의 브래드 보드를 연결해 DHT 11 센서를 연결해 주었습니다. 



댓글 2

MADE BY