Arduino/Arduinio기초 실습

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

sinki 2022. 4. 16. 18:45

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

 

< 준비물 >

아두이노 우노 : 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초간 지연
}