본문 바로가기

아두이노 수경재배

아두이노로 만드는 수경재배 장치; 4. 온도, 습도계 v 1.0

아두이노로 만드는 수경재배 장치 목차

1. 아두이노 시작하기

2. 아두이노 IDE

3. 첫 번째 아두이노 개발

4. 온도, 습도계 v 1.0

5. 온도, 습도계 v 2.0

6. 조도계 (광센서)

7. 시간 지연 릴레이 (자동 스위치)

8. 와이파이 연결 (ESP 01) - 1

9. 와이파이 연결 (ESP 01) - 2

 

이제 아두이노로 Blink도 만들어 봤으니 본격적으로 수경재배에 필요한 센서를 연결해 보려고 한다. 얼마 전에 씨를 뿌리고 잎이 나기 시작했는데 아직은 추운지 온도가 조금만 떨어져도 새싹이 오무러들고 자라질 않는다. 그래서 온도, 습도를 측정할 수 있는 장치를 아두이노로 제작해 보기로 했다.

1. DHT11, DHT22 비교

저렴하고 가장 많이 쓰이는 온도 습도 센서가 DHT11과 DHT22이다. 차이점을 살펴보면,

 

  • 측정 온도 범위

- DHT11: -20 to 60℃

- DHT22: -40 to 80℃

 

  • 온도 정확도

- DHT11: ±2%

- DHT22: ±0.5%

 

  • 습도 측정 범위

- DHT11: 5 to 95% RH

- DHT22: 0 to 100%RH

 

  • 습도 정확도

- DHT11: ±5%

- DHT22: ±2%

 

  • 최소 샘플링 주기

- DHT11: 1초

- DHT22: 2초

 

이며, 초당 1번 이상 측정해야 할 일이 없으면 DHT22로 사용하는 것이 좋아 보인다. 가격은 좀 더 비싸긴 하지만 여전히 저렴한 수준이다.

2. 회로 구성 1차

DHT22를 직접 연결할 경우 구성도는 아래와 같다. 패키지된 제품을 사용하면 회로 보호를 할 수 있는 저항이 포함되어 있고 브레드보드에 안정적으로 장착할 수 있어 나는 패키지된 제품을 구매했다.

 

이 회로를 아두이노 UNO와 프로토타입 쉴드 위에 구현하면 아래와 같다.

 

3. 스케치 프로그램 1차

나는 dht22를 사용하기 위해 아두이노 IDE의 Library Manager에서 dht로 검색해서 나온 library 중에 DHTlib를 설치했다. 아두이노의 좋은 점은 센서를 연결하기 위한 프로그램이 모두 오픈소스로 공개되어 있다는 점이다. More info로 연결되는 GitHub사이트에서 dht22 example을 복사하여 실행해 보자.

 

GitHub - RobTillaart/DHTlib: Arduino library for DHT temperature and humidity sensor. AVR optimized

Arduino library for DHT temperature and humidity sensor. AVR optimized - GitHub - RobTillaart/DHTlib: Arduino library for DHT temperature and humidity sensor. AVR optimized

github.com

편의상 examples 폴너 밑에 dht22_in_function의 스케치 프로그램을 아래에 복사해 보았다. 스케치 프로그램에서 사용하는 핀이 마침 8번이어서 핀번호는 수정할 필요는 없는데, 어느 숫자가 온도인지 어느 숫자가 습도인지 구분하기 위해 Serial.print()문 내부에 "temp = ", 와 "hum = "을 각각 추가했다.

 

#include "dht.h"

#define DHTPIN 8


void printDHT(const uint8_t pin)   // uint8_t is an 8 bit unsigned integer
{
  // This command questions a DHT22 on a specific 'pin'.
  // on success, it prints  "OK;{temperature};{humidity};"
  // on error,   it prints  "ERR;DHTt;{errorCode};".
  //
  //    param 'pin': int
  //        The pin, where the DHT22 is connected.

  dht DHT;

  int chk = DHT.read22(pin);
  if (chk == DHTLIB_OK)
  {
    Serial.print("OK; temp = ");
    Serial.print(DHT.temperature);
    Serial.print("; hum = ");
    Serial.print(DHT.humidity);
    Serial.println(";");
    return;
  }

  Serial.print("ERR;DHTt;");
  switch (chk)
  {
    case DHTLIB_ERROR_CHECKSUM:
      Serial.println("CHSM;");
      break;
    case DHTLIB_ERROR_TIMEOUT:
      Serial.println("TIMO");
      break;
    case DHTLIB_ERROR_CONNECT:
      Serial.println("NCNN");
      break;
    case DHTLIB_ERROR_ACK_L:
      Serial.println("ACKL");
      break;
    case DHTLIB_ERROR_ACK_H:
      Serial.println("ACKH");
      break;
    default:
      Serial.println("UNKN");
      break;
  }
}


void setup()
{
  Serial.begin(115200);
  Serial.println("\n");
}


void loop()
{
  static uint32_t lastTime = 0;     // holds its value after every iteration of loop
  if (millis() - lastTime >= 2000)  // print every 2000 milliseconds
  {
    lastTime = millis();
    printDHT(DHTPIN);
  }

  // add your other code here
}

 

Serial Monitor를 사용하면 다음과 같은 결과를 볼 수 있다.

 

이제 컴퓨터로 내 방의 온도와 습도를 볼 수 있게 되었다. 다음 에는 조금 더 개선해서 컴퓨터로 연결하지 않고도 온도와 습도를 확인할 수 있도록 lcd를 연결해 보겠다.