K씨의 별별제작소

아두이노로 온습도계만들기 (DHT22 온습도센서, 0.96 OLED) - 1 본문

아두이노 프로젝트

아두이노로 온습도계만들기 (DHT22 온습도센서, 0.96 OLED) - 1

K씨 2018. 11. 23. 10:24

집안 공기질을 측정할 수 있는 장치 만들기의 첫번째 단계로 먼저

온도, 습도를 측정하여 표시해주는 장치부터 만들어보기로 했다.

 

 

1. 준비물

 

 

▲ 보드는 아두이노 우노를 사용하고

DHT22(=AM2302) 온습도 센서모듈과 0.96인치 OLED (128x64 I2C SSD1306)모듈을 사용하고,

브레드보드와 점퍼선으로 연결하였다.

 

 

2. DHT22 온습도 센서모듈 연결, 측정하기

 

 

실험용으로 끝나지 않고 직접 집에서 사용할 거라

비교적 정확한 값을 위해 DHT22 센서 모듈을 구입했다.

DHT22는 DHT11에 비해 비교적 정확하면서도 많이 비싸지 않은 센서라

DIY에 많이 사용되는 것 같다.

 

http://www.hardcopyworld.com/ngine/aduino/index.php/archives/1513

센서에 대한 정보는 위 사이트를 참고했다.

 

구입은 알리익스프레스에서 했고, 가격은 $2.87

내가 구입한 센서는 Breakout 보드와 연결된 모듈이라 3라인만 연결해주면 되어서

비교적 쉽게 사용가능했다.

 

 

1> 라이브러리 설치하기

 

DHT22 사용을 위해 2개의 라이브러리를 설치한다.

DHT Sensor library Adafruit Unified Sensor library

 

1-1>

https://github.com/adafruit/DHT-sensor-library

 

 

▲ 위 사이트로 들어가 zip 파일을 다운로드 하고

 

 

 

▲ 아두이노IDE를 열어 zip 라이브러리 추가하면

 

 

▲ DHT Sensor library 가 설치되었다.

 

 

 1-2>

https://github.com/adafruit/Adafruit_Sensor

 

 

▲ 마찬가지로 위 사이트로 들어가서 zip파일을 다운로드하고 아두이노IDE에서 추가하면

 

 

▲ Adafruit Unified Sensor library 가 설치된 것을 볼 수 있다.

 

 

 

2> DHT22 센서 모듈 연결하기

 

 

▲ 내가 구입한 센서 모듈에는 +,- 표시만 되어 있었는데

+핀을 5V또는 3.3V에 연결하고

-핀을 GND에 연결하고 나면

가운데핀 하나가 남는다. 가운데핀은 D2에 연결한다.

 

 

3> 온습도 확인하기

 

 

▲ 아두이노 IDE를 열고

예제 → DHT Sensor library → DHT_Unified_Sensor를 연다.

시리얼모니터를 열어 온도와 습도를 확인한다.

 

모듈 연결이 바르게 되고 라이브러리 설치도 제대로 되었다면

온도 습도가 잘 표시되는 것을 확인할 수 있다.

 

 

3. 0.96 OLED 디스플레이에 온습도 출력하기

 

 

 

 

OLED가 무엇인지 알고자 한다면

https://terms.naver.com/entry.nhn?docId=3571212&cid=59088&categoryId=59096 에서

 자세히 설명해주니 참고하면 좋다.

 

0.96인치 OLED 디스플레이는 생각보다 작지만,

가격도 저렴하고 라이브러리도 잘 활용할 수 있고 해서

많이들 사용하는 것 같다.

 

OLED는 주로 SPI, I2C의 2가지 통신방식을 사용하는데

SPI 통신은 속도가 빠른데 사용하는 핀수가 많고

I2C 통신은 속도는 좀 느리지만 적은 핀수로 통신할 수 있다.

 

내가 구입한 것은 I2C 통신을 하는 것인데,

사실 구입할 당시에는 잘몰라서 통신방식을 고려하지않고

그냥 저렴한 걸로 구입했다.

저렴해서인지 핀 납땜도 되어있지 않아서 납땜을 직접했다.

알리익스프레스에서 구입했고, 가격은 $2.38

 

 

▲ 내가 구입한 OLED에 대한 설명

파파고가 번역을 참 잘해준다는 생각이 든다.

 

 

1> 0.96 OLED 모듈 연결하기

 

 

▲ OLED모듈을 아두이노 우노에 연결하였다.

GND와 VCC를 각각 GND와 5V 또는 3.3V(5V와 3.3V 다 잘 작동한다.)에 연결하고

SCL을 A5에, SDA를 A4에 연결한다.

 

 

▲ 위에서 연결한 DHT22 온습도 센서와 OLED 모듈 전체 연결도를 그려보면 다음과 같다.

 

 

2> OLED에 온습도 출력하기

 

0.96 OLED 디스플레이를 사용하기 위한 라이브러리로 가장 많이 사용되는 것이

Adafruit SSD1306 라이브러리와 U8glib 라이브러리인 듯한데

 

 

디스플레이에 영문자와 숫자만 표현한다면

Adafruit SSD1306 라이브러리가 괜찮은거 같고

 

한글이나 이미지를 표현하고자 한다면

U8glib 라이브러리를 사용하는게 좋은거 같다.

나는 2가지 방법을 다 사용해보았다.

 

 

