dht 센서를 활용한 온도, 습도 lcd에 나타내기 | dasfef

2023.03.20


온도, 습도를 탐지하는 dht11 센서가 있다
이 센서를 활용하여 시리얼 모니터와 LCD 모니터에 함께 나타내보도록 하자
​DHT와 LCD 활용을 위해 라이브러리 추가가 필요하다

라이브러리 관리


위 화면과 같이 아두이노 IDE에서 스케치 ▶ 라이브러리 포함 ▶ 라이브러리 관리 를 눌러주면

liquidcrystal_i2c


위 화면과 같이 라이브러리 매니저가 왼쪽에 나타나고 검색창에서 liquidcrystal_i2c 를 검색하면 by Frank de Brabander 와 같은 라이브러리를 발견할 수 있다
필자는 먼저 설치가 되어있기 때문에 설치됨이라고 뜨는데 설치가 안 된 사람은 해당 부분에 설치하기가 뜰 것이다
클릭 후 설치!
이제 LCD 활용을 위한 라이브러리 준비가 된 것이고 간단한 코드를 작성해보자

간편한 라이브러리 호출


스케치 ▶ 라이브러리 포함 ▶ 공헌된 라이브러리들 목록을 살펴보면 내가 설치한 별도의 라이브러리들이 존재하는데, 이 라이브러리를 눌러주기만 해도

호출된 라이브러리


이렇게 바로 자동으로 타이핑을 쳐준다 이 상태에서

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);   // LiquidCrystal_I2C 변수설정(주소, 셀개수, 열개수)

void setup() {
Serial.begin(9600);             // 보드레이트 설정
lcd.init();                     // LiquidCrystal_I2C 초기화
lcd.backlight();                // 백라이트 ON(default)
lcd.setCursor(0, 0);            // 0번째 셀, 0번째 열에 커서 지정
lcd.print(" hello Arduino ");  // lcd에 프린트할 문구 설정
}

LCD 셋업을 시켜준다(초기화면) * LiquidCrystal_I2C 이 부분의 주소가 0x27, 0x3f, 0x20 등으로 들어가는데 제조사마다 다르니 본인의 주소를 먼저 체크해봐야 한다

LCD 셋업 확인용


loop() 측에는 공란으로 두어도 실행이 된다 LCD에 잘 나타나는지 시험해보면

LCD 시험

다행히 잘 나타나준다
초기화면은 본인이 꾸미고 싶은대로 꾸며보자 16자로 2열씩이니 잘 분배해서 꾸며보면 멋진 텍스트들이 나온다
다만 이때 주의할 점은 마지막에 꼭 lcd.clear()를 해주어야 한다
그렇지 않으면 계속해서 초기화면으로만 나오기 때문에 내가 원하는 온도, 습도 값은 영영 볼 수 없다 😢
dht 센서의 라이브러리도 마찬가지로 설치해주자 ​

simpledht 검색


SimpleDHT 라이브러리를 검색 후 설치해주고 호출해준다

simpleDHT 라이브러리 호출




#include <SimpleDHT.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);

int DHT = 9;
SimpleDHT11 dht11(DHT);

byte temp = 0;
byte humi = 0;


lcd 주소, 셀, 열 dht 핀 번호 객체 생성 전역 변수 설정


등을 끝낸 뒤의 코드 작성은 아래와 같다 (자세한 설명은 주석으로)



#include <SimpleDHT.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);   // LiquidCrystal_I2C 변수설정(모델번호, 셀개수, 열개수)

// dht = 온도, 습도 센서
int DHT = 9;                      // 센서 9번핀에 연결 후 변수 지정
SimpleDHT11 dht11(DHT);           // dht11 객체 생성

byte temp = 0;
byte humi = 0;

void setup() {
  Serial.begin(9600);             // 보드레이트 설정
  lcd.init();                     // LiquidCrystal_I2C 초기화
  lcd.backlight();                // 백라이트 ON(default)
  lcd.setCursor(0, 0);            // 0번째 셀, 0번째 열에 커서 지정
  lcd.print("== DHT SENSOR ==");  // lcd에 프린트할 문구 설정
  lcd.setCursor(0, 1);            // 0번째 셀, 1번째 열에 커서 지정(두번째 줄 첫칸)
  lcd.print("...EXECUTING...");   // lcd에 프린트할 문구 설정

  delay(2000);
  lcd.clear();
}

void loop() {
  int err = dht11.read(&temp, &humi, NULL);   // dht11센서에서 받는 temp, humi 의 주소값 read
                                              // 값 = 0으로 반환된다
  if(err != SimpleDHTErrSuccess) {            // dht11 에서 에러가 발생한다면(read의 값이 0이 아니라면)
    lcd.setCursor(0, 0);
    lcd.print("dht11 Failed");
    lcd.setCursor(0, 1);
    lcd.print("error = " + err);
    delay(2000);
  }
  lcd.setCursor(0, 0);
  lcd.print("TEMP / HUMI");
  lcd.setCursor(0, 1);

  String(tempStr) = String(temp);             // 0xDF 섭씨온도의 표현을 위해 값을 문자열로 변경
  String(humiStr) = String(humi);

  lcd.print(tempStr + (char)0xDF + "C ");   // 0xDF : 섭씨온도 표시
  lcd.print(humiStr + "H");
  // lcd.clear();

  Serial.print("Sample OK : ");
  Serial.print((int)temp); Serial.print(" C ");
  Serial.print((int)humi); Serial.println(" H");
  delay(2000);
}


계속 찾아보면서 이해하려 했던 부분이 에러 발생 및 dht11.read() 이 부분에 대한 점이었는데 dht11.read(&temp, &humi, NULL) 이 read 함수의 반환값은 0이 되는것으로 확인된다
정확한 설명은 잘 모르겠으나 0으로 반환되는 이 값을 err 변수로 설정하고 SimpleDHTErrSuccess 와 err(0)의 값이 같지 않을때를 에러 발생 상황으로 두고 표현한다
추측하자면 SimpleDHTErrSuccess 는 1이나 0이 아닌 값으로 반환시키고 그 의미는 DHT 센서가 정상 작동함을 알리는 역할을 한다는 것이다
따라서 err != SimpleDHTErrSuccess 가 에러가 되는것이고 그 즉시 if 절의 아래와 같은 코드들을 불러 에러 발생과 함께 메세지를 띄운다
​+++ 처음 string 으로의 변환 없이 (char)0xDF 를 출력하려 했더니 이상한 문자 혹은 아예 읽어들이지 못했는데 LCD 출력에서는 한글 출력을 위한 라이브러리가 별도로 존재하고 숫자 값과 동시에 문자를 출력할 수 없다는 것을 알았다
때문에 String으로 받아들이는 temp, humi의 값을 문자로 변환하고 0xDF 와 함께 출력해주면 아래와 같이 나올 수 있다 :)