아두이노 코딩 : DHT11 온도 습도 데이터 I2C Character LCD에 출력하기
이번 포스트에서는 MsTimer2 라이브러리 타이머 인터럽트를 사용하여 일정 시간 간격으로 DHT11로 온도 습도 데이터를 취득 후 I2C CLCD 로 출력하는 예제입니다. 각 개별 기초적인 부분은 하단의 관련 포스트를 참고해주세요.Hardware준비물본 예제의 구성품은 아래와 같습니다.Arduino Uno x 1EADHT11 Module x 1EAI2C CLCD 16x2 x 1EAResistor x 1EA (DHT11 Data I/O Pull-up 1kΩ)Bread BoardJumperWIres회로도 및 연결 아두이노 우노와 16x2 I2C CLCD, DHT11 연결 회로는 아래와 같습니다. I2C CLCD 의 SDA, SCL은 Arduino Uno 의 A4, A5에 반드시 연결되어야 합니다. DHT11 의 DATA 핀은 D4 번이 아닌 다른 핀에 연결해도 사용이 가능합니다. Arduino Uno DHT11 CLCD 연결 회로도 (adsbygoogle = window.adsbygoogle || []).push({}); 예제 : DHT11 온도 습도 데이터 CLCD 출력2초 간격으로 DHT11로부터 온도, 습도, 열지수 데이터를 받아 I2C Character LCD에 출력하는 예제입니다. CLCD에 출력되는 메세지는 2초 간격으로 섭씨 온도 와 화씨 온도, 습도 와 열지수를 번갈아가면서 표시합니다.코드12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697#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;}Colored by Color Scriptercs (adsbygoogle = window.adsbygoogle || []).push({}); 코드 설명위 코드 설명은 아래와 같습니다. 추가 궁금하신 점이 있으시면 댓글 작성 부탁드립니다. 📌 선언부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 관련글 목록 보기 👉 아두이노 관련글 전체 목록 보기 (adsbygoogle = window.adsbygoogle || []).push({});
Lucy Archive
Lucy / Facilitate4U
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 관련글 목록 보기

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