초보자를 위한 아두이노 코딩 입문-16: Adafruit DTH11 온습도 I2C lcd 디스플레이
비오는 날에 아두이노에 DHT11 온습도계를 설치하여 온도와 습도 특히 습도를 측정해 보자. 이미 얼마 전에 아두이노 온습도 모니터링 장치를 꾸며서 코딩을 해 보았다.
초보자를 위한 아두이노 코딩 입문-12: Adafruit DTH11 센서를 이용한 온습도 모니터링
https://steemit.com/kr/@codingart/11-adafruit-dth11
한편 lcd 와 같이 특별한 출력 장치가 없을 경우 PC에서 시리얼 모니터로 측정된 결과를 볼 수 있었다, 하지만 이미 수일 전에 아래에 기술된 블로그에서처럼 lcd 디스플레이 사용법에 관해서도 코딩이 이루어졌다. 이 블로그에 관해서 아래와 같이 스팀잇에서 활동하시는 분들로부터 많은 도움을 받았으며 그 덕에 꽤 많은 분들이 lcd 디스플레이 방법에 관해서 아시게 되었으리라 생각된다.
초보자를 위한 아두이노 코딩 입문-14: I2C인터페이스 1602 LCD 디스플레이 출력
https://steemit.com/kr/@codingart/13-i2c-1602-lcd
아날로그 온습도 측정과 문자열 “Welcome Steemit!”lcd 디스플레이는 무관한 듯 보일지 모르나 출력 명령을 사용하여 결합하면 lcd에서도 온습도를 읽을 수 있다.
2가지 종류의 배선에 있어서 주의할 점은 2개의 전원을 사용하도록 하는 점이다. 다음과 같이 할당하도록 하자. 0V 즉 GND 는 3개가 있으므로 충분하다.
DHT11 -> 3V3(3.3V)
I2C lcd -> 5V
DHT11 센서는 3개의 핀 즉 Vcc, GND, Data 을 가진다. Data 핀을 아두이너 디지털 데이터 핀 5번에 할당한다. 분명히 외부에서 측정 데이터 값을 읽어 오는 입력(Input) 에 해당하지만 pinMode(5, INPUT) 설정은 필요치 않다. 그 이유는 이미 언급했던 것처럼 DHT11 라이브러리를 사용하는 아두이노 코드와 DHT11 센서 내부의 마이크로콘트롤러와 디지털 인터페이스 방식에 의한 통신이 이루어진다.
I2C 인터페이스 센서는 2개가지 아두이노와 직접 연결이 가능하며 빵판을 사용하면 더 많은 센서 연결이 가능하다. 단 연결되는 센서를 아두이노가 분별하려면 각 센서에 고유하게 할당된 주소(Address) 가 달라야 한다.
아울러 아두이노 우노에는 SCL 과 SDA 핀이 AREF 핀 옆에 있으며 이들은 각각 A5 와 A4 와 같은 핀에 해당한다.
온도나 습도 두 가지를 함께 측정하는 이유는 기상관측(Weather Station) 관점이기 때문이다. 특히 비가 내리곳에서의 상대 습도는 거의 90% 를 상회하나 DHT11 센서는 80% 이상의 범위에서 정밀도가 떨어지는 편이다. 정밀한 측정을 위한 온습도 센서로서 Adafruit사의 DHT22를 참조하기 바란다. 배선 구조는 동일하지만 사용하는 라이브러리 명칭이 DHT.h 로 DHT11.h 와 다르다.
---이 블로그는 스팀잇에 새로리 가입한 회원들을 위하여 Reposting을 통해 재 노출 될 수도 있음을 양해 바랍니다.---
DHT11센서 핀 구조
센서 몸체만 있는 DHT11은 배선 작업 시에 Vcc 와 Data 사이에 4.7KΩ 저항 배선이 필수적이며 한편 pcb 형태의 DHT11 센서는 사용의 편리성 및 배선의 간편성이 훨씬 뛰어 나다.
PCB에 설치된 DTH11 센서의 실제 PCB 핀 수는 3개이다. Vcc는 5V에 GND는 GND 즉 0V에 디지털 데이터 핀은 예를 들자면 5번에 핀에 연결하도록 한다. DHT11 몸체만 있는 경우에는 4개의 핀 중 하나는 사용하지 않는다는 점에 주의하자. 아두이노 우노에서 Vcc는 5V 나 3V3 중 어느 전압을 사용해도 결과에는 영향이 없다. I2C lcd 1602는 5V 전원이 필요하므로 DHT11 은 3V3 으로 전원을 할당한다.
DHT11.h 라이브러리 설치
이 작업에 관해서는 초보자를 위한 아두이노 코딩 입문-12: Adafruit DTH11 센서를 이용한 온습도 모니터링을 참조하기 바란다.
https://steemit.com/kr/@codingart/11-adafruit-dth11
만약 이미 DHT11 온습도 센서 코딩을 완료 했으면 DHT11.h 라이브러리가 이미 설치되어 있을 것이다. 아두이노 편집기의 스케치 탭 메뉴의 라이브러리 포함하기에 라이브러리 DHT11,h가 설치되어 있으면 면제가 가능하다.
LiquidCrystal-I2C.h 라이브러리 설치
(backpack)회로가 부착된 I2C 인터페이스를 사용하는 lcd 디스플레이를 배선하도록 한다.
I2C 인터페이스의 장점으로는 와이어링에 필요한 전기 배선이 전원선 GND 와 5V, SCL 과 SDA 4개의 점퍼선이면 충분하며 2개의 라이브러리 즉 LiquidCrystal_I2C.h 과 Wire.h 사용이 필수적이다.
Wire.h 는 I2C 인터페이스를 지원하며, LiquidCrystal_I2C.h는 I2C 인터페이스 lcd 디스플레이를 지원한다.
아래는 16핀 백팩 PCB회로가 납땜되어 있는 lcd의 뒤태이다. 우측 상단에 가변 저항이 1개 부착되어 있는데 이는 lcd의 백라이트 밝기를 조절하기에 사용된다. 흔히 완전히 조립한 상태에서 이 저항 값을 조정하지 않음으로 인해 착각하는 수가 있을 수 있는데 반드시 한번 드라이버로 나사를 돌려 보아 밝기를 조절해야 한다.
I2C lcd 배선은 GND->GND, Vcc->5V, SDA->A4, SCL->A5 에 연결한다. A4, A5 는 각각 아날로그 핀을 뜻한다. 한편으로는 위의 배선도를 참조하면 아두이노에 USB 근방에 정식으로 SCL 과 SDA 핀이 있으므로 이들을 이용해도 무방하다.
아두이노 편집기의 스케치 탭 메뉴의 라이브러리 포함하기에 라이브러리 LiquidCrystal_I2C.h가 설치되어 있으면 면제가 가능하다. 이 라이브러리는 구글에서 i2c 1602 lcd 로 검색하여 뜨는 코코아팹에서 Arduino-LiquidCrystal-I2C-library-master.zip 파일을 다운 받도록 한다.
온습도 측정 및 디스플레이 코딩
온습도 측정 및 lcd 디스플레이를 위해서 아래의 프로그램을 복사하여 아두이노 편집기에서 보드 및 포트 번호를 지정 확인한 다음 컴파일하여 업로드 한다.
코드에서 보면 디지털 데이터 핀 번호를 5번으로 하였으므로 실제 배선 시에 정확하게 점퍼선을 연결하였는지 반드시 확인하기 바란다. 온습도 샘플링 시간 지연은 20초로 하였다. 사물인터넷 작업이 가능한 ThingSpeak의 경우 http 통신상의 시간적인 여유을 위해서 15초를 기준으로 하는 경우도 있다. 사실 한 측정 지점에서 몇 초 만에 온습도 변화가 그다지 심하지 않다는 점을 명심하자.
DHT11 데이터 핀을 연결하기 위한 아두이노의 디지털 데이탄 핀 번호를 pin = 5 로 지정한다. 아울러 DHT11 클라스 명령을 dht11(pin)으로 선언한다. 이 명령이 선언되면 dht11.read(humi, temp)를 실행하게 되면 DHT11 센서로부터 온습도 데이터를 읽어 들이는 명령이 수행된다. 이러한 클라스 명령은 C/C++, Python 에서 흔히 사용된다.
loop()에서 온습도 측정 루틴이 실행되어 실수형 습도 값 humi 와 온도 값 temp를 DHT11 센서로부터 읽는다. 실수로 읽어 들인 humi 와 temp 의 값을 정수로 변환하여 lcd.print()에서 출력하도록 한다.
유사한 명칭의 라이브러리들이 있을 수 있는데 스팀잇 회원이라면 이 블로그에서 지정한 곳에 첨부된 라이브러리를 다운받아 사용 바란다.
이 DHT11 센서에 의한 아두이노 온습도 측정 프로젝트는 아두이노를 접한 누구나가 다 경험하는 중요 프로젝트이다. 이를 시발점으로 하여 측정 결과의 Processing 그래프 출력이라든지 또는 무선 와이파이에 의한 사물인터넷 ThingSpeak 싸이트에 그래프 출력이라든지 또는 블루투스에 의한 온습도 기상 관측 결과의 앱인벤터 출력을 위한 코딩들이 앞으로 제시될 것이다.
lcd_DHT11_i2c_01
#include <DHT11.h> //DHT11 지원
#include <Wire.h> //I2C 지원 라이브러리
#include <LiquidCrystal_I2C.h>// lcd 지원
int pin= 5;//DHT11 데이타 핀 설치
DHT11 dht11(pin); //클라스 명령 선언 dht11()
LiquidCrystal_I2C lcd(0x3F,16,2);
// 0x3F-lcd 의 I2C 인터페이스 주소
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
lcd.setCursor(1,0);
lcd.print("Hello Steemit!");
delay(5000);
lcd.clear();
}
void loop() {
int err;
float temp, humi;
if((err=dht11.read(humi, temp))==0) {
lcd.setCursor(0,0);
lcd.print("temp:");
int t = temp;
lcd.print(t);
lcd.print(" C deg");
lcd.setCursor(0,1);
lcd.print("humidity:");
int h = humi;
lcd.print(h);
lcd.print(" % ");
lcd.println();
}
else {
lcd.println();
lcd.print("Error No :");
lcd.print(err);
lcd.println();
}
delay(20000);
}//끝







아고... 이런 제가 너무 무지한건지.. 너무 어렵네요 ㅎㅎ
제가 아는 범위를 너무 벗어난 것이라..
그래도 누군가에게는 도움이 될 글이니
업봇 하고갑니다^^
어려운것은 절대 아니고요. 시리즈 1번부터 읽어 보시면 이번 코딩하려면 5개정도 단계를 거쳐야 하는데 웬만한 초등학생들부터 다 잘해요. 내로남불 아시죠. 내가 어렵다고 느끼면 어려운 것이고 남이 할 수 있으면 쉽다! 그냥 웃자고 하는 말 입니다.