본문 바로가기
아두이노/아두이노 IDE

09. 아두이노 IDE DHT11제어 [베이직 트레이닝 보드]

by 땜블리 2023. 3. 7.
728x90
반응형
SMALL

안녕하세요 땜블리 입니다.

아두이노와 베이직 트레이닝 보드를 이용한 DHT11센서를 이용하여 온습도 실습을 진행 하겠습니다.

베이직 트레이닝 보드는 아래에서 확인이 가능합니다.

https://ttcw.tistory.com/4

 

라즈베리파이 피코 베이직 트레이닝보드 구성

라즈베리파이 피코 보드의 펌웨어실습을 위한 베이직 트레이닝보드를 소개 합니다. 현재 네이버 스마트스토어에서 판매가 진행되고 있습니다. 라즈베리파이 피코 베이직 트레이닝 보드 라즈베

ttcw.tistory.com

 

1) DHT11 제어 구동 원리

(1) 동작설명

열지수는 기온과 습도에 따라 사람이 실제로 느끼는 더위를 지수화한 것 이며, 고온이 지속되는 기간 중 사망자 수가 현저하게 증가하는 것에 주목한 미국 기상청(NWS)에서 고온다습한 환경에 대한 대국민 경보를 더욱 효율적으로 제시하여 열파에 미리 대처할 수 있는 체제로 열지수(Heat Index : HI, apparent temperature)를 개발 하였습니다.

 

기상자료개방포털에서 제공하는 열지수는 관측 값을 기반으로 산출되므로, 기상청 홈페이지 (www.kma.go.kr)의 생활과 산업열지수 예보 값과는 차이가 있습니다.

 

열지수를 계산하는 방법?

 

열지수 계산은 Lans P. Rothfusz가 수행하고 1990NWS(National Weather Service) Technical Attachment (SR 90-23)에 설명된 다중 회귀 분석으로 얻은 결과를 개선한 것입니다.

 

Rothfusz의 회귀 방정식은 다음과 같습니다.

 

HI = -42.379 + 2.04901523*T + 10.14333127*RH - .22475541*T*RH - .00683783*T*T - .05481717*RH*RH + .00122874*T*T*RH + .00085282*T*RH* RH - .00000199*T*T*RH*RH

 

여기서 T 는 온도()이고 RH 는 상대 습도(퍼센트)입니다. HI 는 겉보기 온도(화씨온도)로 표현되는 열지수입니다. RH 13% 미만이고 온도가 화씨 80도에서 112도 사이이면 다음 조정이 HI 에서 뺍니다

 

ADJUSTMENT = [(13-RH)/4]*SQRT{[17-ABS(T-95.)]/17}

 

여기서 ABS SQRT 는 각각 절대값과 제곱근 함수입니다. 반면에 RH 85%보다 크고 온도가 화씨 80도에서 87도 사이이면 다음 조정이 HI 에 추가 됩니다 .

 

ADJUSTMENT = [(RH-85)/10] * [(87-T)/5]

 

Rothfusz 회귀는 온도 및 습도 조건이 화씨 약 80도 미만의 열지수 값을 보장할 때 적절하지 않습니다. 이러한 경우에는 Steadman의 결과와 일치하는 값을 계산하기 위해 더 간단한 공식이 적용됩니다.

 

실제로는 간단한 공식이 먼저 계산되고 결과는 온도로 평균화됩니다. 이 열 지수 값이 화씨 80도 이상이면 위에서 설명한 조정과 함께 전체 회귀 방정식이 적용됩니다.

 computeHeatIndex 함수 사용

float DHT::computeHeatIndex(float temperature, float percentHumidity,
                            bool isFahrenheit) {
  float hi;
  if (!isFahrenheit)
    temperature = convertCtoF(temperature);
  hi =0.5* (temperature +61.0+ ((temperature -68.0) *1.2) +
              (percentHumidity *0.094));
  if (hi >79) {
    hi =-42.379+2.04901523* temperature +10.14333127* percentHumidity +
         -0.22475541* temperature * percentHumidity +
         -0.00683783* pow(temperature, 2) +
         -0.05481717* pow(percentHumidity, 2) +
         0.00122874* pow(temperature, 2) * percentHumidity +
         0.00085282* temperature * pow(percentHumidity, 2) +
         -0.00000199* pow(temperature, 2) * pow(percentHumidity, 2);
    if ((percentHumidity <13) && (temperature >=80.0) &&
        (temperature <=112.0))
      hi -= ((13.0- percentHumidity) *0.25) *
            sqrt((17.0- abs(temperature -95.0)) *0.05882);
    elseif ((percentHumidity >85.0) && (temperature >=80.0) &&
             (temperature <=87.0))
      hi += ((percentHumidity -85.0) *0.1) * ((87.0- temperature) *0.2);
  }
  return isFahrenheit ? hi : convertFtoC(hi);
}

DHT11 모양 및 구성

DHT114핀으로 되어있으며 사용하는 핀은 3개입니다.

스팩은 3.3V~5.5V까지 사용할 수 있으며 습도 범위는 5~95%RH 온도는 20~60도 측정됩니다

통신 방식은 1-wired 통신으로 신호핀 하나로 출력과 입력을 모두 사용하는 방식입니다.

MCU에서는 18msTrigger 신호를 Ative Low 로 출력하게 되면 보내주시면 이후부터는 40bit의 데이터가 입력이 됩니다.

 

입력되는 신호의 01의 구분은 Pulse width로 결정을 합니다. 1개의 구형파 주기에서 high 구간이 26~28 us라면 0으로 인식하고 70us라면 1로 인식합니다.

 

습도 센싱 원리

습도 감지 구성 요소에는 수분 보유 기판이 사이에 끼인 두 개의 전극이 있습니다.

이온은 수증기가 기판에 흡수됨에 따라 기판에서 방출되며, 이는 다시 전극 사이의 전도도를 증가시킵니다.

두 전극 사이의 저항 변화는 상대 습도에 비례합니다.

상대 습도가 높으면 전극 사이의 저항이 감소하고 상대 습도가 낮으면 전극 사이의 저항이 증가합니다.

반응형

 

온도 측정 원리

DHT11에는 온도를 측정하기 위한 NTC/서미스터도 포함되어 있습니다. 서미스터는 온도에 따라 저항이 크게 변하는 열 저항기입니다. "NTC"라는 용어는 "음의 온도 계수"를 의미하며 온도가 증가함에 따라 저항이 감소한다는 의미입니다.

 

(2) 연결방법

 

연결표

 

(3) 코드작성

#include"DHT.h"
#define DHTPIN 4     // Digital pin connected to the DHT sensor
// Uncomment whatever type you're using!
#define DHTTYPE DHT11   // DHT 11
//#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
DHT dht(DHTPIN, DHTTYPE);
void setup() {
  Serial.begin(115200);
  Serial.println(F("DHTxx test!"));
  dht.begin();
}
void loop() {
  
  delay(2000);
  
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  float f = dht.readTemperature(true);
  
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println(F("Failed to read from DHT sensor!"));
    return;
  }
 
  float hif = dht.computeHeatIndex(f, h);
 
  float hic = dht.computeHeatIndex(t, h, false);
  Serial.print(F("Humidity: "));
  Serial.print(h);
  Serial.print(F("%  Temperature: "));
  Serial.print(t);
  Serial.print(F("°C "));
  Serial.print(f);
  Serial.print(F("°F  Heat index: "));
  Serial.print(hic);
  Serial.print(F("°C "));
  Serial.print(hif);
  Serial.println(F("°F"));
}

 

(4) 동작결과

 

728x90
반응형
LIST

댓글