티스토리 뷰

온/습도센서를 이용해 LCD에 온도와 습도를 출력하는 예제를 해보겠습니다.


<그림 1> 온/습도 LCD 출력 모습



온습도센서

아두이노에서 흔히 사용되는 온/습도 센서는 DHT11과 DHT22가 있습니다. 두 제품 특징이 조금 다르지만 일반적으로 DHT22가 더 성능이 좋은 센서라고 할 수 있습니다. DHT11으로도 일상적인 온도를 측정이 가능하기 때문에 저렴한 DHT11이 더 널리 사용됩니다.


<그림 1> DHT11(Blue) vs DHT22(White)

(source: https://learn.adafruit.com/dht/overview)


<표 1> DHT11 vs DHT22

 

 DHT11

DHT22 

 Power

 3 to 5V power and I/O

 Current

 2.5mA max current use during conversion (while requesting data)

 Humidity

 Good for 20-80% with 5% accuracy

 Good for 0-100% with 2-5% accuracy

 Temperature

 Good for 0-50°C ±2°C accuracy

 Good for 0-100% with 2-5% accuracy

 Sampling rate

 Once every 1 seconds

 Once every 2 seconds

 Body size

 15.5mm x 12mm x 5.5mm

 15.1mm x 25mm x 7.7mm

 Cost

 Extra low cost

 Low cost


    비교표를 보면 DHT22 쪽이 측정할 수 있는 온/습도 범위가 넓고 측정 오차도 적은 것을 알 수 있습니다. 가격은 DHT11이 더 저렴합니다. (국내 쇼핑몰에서 습도센서를 검색하면 DHT11은 2천원, DHT22는 5천원 정도에 판매되고 있습니다.) 자세한 내용은 아래 Adafruit 홈페이지를 참고 바랍니다.

https://learn.adafruit.com/dht/overview

이번 예제에서는 DHT22센서를 이용하겠습니다.


LCD Display 

이번 예제에서는 LCD1602(I2C 제어)를 사용하겠습니다. 1602란 한 줄에 16문자씩 2줄 표현가능하단 뜻입니다. 그리고 I2C 제어란 LCD를 바로 아두이노에 연결하지 않고 I2C 보드를 통해서 아두이노와 연결한다는 의미입니다. LCD를 아두이노와 바로연결할 경우 연결할 핀이 많고 밝기 조절을 위한 가변저항을 따로 달아야 하는 등 불편한 점이 많습니다. I2C 보드에는 밝기 조절용 가변저항도 붙어있고 아두이노와 연결할 핀도 4개 뿐이라 사용이 간편합니다. 가격차이도 크지 않으므로 특별한 목적이 있는 것이 아니라면 I2C가 있는 LCD를 이용하는 것이 좋습니다. 쇼핑몰에서 LCD I2C로 검색하면 아래와 같이 I2C 보드가 붙은 LCD를 구매할 수 있습니다.


<그림 2> LCD1602 I2C Converter

녹색 LCD 판 위의 검은색 보드가 I2C Converter입니다. Converter에는 밝기를 조절할 수 있는 가변저항이 붙어있습니다. (파란색 육면체)


 


완성된 회로도



<그림 3> 온/습도 LCD 출력 완성 회로도


DHT22 센서는 핀이 4개가 있는데 그 중 하나는 연결할 필요가 없는 핀 입니다. Vcc 옆에 있는 핀이  Signal이니 이핀을 아두이노의 Digital 2번핀과 연결하면 됩니다. 그리고 센서의 Signal과 Vcc가 저항을 사이에 두고 연결된 것을 볼 수 있습니다. Vcc가 Signal과 연결되면 센서에 문제가 생기거나 동작이 안될것이라 걱정될 수 있지만 그렇지 않습니다. 이렇게 연결해야 센서에 Pull Up 전원이 공급되어 제대로 작동합니다.



<그림 4> Adafruit 튜토리얼 DHT 연결 예시

(Source: https://learn.adafruit.com/dht?view=all)

DHT의 핀은 왼쪽부터 VDD, Data(Signal), Null, GND 순서입니다. 3번째 핀은 NULL로 연결할 필요가 없습니다. 가끔 핀이 3개인 센서도 있는데 그럴 경우 센서에 표시된 순서로 연결하시면 됩니다. (순서가 Data(Signal), VDD(+), GND 순서인 센서도 있고 VDD, Data, GND 순서인 센서도 있습니다.


저희는 DHT센서 Signal과 전원 사이에 10kOhm 저항을 이용하도록 하겠습니다. 10kOhm 저항의 띠색깔은  갈-검-주입니다. 띠색으로 저항 값 읽는 법은 아래 링크를 참고 바랍니다.

https://www.petervis.com/electronics/Standard_Resistor_Values/10K.html

LCD는 I2C 보드의 VCC와 GND를 아두이노와 연결한 다음 SCL핀을 아두이노 Analog Input 중 A5에연결하고 SDA핀을 아두이노 A4에 연결하면 완성입니다.


완성된 코드

    아래 코드를 사용하기 위해서는 라이브러리를 추가해줘야 합니다. 라이브러리 추가하기 글을 참고 바랍니다.

[아두이노] - [아두이노] 라이브러리 추가하기


#include <DHT.h>
#define DHTPIN 2 // 습도센서 Signal 선 연결
#define DHTTYPE DHT22 // 습도센서 종류: DHT22
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
DHT dht(DHTPIN, DHTTYPE);

LiquidCrystal_I2C lcd(0x27,16,2); // LCD주소: 0x27 또는 0x3F
float hum; // 습도값 저장 변수
float temp; // 온도값 저장 변수

void setup() {
  Serial.begin(9600);
  dht.begin();
  delay(2000);
  lcd.init();
  lcd.backlight();
  lcd.setCursor(2,0);
  delay(5000);
  lcd.clear();
}

void loop() {
  hum = dht.readHumidity();//온도값 읽기
  temp= dht.readTemperature();//습도값 읽기

  Serial.print("HUMIDITY: "); // "HUMIDITY:" 출력
  Serial.print(hum,0);// 습도 값 소수점 이하 자리 없음
  Serial.print(" %, TEMPERATURE: "); //"%"(습도단위) "TEMPERATURE:" 출력
  Serial.print(temp, 1);//온도값은 소수점 이하 1자리까지 표시
  Serial.println(" C"); //"C" 온도 단위 표시
  lcd.setCursor(0,0); // LCD Cursor 원점
  lcd.print("TEMP:"); // LCD에 "temp" 표시

  float t = temp; // 온도값을 t에 할당
  lcd.print(t,1); // 온도값 LCD로 출력
  lcd.print(" C"); // 온도 단위 표시
  lcd.setCursor(0,1); //LCD 커서 줄바꿈
  lcd.print("HUMIDITY:"); //LCD 2번째 줄에 "humidity:" 출력
  int h = hum; //습도값 h에 할당
  lcd.print(h); //습도값 LCD에 출력
  lcd.print(" % "); //습도 단위 출력
  lcd.println();
  delay(2000); // 샘플링 간격 2초
}



댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함