Arduino UNO와 DHT22 온습도 센서, 16x2 I2C LCD로 환경 모니터링하기
부품 및 소모품
Arduino UNO
1개
DHT22 온도 센서
1개
I2C 백팩이 장착된 16x2 LCD 모듈 (White on Blue, 5V)
1개
브레드보드 (풀 사이즈)
1개
9V 배터리
1개
9V 배터리 클립 (5.5mm/2.1mm 플러그)
1개
USB-A to Mini-USB 케이블
1개
수-암 점퍼 와이어
1세트
수-수 점퍼 와이어
1세트
프로젝트 소개
2년 동안 7살 아들이 애완 뱀을 키우고 싶어 했습니다. 마침내 테라리움과 함께 뱀 두 마리를 구입했습니다. 뱀에게 편안한 환경을 제공하려면 온도와 습도를 모니터링해야 합니다.
아날로그 온습도계를 샀지만, 둘 다 적정 수준으로 유지하기가 쉽지 않았습니다. 새로 산 Arduino Uno로 프로젝트를 시작하고 싶어 하던 차에, 온습도 센서로 테라리움의 온도와 습도 자동화를 해보기로 했습니다. 그래서 DHT22 온습도 센서와 I2C 방식의 16x2 LCD 디스플레이를 구매했습니다.
이 튜토리얼은 이 프로젝트의 기초입니다. 여기에는 자동화 기능이 전혀 없습니다. 단지 DHT22와 I2C LCD 디스플레이의 사용법만 다룹니다.
다른 튜토리얼도 보았지만 I2C 없는 LCD를 사용하더군요. I2C가 없는 LCD를 사용 중이라면 ThothLoki의 튜토리얼을 참고하세요.
필요한 하드웨어
모든 5V 아두이노 (본 튜토리얼에서는 Arduino Uno R3)
DHT22 온습도 센서
I2C가 장착된 16x2 LCD 디스플레이
브레드보드
수-수 점퍼 와이어 6개
수-암 점퍼 와이어 4개
필요한 라이브러리
Adafruit_Sensor
DHT
NewliquidCrystal
시작하기 전에
I2C가 장착된 16x2 LCD를 좋아하는 이유는 아두이노에 연결해야 할 수많은 핀 문제를 해결해주기 때문입니다. 점퍼 와이어 4개만 있으면 됩니다.
디스플레이는 명령을 받거나 메시지를 보내기 위한 I2C 주소를 가집니다. 단점은 장치가 어떤 주소를 사용하는지 먼저 알아내야 한다는 점입니다. 여기서는 자세히 다루지 않겠지만, 아두이노 포럼에서 모든 것을 읽을 수 있습니다.
제 경우 장치는 0x3F 주소를 사용합니다. 여러분의 장치도 이 주소를 사용한다면 운이 좋은 겁니다. 제 코드를 그대로 복사해도 됩니다.
브레드보드를 아두이노에 연결하기
DHT22 센서와 LCD 1602 I2C 모두 5V 전원을 사용합니다. 따라서 아두이노의 5V 핀을 브레드보드의 빨간색 + 열에, 아두이노의 그라운드를 파란색 - 열에 연결했습니다. 색상을 맞추기 위해 스키마에서는 5V용 빨간 케이블, 그라운드용 파란 케이블을 사용했습니다. (실제로는 그라운드에 흰색을 썼습니다. 자동차 전자 장치를 너무 많이 다뤄서 그렇습니다.)
핀아웃을 봅시다. DHT22 센서(DHT11과 동일)에는 4개의 핀이 있습니다. 센서 앞면이 바깥을 향하도록 브레드보드에 꽂습니다. 이렇게 하면 첫 번째 핀(5V 전원)이 오른쪽에 옵니다(회로도 참조).
작은 빨간 점퍼 케이블로 5V VCC를 브레드보드의 5V(+) 열에 연결하고, 작은 파란 점퍼 케이블로 그라운드를 그라운드(-) 열에 연결했습니다. 긴 노란 케이블로 두 번째 핀(데이터 핀)을 아두이노에 연결했습니다. 디지털 데이터이므로 아두이노의 디지털 포트 4번에 연결했습니다. 다른 예제에서는 포트 7을 쓰는 경우도 있지만 둘 다 작동합니다. 나중에 더 많은 데이터 포트를 쓸 예정이라 포트 7은 아껴두려고 4번을 썼습니다. 스키마에서도 확인할 수 있습니다.
LCD 16x2 I2C 추가하기
LCD 16x2 I2C에도 4개의 핀이 있습니다. 왼쪽부터 오른쪽으로:
그라운드
VCC (5V)
SDA
SCL
첫 번째(왼쪽) 핀을 브레드보드의 그라운드(-) 열에 연결합니다. 두 번째 핀을 빨간 5V(+) 열에 연결합니다. Arduino Uno의 I2C 연결은 A4(SDA)와 A5(SCL)에 있으므로, 세 번째 핀을 A4에, 네 번째 핀을 A5에 연결했습니다.
코드
화면 연결 주소가 다를 수 있음을 기억하세요. 제 I2C는 0x3F 주소를 사용합니다('시작하기 전에' 참조). 따라서 제 코드는 이 주소로 설정되어 있습니다.
필요한 라이브러리(Adafruit_Sensor, DHT, NewliquidCrystal)를 기억하세요. 이 라이브러리들을 다운로드하고 압축을 풀어 프로젝트의 라이브러리 디렉토리에 넣으세요.
그런 다음 코드를 아두이노에 업로드하고 테라리움(또는 서버 캐비닛, 냉장고, 거실)의 온도와 습도를 확인해 보세요.
코드
hygroThermo.ino C/C++
/* DHT-22 센서를 Arduino Uno와 사용하는 방법
온도 및 습도 센서
더 많은 정보: https://www.ardumotive.com/how-to-use-dht-22-sensor-en.html
개발: Michalis Vasilakis
날짜: 1/7/2015
www.ardumotive.com
*/
// 라이브러리
#include <DHT.h>
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
// 상수
#define DHTPIN 4 // 연결된 핀
#define DHTTYPE DHT22 // DHT 22 (AM2302)
DHT dht(DHTPIN, DHTTYPE);
// LCD I2C 및 주소 0x3F용 설정 - 항상 이 설정 사용
#define I2C_ADDR 0x3F
#define BACKLIGHT_PIN 3
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7
LiquidCrystal_I2C lcd(I2C_ADDR, En_pin, Rw_pin, Rs_pin, D4_pin, D5_pin, D6_pin, D7_pin);
// 변수
int chk;
float hum; // 습도 저장
float temp; // 온도 저장
void setup() {
Serial.begin(9600);
dht.begin();
lcd.begin(16, 2);
lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
lcd.setBacklight(HIGH);
}
void loop() {
delay(2000);
// 데이터 읽기 및 변수 저장
hum = dht.readHumidity();
temp = dht.readTemperature();
// 시리얼 모니터에 온습도 출력
Serial.print("Humidity: ");
Serial.print(hum);
Serial.print(" %, Temp: ");
Serial.print(temp);
Serial.println(" Celsius");
// LCD에 표시
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temp);
lcd.print(" ");
lcd.print((char)223); // 도 기호
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Hum: ");
lcd.print(hum);
lcd.print(" %");
delay(2000); // 2초 대기
}