아두이노

[아두이노]온습도 측정(DHT11)을 통한 LED와 부저 울리기[3편]

알까 2022. 5. 24. 23:49

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

 

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

https://catch-sin.tistory.com/9 [아두이노]온습도 측정 결과값 도출하기.(DHT11센서 이용)[1편] 최근 아두이노를 이용한 프로젝트를 진행하였습니다. 전자공학과는 아니었지만 평소 IOT에 관해 관심이 많

catch-sin.tistory.com

 

이전 포스팅에서는 PMV를 계산하고 PMV를 출력하는 과정까지 진행해보았습니다.

 

이번 포스팅에서는 PMV(쾌적성 지표)에 따라 LED에 빛이 들어오고 부저가 울리는 코딩을 진행해보려고 합니다.

 


 

우선 회로는 다음과 같습니다.

LED와 부저 연결 회로

여기서 사용된 저항은 220옴입니다.

 

회로를 구성하셨으면 의문점이 들 수 있습니다.

 

 

기존에 DHT11은 2번에다 연결했는데 저렇게 연결하면 어떡해?

 

해결방법은 간단합니다.

DHT11의 위치를 옮겨주면 됩니다. 저는 2번에서 A0로 핀의 위치를 변경하였습니다.

 

 

이번에는 코딩 먼저 보여드리려고 합니다. 코드는 다음과 같습니다.

#include <DFRobot_DHT11.h>
DFRobot_DHT11 DHT;
#define DHT11_PIN A0 //편의상 2번에서 A0로 핀을 변경하였습니다.

//LED변수 정의 과정
int Led1 = 2;
int Led2 = 3;
int Led3 = 4;
int Led4 = 5;
int Led5 = 6;
int Led6 = 7;
int Led7 = 8;
int Led8 = 9;
int Led9 = 10;

//부저 변수 정의 과정
int melody[] =    {500};

//LED 점등 패턴 - 전체 다 끄기
void style_0(void)
{
  unsigned char j;
  for(j=2;j<=10;j++)
    digitalWrite(j,LOW);

}

//점등패턴 1번 2,3,4번 켜기
void style_1(void)
{
  unsigned char j;
  for(j=2;j<=4;j++)
    digitalWrite(j,HIGH);
    delay(200);

}

//점등패턴 2번 5,6,7번 켜기
void style_2(void)
{
  unsigned char j;
  for(j=5;j<=7;j++)
    digitalWrite(j,HIGH);
    delay(200);

}

//점등패턴 3번 8,9,10번 켜기
void style_3(void)
{
  unsigned char j;
  for(j=8;j<=10;j++)
    digitalWrite(j,HIGH);
    delay(200);

}

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();
  
//PMV에 따라 전등과 부저 출력
  if(PMV>=2){
  style_0();
  tone(11,melody,1000);
  style_3();
       }
    else if(PMV>=1){ 
     style_0();
    tone(11,melody,250);
    style_2();
         }
      
      else if(PMV<=-1){
        style_0();
        tone(11,melody,250);
        style_2();
           }   
        else if(PMV<=-2){
        style_0();
        tone(11,melody,1000);
        style_3();
          }  

       else {
        style_0();
        style_1();
         }  
      
  delay(1000);
}

회로 구성은 

변수 선언 - 패턴 구성 - if문 구성 으로 요약할 수 있습니다.

 

제가 원하고자 하는 바는 PMV에 따라 전등이 켜지고 꺼지는 상황이었기 때문에 if 구문을 사용했습니다.

 

 

결과는 다음과 같이 나옵니다.

 

PMV가 1이상일 경우

 

PMV가 2이상일 경우

 

부저의 소리와 LED 변화를 통해 시각 청각적으로 인식할 수 있도록 구성하였습니다.

 

 

다음포스팅에서는 블루투스를 이용한 온습도 측정을 휴대폰으로 확인할 수 있는 방법을 포스팅하도록 하겠습니다.