본문 바로가기
Arduino/Arduinio기초 실습

14장. 온습도 센서 모듈 실습

by sinki 2022. 4. 16.

실습은 개인 학습을 위해 "주) 엘케이 임베디드" 사이트에서 구매한 아두이노 코딩 배우기 고급 키트를 이용한 학습입니다. 동봉된 책을 기반으로 학습하면서 개인적인 궁금증과 추가 필요한 부분을 정리한 블로그임을 미리 알려드립니다.

 

< 준비물 >

아두이노 우노 : 1개

USB 케이블  : 1개 

점퍼 케이블(숫숫) : 3개

브레드 보드 : 1개, 830홀 사용

 온습도 센서 모듈 : 1개

이번 실습 연결도 및 회로도입니다. 참조하세요 

 

< 참고 지식 >

⦿ 온습도 센서 모듈 동작원리(DHT-11, DHT-22)

  - 동작원리(습도): 비교적 저가인 저항 감지 방식을 이용 주 전극 사이에 공기 중의 수분을 통해 아부 미세하게 전류가 흐르게 되는 원리를.

         이용 전기가 많이 흐르면 습도가 높은것이고 작게 흐르면 습도가 낮은 것을 이용 습도를 측정함

  - 동작원리(온도): 물질의 저항 값이 온도에 따라 변화되는 성질을 이용한 것    

 - 아래 특성에서 알수 있지만 DHT-22가 정확도 및 측정 범위 등에서 성능이 유수하고 가격이 고가임 

⦿ 온습도 센서 모듈 특성(DHT-11, DHT-22)

 - 동작 전압 : 3.3V ~ 5.5V

 - 온도 측정 범위    = DHT-11 : 0℃ ~ 50℃ / DHT-22 : -40℃ ~ 80℃

 - 온도 측정 분해도 = DHT-11 : 1℃              /  DHT-22 : 0.1℃

 - 온도 측정 정밀도 = DHT-11 : ± 2℃          /  DHT-22 : ± 0.5℃

 - 습도 측정 범위    = DHT-11 : 20% ~ 90℃ RH / DHT-22 : 0% ~ 100% RH  ✼ RH: 상대 습도

 - 습도 측정 분해도 = DHT-11 : 1% RH        /  DHT-22 : 0.1% RH

 - 습도 측정 정밀도 = DHT-11 : ± 2% RH     /  DHT-22 : ± 0.5% RH

센서의 색깔로 구분이 가능함

 

< 실습 코드 >

#include <Wire.h>
char HUMI_Sensor = 3; //A0에 센서연결
byte dht11_dat[5];   //센서변수
byte dht11_in;       //센서변수
byte i;
byte read_dht11_dat()  //습온센서값 읽어오는 함수
{
  byte i = 0;          //for문 변수
  byte result = 0;     //리턴변수
  for (i = 0; i < 8; i++) //for문 9번 반복
  {
    while (!digitalRead(HUMI_Sensor));  //센서값이 1이 될때까지 무한루프
    delayMicroseconds(30);              //30마이크로세크 대기
    if (digitalRead(HUMI_Sensor) != 0 ) //만약 샌서값이 0과 같지 않으면
      bitSet(result, 7 - i);            //bitSet(n,x) n이라는 변수에 x번째의 비트를 on한다
    while (digitalRead(HUMI_Sensor));  //센서값이 0이 될때까지 무한루프
  }
  return result;                       //result의 값을 리턴한다.
}
void setup()
{
  Serial.begin(9600);

  pinMode(HUMI_Sensor, OUTPUT);           //센서핀을 출력으로 설정한다.
  digitalWrite(HUMI_Sensor, HIGH);        //센서에 출력을 넣는다
}
void loop()
{
  digitalWrite(HUMI_Sensor, LOW);//센서핀을 off한다
  delay(18);                     //18ms만큼 지연
  digitalWrite(HUMI_Sensor, HIGH);//센서핀을 on한다
  delayMicroseconds(5);            //5us만큼 지연
  pinMode(HUMI_Sensor, INPUT);    //센서핀을 입력으로 설정한다
  delayMicroseconds(200);         //200us만큼 지연
  for (i = 0; i < 5; i++) {
    dht11_dat[i] = read_dht11_dat();
  }
  //40bit의 데이터를 수신 자세한 사항은 DHT11의 데이터시트를 참고
  pinMode(HUMI_Sensor, OUTPUT);    //센서핀을 출력으로 설정한다
  digitalWrite(HUMI_Sensor, HIGH); //센서에 출력을 넣는다
  byte dht11_check_sum = dht11_dat[0] + dht11_dat[2]; // check check_sum
  Serial.print(dht11_dat[0], DEC);   // LCD에 습도값 출력
  Serial.println('%');                  // LCD에 % 출력
  Serial.print(dht11_dat[2], DEC);    // LCD에 온도값 출력
  Serial.println('c');                  // LCD에 C 출력
  delay(2000); //2초간 지연
}