온도는 쉽게 이해하지만, 습도는 약간 공부를 해야 한다.

위키(http://ko.wikipedia.org/wiki/%EC%8A%B5%EB%8F%84) 에 따르면 다음과 같이 상대습도를 설명하고 있다.

상대습도는, 특정한 온도대기 중에 포함되어 있는 수증기의 압력을 그 온도의 포화 수증기 압력으로 나눈 것을 말한다. 다시 말해, 특정한 온도의 대기 중에 포함되어 있는 수증기의 양(중량 절대습도)을 그 온도의 포화 수증기량(중량 절대습도)으로 나눈 것이다.

상대습도 100%로, 대기 중의 수증기량이 포화되어, 결로 현상을 일으킨다. 또 그때의 온도를 이슬점 온도라고 한다.

 RH = {p_{(H_2O)} \over p^*_{(H_2O)}} \times 100%

 

HIH-4030  센서는 상대습도를 체크하는 센서이기 때문이다. 따라서 수증기의 양과 온도를 가지고 측정하는 센서이다. 생긴 것은 아래와 같이 생겼다.

 

 

습도 센서 HIH-4030은 5V에서 최적화되어 동작한다. 
(http://www.sparkfun.com/datasheets/Sensors/Weather/SEN-09569-HIH-4030-datasheet.pdf)

특별히 저항을 넣지 않고 바로 쓸 수 있다.

image

(http://www.sparkfun.com/datasheets/Sensors/Weather/HIH-4030_Breakout-v10.pdf)

이 센서는 상대 습도 (Relative Humidity %RH)를 측정하고 analog output pin(위의 그림으로 OUT)으로 voltage 값을 던진다. 아두이노에서는 이 analog output pin의 값을 읽어 처리하면 된다.  오차는 +-3.5이다. -40~85 도에서 측정가능하다.

상대습도는 공기 중에 포함되어 있는 수증의 양 또는 비율을 나타낸다. (http://ko.wikipedia.org/wiki/%EC%8A%B5%EB%8F%84) 이 값을 측정하는 법이 hih 4030 datasheet에 잘 나와 있다. (http://www.sparkfun.com/datasheets/Sensors/Weather/SEN-09569-HIH-4030-datasheet.pdf)

 

image

표에 보면, 두가지 값이 나온다.

Voltage output 과 Temperature compensation 이다. 이 공식을 잘 봐둔다.

 

센서의 달인이 아닌 관계로 누군가의 글을 참조해야 했다.

일본사람의 블로그를 참조(http://www.eleki-jack.com/FC/2011/04/arduinohih4030.html) 하여 정리해본다.

 

(첫번째: Voltage output)

Vout =(Vsupply)0.0062(sensorRH) + 0.16)

sensorRH 값을  좌항으로 옮기는 식을 만드면 다음과 같다.

sensorRH =(Vout/Vsupply)×(1/0.0062)- 0.16 ×(1/0.0062)  ---- (1)

Vout/Vsupply (전원대비 출력전압) 에 대해서 1/0.0062 기울기를 가진다고 볼 수 있다.

 

(두번째 : Temperature compensation)

공식를 그대로 적어본다. T 는 섭씨 온도이다. 즉 온도가 필요한 것이다.

RH= sensorRH /(1.0546 - 0.00216 × T)  -- (2)

 

참고로 센서의 출력 전압은 다음 공식이다.

Vout = Vsupply × (아날로그 입력 값 /1024)

다음 식으로 치환이 된다.

Vout / Vsupply = (아날로그 입력 값 / 1024)

 

위의 식을 (1) 식에 적용해 본다.

sensorRH =(Vout/Vsupply)×(1/0.0062)- 0.16 ×(1/0.0062)

Vout / Vsupply = (아날로그 입력 값 / 1024)

 

SensorRH의 값은 다음의 값을 가지게 된다.

SensorRH = (아날로그 입력 값/1024)  X (1/0.0062) – 0.16 X (1/0.0062)

 

테스트를 시작해 본다. 

아래와 같이 셋팅한다.

image

 

코드를 업로드 한다.


float vdd = 5.0;
int indata;
float sRH;

void setup() {
  Serial.begin(9600);
}

void loop() {
  indata = analogRead(0);
  sRH = (indata/1024.0)/0.0062-0.16/0.0062;
  Serial.println(sRH);
  delay(1000);
}

 

Serial Monitor 창을 열어 sensor RH 값을 얻는다.

image

 

이제 진짜 RH를 구해야 할 차례이다.

 

이번에는 온도를 이용해서 다른 식을 구해야 한다. 이번에 습도 센서 공식 2를  다시 작성한다.

sensorRH 값과 T 온도 값을 넣어야 실제 습도를 체크할 수 있다.

RH= sensorRH /(1.0546 - 0.00216 × T) 

 

이미 sensor RH를 구했으니 T만 구하면 된다.

 

온도 센서는 TMP 36을 이용한다.

 

(이미지 : http://www.ladyada.net/learn/sensors/tmp36.html)

 

OUT를 analog port 1로 연결한다.

 

 

이것을 보드에 잘 연결한다.  (선이 개판이긴 하지만..)

image

 

온도 T를 구하기 위해서는 TMP 36 data sheet 과 TMP 36 튜터리얼 을 이용한다.

 

data sheet에 나와 있는 자료를 본다 .(http://www.analog.com/static/imported-files/data_sheets/TMP35_36_37.pdf)

image

The TMP36 is specified from −40°C to +125°C, provides a 750 mV output at 25°C, and operates to 125°C from a single 2.7 V supply. The TMP36 is functionally compatible with the LM50. Both the TMP35 and TMP36 have an output scale factor of 10 mV/°C.

 

그 다음은 튜터리얼(http://www.ladyada.net/learn/sensors/tmp36.html)을 참조했다.

 

먼저 Voltage를 구하고, 섭씨 온도를 구한다.

Voltage at pin in milliVolts = (reading from ADC) * (5V/1024)  ----- (1)

Centigrade temperature = [(analog voltage in mV) – 0.5] / 10 –---- (2)

 

이제 온도 T를 구하는 공식은 다음과 같다.

 

T = ((input * 5 / 1024) – 0.5 ) / 10

 

그렇다면, 위의 T 값을 구하면 RH를 구할 수 있다.


RH= sensorRH /(1.0546 - 0.00216 × T) 

 

이를 코드로 하면 다음과 같다.

 

float vdd = 5.0;
int indata0, indata1;
float sRH;
float RH;
float voltage;
float temperatureC;

void setup() {
  Serial.begin(9600);
}

void loop() {
  indata0 = analogRead(0);
  sRH = (indata0/1024.0)/0.0062-0.16/0.0062;

  indata1 = analogRead(1);
  voltage = indata1*5.0/1024.0;
  temperatureC = (voltage - 0.5) * 100;
  Serial.print(temperatureC); Serial.println(" 'C");
 
  RH=sRH/(1.0546-0.00216*temperatureC);
  Serial.print(RH);
  Serial.println(" RH");
  Serial.println("----");
  delay(1000);
}


온도와 습도 값이 잘 나온다.

image

 

상대 습도이니. 만약 HIH-4030 센서에 입김을 불면 확실히 값이 달라지게 나와야 할 것이다.

지금 온도가 23.73 C 이고, 20.43 습도를 가지고 있는데, 입김을 부니, 온도와 습도의 값이 올라간다.

image

 

 

5초에 한번씩 테스트할 때, 온도 센서인 tmp 36의 상태를 보면, 조금씩 튀는 것이 보인다. 아마도 센서이다 보니 오차가 있을 수 있다. 온도가 바뀌면 자연스럽게 상대 습도에도 영향이 받는다. 그래서 빛&감열 센서를 이용하면 좀더 정확한 값을 얻을 수 있다고 튜터리얼에 적혀 있다. (http://www.ladyada.net/learn/sensors/tmp36.html)

 

아래 그림을 참조했다.

 

온도센서 근처에 빛&감열 센서 와 저항 10k를 달고 analog 3번 input으로 받도록 했다. 그리고, 전원을 aref input으로 넣게 했다. 이렇게  하면 정확한 volt 값을 알 수 있다고 한다. 해봤는데. 크게 차이가 나지 않는다.

 

image

 

상대 습도계는 기본적으로 오차가 거의 없는 좋은 온도 센서가 있어야 습도 값을 구할 수 있다. 그래서 온도계를 잘 만드는 회사가 습도계를 잘 만드는 것 같다. 선물용으로 주는 이름없는 브랜드를 까보니. 온도센서의 값이 100원짜리다.. 온도 센서의 값어치를 잘 알아야 할 것 같다는 생각을 하게 되었다.

 

마치며…

별 것은 없지만, 생각보다 많은 시간이 소요되었다. 센서에 대한 이해라든가, 수치에 대한 이해라든가.. 이 부분에 대해서 깊은 내공이 쌓여야 할 것 같다.

다음은 온도와 습도의 값을 읽어 자바 언어를 이용해서 MRTG로 만들려고 한다. 이를 통해서 내가 있는 곳의온도/습도의 추이를 보려고 하려고 한다.

Posted by 김용환 '김용환'

댓글을 달아 주세요

  1. ds 2012.11.13 14:47  댓글주소  수정/삭제  댓글쓰기

    대박이네여 ~~ 와

  2. 1 2013.09.29 19:34  댓글주소  수정/삭제  댓글쓰기

    온습도 모니터링도 되니요? 부럽습니다..

  3. 아두이노 2013.10.18 01:53  댓글주소  수정/삭제  댓글쓰기

    블로그 잘 보고 갑니다...초보에게 많은 도움이 되네요

  4. dht11 2013.10.26 03:58  댓글주소  수정/삭제  댓글쓰기

    온도를 SD Card가 아닌 PC에 자동 저장도 되나요?