"방법1. Adafruit SSD1306 라이브러리 사용"

 

 

1-1> Adafruit SSD1306 라이브러리 설치하기

 

 

https://github.com/adafruit/Adafruit_SSD1306 에서

 Adafruit_SSD1306 라이브러리를 다운로드 받아 설치하고

 

 

https://github.com/adafruit/Adafruit-GFX-Library 에서

Adafruit-GFX-Library도 다운로드받아 설치한다.

 

 ▲ 설치하고 나면

아두이노 IDE의 라이브러리에서

Adafruit SSD 1306 라이브러리와 Adafruit GFX Library를 확인할 수 있다.

 

1-2> I2C주소 스캔하기

 

내가 사용하는 OLED 디스플레이 부품의 I2C 주소를 확인해야한다.

아래의 프로그램을 아두이노IDE에 입력하고 시리얼모니터를 열어본다.

 

프로그램 출처: http://playground.arduino.cc/Main/I2cScanner

 

// --------------------------------------
// i2c_scanner
//
// Version 1
//    This program (or code that looks like it)
//    can be found in many places.
//    For example on the Arduino.cc forum.
//    The original author is not know.
// Version 2, Juni 2012, Using Arduino 1.0.1
//     Adapted to be as simple as possible by Arduino.cc user Krodal
// Version 3, Feb 26  2013
//    V3 by louarnold
// Version 4, March 3, 2013, Using Arduino 1.0.3
//    by Arduino.cc user Krodal.
//    Changes by louarnold removed.
//    Scanning addresses changed from 0...127 to 1...119,
//    according to the i2c scanner by Nick Gammon
//    http://www.gammon.com.au/forum/?id=10896
// Version 5, March 28, 2013
//    As version 4, but address scans now to 127.
//    A sensor seems to use address 120.
// Version 6, November 27, 2015.
//    Added waiting for the Leonardo serial communication.
//
//
// This sketch tests the standard 7-bit addresses
// Devices with higher bit address might not be seen properly.
//
 
#include <Wire.h>
 
 
void setup()
{
  Wire.begin();
 
  Serial.begin(9600);
  while (!Serial);             // Leonardo: wait for serial monitor
  Serial.println("\nI2C Scanner");
}
 
 
void loop()
{
  byte error, address;
  int nDevices;
 
  Serial.println("Scanning...");
 
  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
 
    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");
 
      nDevices++;
    }
    else if (error==4)
    {
      Serial.print("Unknown error at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.println(address,HEX);
    }   
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
 
  delay(5000);           // wait 5 seconds for next scan
}

 

 

 

▲ 시리얼모니터에서 내가 가진 부품의 I2C 주소가 0x3C인걸 확인할 수 있다.

주소는 일반적으로 0x3D 또는 0x3C이다.

 

1-3> 예제 실행하기

 

 

▲ 라이브러리 설치후 자동으로 만들어진

Adafruit SSD1306 → ssd1306_128x64_i2c 예제를 연다.

 

 

▲ 디스플레이의 I2C 주소부분을 아까 확인한 주소인 0x3C로 변경하고

예제를 컴파일, 보드에 업로드한다.

 

▲ 업로드가 완료되면 꽤 화려한 애니메이션을 디스플레이에 보여준다.

내가 사용한 디스플레이는 노랑+파랑 색 조합의 디스플레이이다.

(디스플레이 구입시 색상 선택할 수 있음)

 

1-4> 온도 습도 출력하기

 

이제 DHT22 온습도센서에서 읽은 온도와 습도 값을

디스플레이에 나타내주는 소스를 업로드해준다.

 

출처: http://www.makewith.co/page/project/1119/story/2817/

 

 

#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 2    //핀번호 수정
#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); //지우면 OLED에 글씨 안뜸
    display.clearDisplay();   
    display.setCursor(15,20);   display.println("T: "); //hum:를 H로 수정.좌표값수정
    display.setCursor(15,45);  display.println("H: ");   //temp:를 T로 수정. 좌표값수정
    display.setCursor(45,20);   display.println(_t); //좌표값수정
    display.setCursor(45,45);  display.println(_h); //좌표값수정
    display.setCursor(85,20);   display.println(" C"); //삽입
    display.setCursor(85,45);  display.println(" %");   //삽입
    display.display();
  } 

 

▲ 찾은 소스를 살짝 수정하여 업로드해보았다.

 

처음에는 OLED에 글씨가 표시되지 않아 애를 먹었는데

그 원인이 display.setTextColor(WHITE); 이 부분이었다.

텍스트 색을 표시하는 부분인데 내 OLED는 white가 아니니까 굳이 필요없는거 아닌가하여

이부분을 삭제하고 업로드했더니 텍스트가 아예 나타나지 않는 문제가 생긴 것이었다.

OLED 디스플레이가 white가 아니더라도 이부분을 삭제하면 안될듯하다.

 

I2C 주소 0x3C 맞는지 확인하고,

텍스트 사이즈는 display.setTextSize(2); 여기서 수정하면 되는데

나는 2가 적당하여 그대로 두었다.

 

 

▲ 온도와 습도가 정상적으로 잘 출력된다.

 

여기까지 하고 끝내기 아쉬워

또다른 라이브러리인 U8glib 라이브러리를 사용하여 한글을 표시해보기로 했다.

그 부분은 내용이 많아 다음 글에서 이어짐~

 

Comments