아두이노 코딩 : DHT11 온도 습도 데이터 I2C Character LCD에 출력하기
Lucy / Facilitate4U
2020. 9. 25. 00:56
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 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에 출력하는 예제를 소개하였습니다. 이와 관련된 기초 내용은 아래의 관련 포스트를 참고해주세요.
끝까지 읽어 주셔서 감사합니다.😄
'Embedded > Arduino' 카테고리의 다른 글
아두이노 강좌 #42 SD Card 카드 인식, 파일 쓰기, 파일 읽기 (1) | 2020.09.27 |
---|---|
아두이노 강좌 #41 SD-Card 주의 사항 및 Cardinfo 예제 사용 방법 (0) | 2020.09.26 |
아두이노 강좌 #40 온습도 센서 DHT11 Adafruit 라이브러리 사용 방법 (6) | 2020.09.24 |
아두이노 강좌 #39 DHT11 사용 방법 및 라이브러리 없이 온도 습도 측정 (0) | 2020.09.22 |
아두이노 코딩 : HC-SR04 로 측정한 거리를 I2C CLCD 에 출력 (0) | 2020.09.21 |