아두이노 코딩 : DHT11 온도 습도 데이터 I2C Character LCD에 출력하기
Lucy Archive
Lucy 2023
2020. 9. 25. 00:56

Arduino Uno : I2C CLCD, DHT11Arduino Uno : I2C CLCD, DHT11

Arduino Uno : I2C CLCD, DHT11

이번 포스트에서는 MsTimer2 라이브러리 타이머 인터럽트를 사용하여 일정 시간 간격으로 DHT11로 온도 습도 데이터를 취득 후 I2C CLCD 로 출력하는 예제입니다. 각 개별 기초적인 부분은 하단의 관련 포스트를 참고해주세요.


Hardware

준비물

본 예제의 구성품은 아래와 같습니다.

  • Arduino Uno x 1EA
  • DHT11 Module x 1EA
  • I2C CLCD 16x2 x 1EA
  • Resistor x 1EA (DHT11 Data I/O Pull-up 1kΩ)
  • Bread Board
  • JumperWIres


회로도 및 연결 

아두이노 우노와 16x2 I2C CLCD, DHT11 연결 회로는 아래와 같습니다. I2C CLCD 의 SDA, SCL은 Arduino Uno 의 A4, A5에 반드시 연결되어야 합니다. DHT11 의 DATA 핀은 D4 번이 아닌 다른 핀에 연결해도 사용이 가능합니다.

Arduino Uno DHT11 CLCDArduino Uno DHT11 CLCD 연결 회로도

예제 : DHT11 온도 습도 데이터 CLCD 출력

2초 간격으로 DHT11로부터 온도, 습도, 열지수 데이터를 받아 I2C Character LCD에 출력하는 예제입니다. CLCD에 출력되는 메세지는 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
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include <LiquidCrystal_I2C.h>
#include <MsTimer2.h>
#include <DHT.h>
 
// HC-SR04 핀 정의 
#define DATAPIN 4 //DHT11 Datapin Number
// I2C CLCD address 및 사양 정보 정의
#define lcdAddress 0x27
#define lcdColumns 16
#define lcdRows 2
 
LiquidCrystal_I2C lcd(lcdAddress, lcdColumns, lcdRows);
DHT myDHT11(DATAPIN, DHT11);
 
float fTempC;
float fTempF;
float fHumid;
float fHeatIndex;
 
// 데이터 취득 flag 선언, 거리 데이터 취득시 1로 활성화
int flag = 0
 
void setup() {
 
    MsTimer2::stop();
    MsTimer2::set(2000, myTimer);
    MsTimer2::start();
 
    myDHT11.begin();
 
    lcd.init();
    lcd.backlight();
    lcd.clear();
}
 
void loop() {
    
    // 신규 데이터 취득시에만 동작
    if(flag == 1)
    {
        flag = 0;
        // HC-SR04 거리 측정
        readTempHumid();
        // 측정한 거리 CLCD 출력
        printCLCD();
    }   
}
 
void myTimer()
{
    flag = 1;
}
 
void readTempHumid(){
    fTempC = myDHT11.readTemperature(false);
    fTempF = myDHT11.readTemperature(true);
    fHumid = myDHT11.readHumidity(false);
    fHeatIndex = myDHT11.computeHeatIndex(fTempC,fHumid,false);
}
 
void printCLCD(){
 
    static boolean toogle;
 
    String firstRow;
    String secondRow;
    int firstRowBlank;
    int secondRowBlank;
 
    // CLCD 에 출력할 데이터를 문자열로 변경
    if(toogle==false){
        firstRow = "Temp C : " + String(fTempC, 2);
        secondRow = "Temp F : " + String(fTempF, 2);
    }
    else{
        firstRow = "Humid : " + String(fHumid, 2);
        secondRow = "H-Index : " + String(fHeatIndex, 2);
    }
    
    // 문자열의 공백 저장
    firstRowBlank = lcdColumns - firstRow.length();
    secondRowBlank = lcdColumns - secondRow.length();
 
    //CLCD 첫번째 줄
    lcd.setCursor(0,0);
    lcd.print(firstRow);
    for(int i = 0 ; i < firstRowBlank ; i++){
        lcd.print(" ");
    }
    //CLCD 2번째 줄
    lcd.setCursor(0,1);
    lcd.print(secondRow); 
    for(int i = 0 ; i < secondRowBlank ; i++){
        lcd.print(" ");
    }
    toogle = !toogle;
}
cs

코드 설명

위 코드 설명은 아래와 같습니다. 추가 궁금하신 점이 있으시면 댓글 작성 부탁드립니다. 

📌 선언부

  • 1~3 Line : 라이브러리 참조 - 타이머인터럽트, I2C CLCD, DHT11 사용
  • 6 Line : DHT11 데이터 핀 매트로 설정
  • 9 ~ 11 Lline : CLCD의 I2C Address 및 크기 정보 매크로 설정
  • 13 Line : LiquidCrystal_I2C 객체 생성
  • 14 Line : DHT 객체 생성
  • 17 ~ 20 Line : DHT11에서 취득한 데이터 저장 하는 전역 변수
  • 23 Line : 타이머 인터럽트 서비스 루틴 함수가 호출되면 1로 활성화 되는 플래그

📌 Setup() 함수

  • 27~29 Line : 타이머 인터럽트 설정, 2000ms 마다 myTimer() 함수를 호출
  • 31 Line : DHT11 사용 활성화
  • 33~35 Line : CLCD 초기화

📌 Loop() 함수

  • if문 조건의 flag 는 2초마다 '1'로 변하는 값으로, 2초마다 loop() 함수 내의 If() 문이 호출

📌 myTimer()

  • MsTimer2 의 초기화 설정대로 2초마다 호출되는 함수로, 2초마다 flag에 1의 값을 대입

📌 readTempHumid()

DHT11로부터 온도, 습도, 열지수 데이터를 취득

📌 printCLCD()

  • 2초마다 Boolean Type 변수 toogle 을 반전하면서, CLCD 에 출력할 데이터를 선택
  • 83 ~ 84 Line : 출력할 문자 외 공백을 계산
  • 87 ~ 97 Line : 출력할 문자 + 공백 총 16 문자를 순차적으로 출력
  • 이와 같은 방법은 lcd.clear() 함수를 쓰지 않고 출력하기 위해서 사용되었습니다. lcd.clear() 함수를 사용하는 경우 LCD 깜빡임이 발생합니다.


예제 실행 결과

위의 코드를 실행하면 아래와 같은 동작을 확인 할 수 있습니다.


마무리

이번 포스트에서는 지난 포스트에서 소개한 DHT11와 I2C CLCD, MsTimer2 를 사용한 타이머 인터럽트를 사용하여 온도, 습도, 열지수를 CLCD에 출력하는 예제를 소개하였습니다. 이와 관련된 기초 내용은 아래의 관련 포스트를 참고해주세요.

끝까지 읽어 주셔서 감사합니다.😄

관련포스트

👉 아두이노 온도센서 관련글 목록 보기

👉 아두이노 센서 관련글 목록 보기

👉 아두이노 타이머 관련글 목록 보기

👉 아두이노 CLCD 관련글 목록 보기

👉 아두이노 관련글 전체 목록 보기