DHT11 온습도 센서를 이용하여 온도와 습도를 측정해 보자

image
아두이노와 라즈베리파일를 이용한 소규모 IOT환경을 꾸미려는 사람들은
아마도 주변의 어떤 상태를 센서를 이용하여 측정하고
서버의 DB에 저장하여 필요할때 꺼내어 이용할 수 있도록 하길 원할 것으로 생각됩니다.
우리가 측정할 수 있는 주변 환경은 무수히 많습니다.
온도, 습도, 일조량, 진동, 움직임 등등 구글에서 아두이노 센서에 대해서 검색해 보면 수많은 센서들이 있음을 알 수 있습니다.
계측에 대해서 체계적으로 배우는 것은 매우 중요하지만 고된일입니다.
따라서 이러한 고된일이 우리의 흥미를 앗아가기 전에
우선 간단한 온습도 센서를 이용하여 아두이노에서 온습도를 측정하는 것을 해보겠습니다.
오늘 사용할 센서는 DHT11이라는 온도, 습도 센서 입니다.
구글에 DHT11에 대한 datasheet를 손쉽게 찾을 수 있습니다.
DHT11 datasheet.pdf
소자들을 다루기 전에 항상 datasheet를 살펴보는 습관을 가지는 것이 좋습니다.
DHT11 센서는 16bit 디지털 센서로서 인터베이스는 Vcc, signal, Gnd로 이루어져 있습니다.

연결방법은 다음과 같습니다.
아두이노
DHT11
5V
Vcc
GND
GND
Pin #2
Signal
image

DHT11을 이용한 아두이노 스케치를 작성하기 위해서는 DHT11 라이브러리가 필요합니다.
DHT11 Library
일반적으로 라이브러리에는 라이브러리 사용법을 익힐 수 있는 예제가 포함어 있습니다.
DHT11 라이브러리도 examples 폴더에 예제가 포함되어 있습니다.
포함된 예제 DHT11_test_YD를 아누이노IDE로 열러 아두이노에 업로드 합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/* YourDuino.com Example Software Sketch
   DHT11 Humidity and Temperature Sensor test
   Credits: Rob Tillaart
   http://arduino-direct.com/sunshop/index.php?l=product_detail&p=162
   terry@yourduino.com */
  
/*-----( Import needed libraries )-----*/
#include <dht11.h>

/*-----( Declare objects )-----*/
dht11 DHT11;

/*-----( Declare Constants, Pin Numbers )-----*/
#define DHT11PIN 2

void setup()   /*----( SETUP: RUNS ONCE )----*/
{
  Serial.begin(9600);
  Serial.println("DHT11 TEST PROGRAM ");
  Serial.print("LIBRARY VERSION: ");
  Serial.println(DHT11LIB_VERSION);
  Serial.println();
}/*--(end setup )---*/

void loop()   /*----( LOOP: RUNS CONSTANTLY )----*/
{
  Serial.println("\n");

  int chk = DHT11.read(DHT11PIN);

  Serial.print("Read sensor: ");
  switch (chk)
  {
    case 0: Serial.println("OK"); break;
    case -1: Serial.println("Checksum error"); break;
    case -2: Serial.println("Time out error"); break;
    default: Serial.println("Unknown error"); break;
  }

  Serial.print("Humidity (%): ");
  Serial.println((float)DHT11.humidity, 2);

  Serial.print("Temperature (oC): ");
  Serial.println((float)DHT11.temperature, 2);

  Serial.print("Temperature (oF): ");
  Serial.println(Fahrenheit(DHT11.temperature), 2);

  Serial.print("Temperature (K): ");
  Serial.println(Kelvin(DHT11.temperature), 2);

  Serial.print("Dew Point (oC): ");
  Serial.println(dewPoint(DHT11.temperature, DHT11.humidity));

  Serial.print("Dew PointFast (oC): ");
  Serial.println(dewPointFast(DHT11.temperature, DHT11.humidity));

  delay(2000);
}/* --(end main loop )-- */

/*-----( Declare User-written Functions )-----*/
//
//Celsius to Fahrenheit conversion
double Fahrenheit(double celsius)
{
    return 1.8 * celsius + 32;
}

//Celsius to Kelvin conversion
double Kelvin(double celsius)
{
    return celsius + 273.15;
}

// dewPoint function NOAA
// reference: http://wahiduddin.net/calc/density_algorithms.htm
double dewPoint(double celsius, double humidity)
{
    double A0= 373.15/(273.15 + celsius);
    double SUM = -7.90298 * (A0-1);
    SUM += 5.02808 * log10(A0);
    SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ;
    SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ;
    SUM += log10(1013.246);
    double VP = pow(10, SUM-3) * humidity;
    double T = log(VP/0.61078);   // temp var
    return (241.88 * T) / (17.558-T);
}

// delta max = 0.6544 wrt dewPoint()
// 5x faster than dewPoint()
// reference: http://en.wikipedia.org/wiki/Dew_point
double dewPointFast(double celsius, double humidity)
{
    double a = 17.271;
    double b = 237.7;
    double temp = (a * celsius) / (b + celsius) + log(humidity/100);
    double Td = (b * temp) / (a - temp);
    return Td;
}

/* ( THE END ) */


cs
업로드가 정상적으로 완료되었으면 아두이노 IDE의 시리얼 모니터를 열어 측정되는 신호를 확인해 보겠습니다.
우측하단에 line Ending 없음과 9600 보드레이트를 선택하면 아래와 같은 온도 습도의 측정값을 볼수 있습니다.

image
Previous
Next Post »