2023.03.20
온도, 습도를 탐지하는
dht11 센서가 있다
이 센서를 활용하여
시리얼 모니터와
LCD 모니터에 함께 나타내보도록 하자
DHT와 LCD 활용을 위해
라이브러리 추가가 필요하다
위 화면과 같이 아두이노 IDE에서
스케치 ▶ 라이브러리 포함 ▶ 라이브러리 관리
를 눌러주면
위 화면과 같이
라이브러리 매니저가 왼쪽에 나타나고
검색창에서 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 등으로 들어가는데
제조사마다 다르니 본인의 주소를 먼저 체크해봐야 한다
loop() 측에는
공란으로 두어도 실행이 된다
LCD에 잘 나타나는지 시험해보면
다행히 잘 나타나준다
초기화면은 본인이 꾸미고 싶은대로 꾸며보자
16자로 2열씩이니
잘 분배해서 꾸며보면 멋진 텍스트들이 나온다
다만 이때 주의할 점은
마지막에 꼭 lcd.clear()를 해주어야 한다
그렇지 않으면 계속해서
초기화면으로만 나오기 때문에
내가 원하는 온도, 습도 값은
영영 볼 수 없다 😢
dht 센서의 라이브러리도
마찬가지로 설치해주자
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 와 함께 출력해주면
아래와 같이 나올 수 있다 :)