DHT22 및 0.96인치 OLED 액정 사용하기

by 고학능 | 2017-12-07 20:05
dht22 iot relay wemos d1 가습기 아두이노

이번에는 온도, 습도를 측정하는 DHT22 센서와 온도, 습도값을 표시할 0.96인치 OLED 액정 사용법을 소개하겠습니다.

 1. DHT22 

센서에서 측정한 값을 아날로그 핀 또는 디지털 핀을 통해서 받습니다. 그리고 보드에서 이용할 수 있는 디지털 및 아날로그 핀은 수가 정해져 있습니다. 보드에서 사용할 수 있는 디지털 혹으 아날로그 핀을 고려해서 센서종류를 정하는 편이 좋습니다. DHT 센서는 디지털 핀으로 측정값을 전달하고, wemos d1은 아날로그 핀보다는 디지털 핀이 많아서 둘은 찰떡궁합이라 생각합니다.
시중에서 쉽게 구할 수 있는 DHT11 및 DHT22를 비교해 보았습니다.


DHT11DHT22
공급전원3 ~ 5.5V3.3 ~ 5.5V
온도측정범위0 ~ 50℃-40 ~ 80℃
온도측정오차2℃0.5℃
습도측정범위20 ~ 90%0 ~ 100%
습도측정오차5%2%
측정간격1초

2초

DHT11과 DHT22를 비교해보면 가격은 DHT22가 약간 비싸지만 성능면에서 DHT22가 우수합니다.
그래서 전 DHT22를 사용했습니다.

DHT센서를 사용하기 위해 코드를 작성해야 하지만, 이미 DHT 센서를 활용할 수 있도록 많은 라이브러리가 존재하기에 라이브러리를 활용하겠습니다. 
DHT 라이브러리 ← 라이브러리르 다운로드 받은 후 설치하시면 됩니다.


아두이노 코드를 보고 설명하겠습니다.
// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain

#include "DHT.h" // DHT 라이브러리를 불러옵니다.
#define DHTPIN D6 // DHT 센서를 연결한 디지털 핀을 정의합니다.
//#define DHTTYPE DHT11 // DHT11 인지 DHT22인지 설정합니다.
#define DHTTYPE DHT22 // 저는 DHT22를 사용했습니다.
DHT dht(DHTPIN, DHTTYPE); // DHT 클래스를 선언합니다. 여기에는 연결한 디지털 핀, 센서종류가 들어갑니다.

void setup() {
Serial.begin(9600);
Serial.println("DHTxx test!");

dht.begin(); // dht 센서를 이용해 온습도를 측정한다 명령어입니다.
}

void loop() {
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
float h = dht.readHumidity(); //float 변수에 습도값이 저장됩니다.
float t = dht.readTemperature(); // float 변수에 온도값이 저장됩니다.

// check if returns are valid, if they are NaN (not a number) then something went wrong!
if (isnan(t) || isnan(h)) {
Serial.println("Failed to read from DHT");
} else {
Serial.print("Humidity: "); Serial.print(h); Serial.print(" %\t"); Serial.print("Temperature: "); Serial.print(t); Serial.println(" *C");
}



// 온도, 습도가 측정되면 값을 출력하고, 하나라도 측정이 안되면 오류 메세지가 출력됩니다.























}


2. 0.96인치 OLED 액정

공급전원이 3.3~5V 낮은 전압에서도 작동이 가능하고 크기가 작으며 I2C통신으로 데이터를 주고 받아 보드에 연결한 핀 개수가 적습니다. 

액정을 사용하기 위해서 Adafruit사에서 제작한 라이브러리 도움을 받았습니다.

Adafruit_SSD1306_libraryAdafruit_GFX_library 

라이브러리르 사용하기에 앞서 2가지를 설정해야 합니다.

먼저 SSD1306 라이브러리 헤더파일을 수정해야합니다. '라이브러리가 설치된 폴더 - Adafruit_SSD1606_master 폴더 - Adafruit_SSD1306.h(헤더파일)'이 있는데 이 헤더파일을 엽니다.(연결할 프로그램이 필요하다고 하면 '워드패드'를 설정하면 됩니다.)

