아두이노

[아두이노]온습도 측정(DHT11)을 통해 PMV(쾌적성 지표) 계산하기 [2편]

알까 2022. 5. 24. 22:56

https://catch-sin.tistory.com/9

 

[아두이노]온습도 측정 결과값 도출하기.(DHT11센서 이용)[1편]

최근 아두이노를 이용한 프로젝트를 진행하였습니다. 전자공학과는 아니었지만 평소 IOT에 관해 관심이 많았기 때문에 아두이노를 프로젝트 주제로 선정했습니다만, (사실 좀 후회됩니다... 하

catch-sin.tistory.com

앞서 온습도 측정(DHT11 센서를 이용)을 위한 회로를 구성하고 값을 도출해 보았습니다.

이번에는 센서를 통해 받아들인 온도와 습도를 이용해 PMV를 계산하는 코드를 작성해보도록 하겠습니다.

 

1. PMV란 무엇인가

 

PMV( Predicted Mean Vote) 는 쾌적성 지표를 의미합니다.

PMV
-3 -2 -1 0 1 2 3
매우춥다 춥다 조금춥다 쾌적하다 조금덥다 덥다 매우덥다

이렇게 나타낼 수 있습니다.

 

PMV를 계산하면서 쾌적성을 판단하고자 했습니다.

특정 온도와 습도를 통해 쾌적성을 판단하면 전자기기를 통해 온열기구나 냉방기구를 자동제어할 수 있습니다.

 

이는 실내 환경에 쾌적성을 제공해줄 것이고, 적극적 IOT 활용 방법이라고 생각했습니다.

서론은 여기까지 하고 PMV를 어떻게 계산하는 지 알아보고자 합니다.

 

2. PMV 계산하기 

 

ISO 7730 PMV 계산 식

네. 머리가 아픕니다.

그래도 하나씩 차근차근 구해보도록 하겠습니다.

 

먼저 PMV를 구성하는 변수를 알아보겠습니다.

M : 인체대사율 (단위 W/m2)

W : 유효 기계력

Pa : 수증기 분압(단위 Pa)

Ta : 공기온도

Tr : 복사온도

Fcl : 착의 표면적지수

Tcl : 의복 표면온도

hc : 대류 열전달 계수


이제 차근차근 구하면 되나..

수식의 간편함을 위해 몇 가지 가정을 설정하였습니다.

 

첫째, 공기온도(Ta) = 복사온도(벽체온도)(Tr)

복사온도를 측정할 수 없으므로 공기온도와 복사온도를 같게 보았습니다.

이로 인한 오차는 감안하고 PMV를 계산하였습니다.

 

둘째, 대류열전달 계수(hc)는 4.3(W/(m2*K))으로 두었습니다.

관련 학술지를 통해 실내 대류 열전달 계수에 관한 실험결과를 본 결과 대략적인 평균값인 4.3(W/(m2*K))을 가져왔습니다.

 

셋째, 유효기계력(W)은 0으로 두고 계산하였습니다.

평상시 상황에서 유효 기계력이 PMV에 미치는 영향이 미미하므로  W는 무시했습니다.

 

넷째, 여름복장을 착용하고 있으며 앉아있고 조용한 상황입니다.

 

다섯째, 대기압은 1기압으로 760mmHg로 가정합니다.


위 가정을 바탕으로 수식을 계산하였습니다.

 

M(인체대사율)의 경우

인체대사율
인체대사율 단위변환

네번째 가정을 통해 앉아있고 조용한 상황으로 가정하였습니다.

따라서 1met 으로 58.2W/m2으로 가정하였습니다.

 

pa(수증기 분압)의 경우

(WMO,2008)에서 얻은 공식을 통해 다음과 같이 정의할 수 있습니다.

수증기 분압구하는 공식

다섯번째 가정을 통해 대기압은 1기압으로 760mmHg로 가정합니다.

위 수식을 통해 pa(수증기 분압)을 상대습도(%)를 이용하여 구할  수 있습니다.

 

상대습도를 이용한 이유는 DHT11센서가 상대습도를 이용해 습도를 측정하기 때문입니다.

 

Ta(공기온도)=Tr(복사온도)의 경우

첫번째 가정을 통해 같다고 놓았습니다.

따라서, DHT11을 통해 측정되는 온도값을 대입하면 출력가능합니다.

 

Fcl의 경우 Icl을 구하면 값을 도출할 수 있습니다.

Fcl 구하는 공식

여기서 Icl은

Icl 구하기

Icl 중에서 이 글을 쓰고있는 지금은 여름이므로 0.43clo, 0.07(m2*K/W )로 Icl값을 도출하였습니다.

 

위 식을 통해 fcl의 값을 도출한 결과 1.0903이 나왔습니다.

 

Tcl을 구하는 과정이 가장 복잡합니다.

 

tcl을 구하는 과정

변수가 들어가는 것을 제외하더라도 양 변에 tcl이라는 변수가 존재하는데다 4승값이 존재하므로 계산이 매우 복잡합니다.

이러한 이유로 MATLAB을 이용하여 수식을 계산하였습니다.

 

temperature-tcl 곡선과 근사식

근사식 : tcl=0.0008144*temperature^2+0.3488*temperature+21.24

 

 tcl을 구하는 과정에서 가장 중요하게 다뤄졌던 것은 다름아닌 두가지 변수 중 하나의 변수로 정리하는 것이었습니다.

변수 2개를 어떻게 하나로 정리하는가 고민하다가

우연히 MATLAB syms 함수와  solve함수를 알게되었습니다.

이를 통해 tcl에 관한 식을 구할 수 있었습니다.

 

MATLAB 코드 //변수가 2개인 경우 한 변수로 정리하기(syms와 solve이용)

syms
temperature tcl

f = 35.7 - 0.028*58.2-0.07*(3.96*10^(-8)*1.0903*((tcl+273)^(4)-(temperature+273)^(4))+1.0903*4.3*(tcl-temperature))-tcl == 0

solve(f, tcl, 'MaxDegree', 4)

 

MATLAB 코드

temperature = linspace(0,50,1000); //0~50 사이에 값 1000개 생성

tcl=(12.*(temperature.^4 + 1092.*temperature.^3 + 447174.*temperature.^2 + (1239479581426061634964780.*temperature)./6524554514572859 + 22313924732791327694274480771./163113862864321475).*(9.*((3.^(1./2).*(256.*(temperature.^4 + 1092.*temperature.^3 + 447174.*temperature.^2 + (1239479581426061634964780.*temperature)./6524554514572859 + 22313924732791327694274480771./163113862864321475).^3 + 4381578189252799877301610160641201301855261413399354587070753381634342264518545298665964428712269053952./4351065454829322990705340748373879653187993475965978292179863908561).^(1./2))./18 + 201420377367850759052042247582424574468966515212288./2085920769068020711504961752260169).^(2./3) - (14873754977112739619577360.*temperature)./6524554514572859 - 5366088.*temperature.^2 - 13104.*temperature.^3 - 12.*temperature.^4 - 267767096793495932331293769252./163113862864321475).^(1./2) + (60212679666506403233660928.*6.^(1./2).*(3.*3.^(1./2).*(256.*(temperature.^4 + 1092.*temperature.^3 + 447174.*temperature.^2 + (1239479581426061634964780.*temperature)./6524554514572859 + 22313924732791327694274480771./163113862864321475).^3 + 4381578189252799877301610160641201301855261413399354587070753381634342264518545298665964428712269053952./4351065454829322990705340748373879653187993475965978292179863908561).^(1./2) + 10876700377863940988810281369450927021324191821463552./2085920769068020711504961752260169).^(1./2))./45671881602010013 - 9.*((3.^(1./2).*(256.*(temperature.^4 + 1092.*temperature.^3 + 447174.*temperature.^2 + (1239479581426061634964780.*temperature)./6524554514572859 + 22313924732791327694274480771./163113862864321475).^3 + 4381578189252799877301610160641201301855261413399354587070753381634342264518545298665964428712269053952./4351065454829322990705340748373879653187993475965978292179863908561).^(1./2))./18 + 201420377367850759052042247582424574468966515212288./2085920769068020711504961752260169).^(2./3).*(9.*((3.^(1./2).*(256.*(temperature.^4 + 1092.*temperature.^3 + 447174.*temperature.^2 + (1239479581426061634964780.*temperature)./6524554514572859 + 22313924732791327694274480771./163113862864321475).^3 + 4381578189252799877301610160641201301855261413399354587070753381634342264518545298665964428712269053952./4351065454829322990705340748373879653187993475965978292179863908561).^(1./2))./18 + 201420377367850759052042247582424574468966515212288./2085920769068020711504961752260169).^(2./3) - (14873754977112739619577360.*temperature)./6524554514572859 - 5366088.*temperature.^2 - 13104.*temperature.^3 - 12.*temperature.^4 - 267767096793495932331293769252./163113862864321475).^(1./2)).^(1./2)./(6.*((3.^(1./2).*(256.*(temperature.^4 + 1092.*temperature.^3 + 447174.*temperature.^2 + (1239479581426061634964780.*temperature)./6524554514572859 + 22313924732791327694274480771./163113862864321475).^3 + 4381578189252799877301610160641201301855261413399354587070753381634342264518545298665964428712269053952./4351065454829322990705340748373879653187993475965978292179863908561).^(1./2))./18 + 201420377367850759052042247582424574468966515212288./2085920769068020711504961752260169).^(1./6).*(9.*((3.^(1./2).*(256.*(temperature.^4 + 1092.*temperature.^3 + 447174.*temperature.^2 + (1239479581426061634964780.*temperature)./6524554514572859 + 22313924732791327694274480771./163113862864321475).^3 + 4381578189252799877301610160641201301855261413399354587070753381634342264518545298665964428712269053952./4351065454829322990705340748373879653187993475965978292179863908561).^(1./2))./18 + 201420377367850759052042247582424574468966515212288./2085920769068020711504961752260169).^(2./3) - (14873754977112739619577360.*temperature)./6524554514572859 - 5366088.*temperature.^2 - 13104.*temperature.^3 - 12.*temperature.^4 - 267767096793495932331293769252./163113862864321475).^(1./4)) - (9.*((3.^(1./2).*(256.*(temperature.^4 + 1092.*temperature.^3 + 447174.*temperature.^2 + (1239479581426061634964780.*temperature)./6524554514572859 + 22313924732791327694274480771./163113862864321475).^3 + 4381578189252799877301610160641201301855261413399354587070753381634342264518545298665964428712269053952./4351065454829322990705340748373879653187993475965978292179863908561).^(1./2))./18 + 201420377367850759052042247582424574468966515212288./2085920769068020711504961752260169).^(2./3) - (14873754977112739619577360.*temperature)./6524554514572859 - 5366088.*temperature.^2 - 13104.*temperature.^3 - 12.*temperature.^4 - 267767096793495932331293769252./163113862864321475).^(1./2)./(6.*((3.^(1./2).*(256.*(temperature.^4 + 1092.*temperature.^3 + 447174.*temperature.^2 + (1239479581426061634964780.*temperature)./6524554514572859 + 22313924732791327694274480771./163113862864321475).^3 + 4381578189252799877301610160641201301855261413399354587070753381634342264518545298665964428712269053952./4351065454829322990705340748373879653187993475965978292179863908561).^(1./2))./18 + 201420377367850759052042247582424574468966515212288./2085920769068020711504961752260169).^(1./6)) - 273; // tcl에 관한식 temperature에 관한 변수로 표현

plot(temperature,tcl),xlabel('temperature'),ylabel('tcl') // 그래프 만들기

 

tcl 결과값이 상당히 복잡하게 도출됩니다.

따라서 근사식인 tcl=0.0008144*temperature^2+0.3488*temperature+21.24 로 정의해서 tcl을 구하도록 하겠습니다.

 


M : 인체대사율 (단위 W/m2) - 58.2W/m2

W : 유효 기계력 - 0

Pa : 수증기 분압(단위 Pa) - 수식을 이용해 계산

Ta : 공기온도 - temperature

Tr : 복사온도 -  temperature

Fcl : 착의 표면적지수 - 1.0903

Tcl : 의복 표면온도 - tcl=0.0008144*temperature^2+0.3488*temperature+21.24

hc : 대류 열전달 계수 - 4.3(W/(m2*K))

 

변수에 대한 값을 모두 구할 수 있으므로 PMV에 관한 식을 구할 수 있습니다.

PMV에 대한 식 구하기

저는 이 프로젝트를 진행하면서 PMV에 값에 따른 동작을 목적으로 했으므로

아두이노를 통해 식을 구현해야 합니다.

 

1편에서 진행했던 코드를 이용하여 수식을 추가해보도록 하겠습니다.

#include <DFRobot_DHT11.h>
DFRobot_DHT11 DHT;
#define DHT11_PIN 2

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

void loop(){
  DHT.read(DHT11_PIN);

//계산부
  float ps = 6.112*exp(17.62*DHT.temperature/(243.12+DHT.temperature));
  float fp = 1.0016 + 3.15*pow(10,-6)*760 - 0.074/760;
  float pm = fp*ps;
  float pa = DHT.humidity*pm;
  float fcl = 1.0903;
  float icl = 0.07;
  float hc = 4.3;
  float tcl=0.0008144*pow(DHT.temperature,2)+0.3488*DHT.temperature+21.24;
  float M = 58.2;

  float H = 3.96*pow(10,-8)*fcl*(pow((tcl+273),4)-pow((DHT.temperature+273),4))+fcl*hc*(tcl-DHT.temperature);
  float Ec = 3.05*pow(10,-3)*(5733-6.99*M-pa)-0.42*(M-58.15);
  float C = 0.0014*M*(34-DHT.temperature);
  float Er = 1.7*pow(10,-5)*M*(5867-pa);

  float PMV = (0.303*exp(-0.036*M)+0.028)*(M-H-Ec-C-Er);

//출력부
  Serial.print("온도:");
  Serial.print(DHT.temperature);
  Serial.print("*C");
  Serial.print("  습도:");
  Serial.print(DHT.humidity);
  Serial.println("%");
  Serial.print("PMV : ");
  Serial.println(PMV);
  Serial.println();
  Serial.println();
 
  
  delay(1000);
}

 

위 식에 대한 코딩을 입력하면 다음과 같은 결과값이 도출됩니다.

 

온도, 습도, PMV 구하기

 

현재는 쾌적한 편에 속하며, 살짝 더운 정도겠군요.

 

이번 포스팅에서는 PMV를 구하는 과정을 다뤄봤습니다.

MATLAB과 아두이노 코딩까지 이용해서 값을 도출했네요.

 

처음에는 tcl 계산이 안되어서 골머리를 앓았던 기억이 있습니다.

이렇게 적어두는 포스팅이 누군가에게는 도움이 되었으면 좋겠습니다.