우리가 사용할 액정 해상도는 128*64이고 라이브러리에서 기본설정된 해상도는 128*32입니다. 그래서 라이브러리에 128*64 해상도로 변경합니다.

둘째 스케치 파일에서 소소하게 변경합니다.

#include <SPI.h>    // 아두이노 기본 라이브러리
#include <Wire.h> // 아두이노 기본 라이브러리
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET LED_BUILTIN // LED_BUILTIN 이곳에 안쓰는 핀 번호를 써주면 됩니다.
Adafruit_SSD1306 display(OLED_RESET);
#if (SSD1306_LCDHEIGHT != 64) // 128*64해상도 확인합니다. 128*32해상도면 64대신 32를 쓰면 됩니다.
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

void setup() {
// put your setup code here, to run once:
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // 기본예제는 0x3D로 적혀있으나 0x3C로 주소를 설정해주어야 합니다.
display.clearDisplay();
display.display();
}

void loop() {
// put your main code here, to run repeatedly:
display.setTextSize(2);
display.setTextColor(WHITE);
display.clearDisplay();
display.setCursor(0,0); display.println("hum : ");
display.setCursor(0,30); display.println("temp: ");
display.setCursor(70,0); display.println("00.0");
display.setCursor(70,30); display.println("00.0");
display.display(); // 이 명령어를 사용해야 출력이됩니다.
}




























.setTextSize(), .setTextColor(), .clearDisplay(), .setCursor(), .println(), .dislay()가 액정에 글자 및 숫자를 출력할 때  사용합니다.


3. DHT22에서 측정한 값을 액정에 출력해보겠습니다.

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "DHT.h"

#define OLED_RESET LED_BUILTIN
Adafruit_SSD1306 display(OLED_RESET);
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif // 128*64화면인지 확인하기

#define DHTPIN D6 // what pin we're connected to
#define DHTTYPE DHT22 // DHT 22 (AM2302)
DHT dht(DHTPIN, DHTTYPE,11);

char _h[5], _t[5];

void setup() {
// put your setup code here, to run once:
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.display();

dht.begin();
}

void loop() {
// put your main code here, to run repeatedly:
float h = dht.readHumidity(); float t = dht.readTemperature();
dtostrf(h, 4, 1, _h); dtostrf(t, 4, 1, _t);

if (isnan(t) || isnan(h)) {
Serial.println("Failed to read from DHT");
} else {
display.setTextSize(2);
display.setTextColor(WHITE);
display.clearDisplay();
display.setCursor(0,0); display.println("hum : ");
display.setCursor(0,30); display.println("temp: ");
display.setCursor(70,0); display.println(_h);
display.setCursor(70,30); display.println(_t);
display.display();
}
}












































스케치 파일과 전기회로입니다.

DHT  스케치 파일과 액정 스케치 파일에서 추가된 것은 

char _h[5], _t[5];   
dtostrf(h, 4, 1, _h); dtostrf(t, 4, 1, _t);

위 4개 코드입니다. 왜 4개 코드를 추가 안하면 


온습도 종류 및 센서값이 두 줄에 걸쳐 출력됩니다.

한 줄에 온습도 종류 및 센서 값을 출력하기 위해서  센서값을 소수점 두자리에서 한자리로 만들 필요가 있습니다.

그래서 

char _h[5], _t[5];   
dtostrf(h, 4, 1, _h); dtostrf(t, 4, 1, _t);

을  추가했습니다.

dtostrf은 dtostrf(float data, 소수점 포함 길이, 소수점 이후 표현할 자리수, 저장할 변수)형태를 갖고 특징은 float데이터를 소수점 자리수를 조절해서 문자형태로 저장합니다.

예를들어 dtostrf(1234.12123, 9, 2, store); 결과 값은 store라는 변수에 1234.12값이 문자형태로 저장됩니다. 

http://www.hobbytronics.co.uk/arduino-float-vars 이곳에 가서 보면 정확한 정보를 얻을 수 있습니다.(내 영어실력 ㅠㅠ)


다음 장에서는 온습도 센서에서 측정한 값을 인터넷에 업로드하는 방법에 대해서 알아보겠습니다.



댓글 0

MADE BY

고학능

3d모델링, 아두이노, 전기회로 구성