아두이노2016. 6. 9. 14:08

초여름 6월인데 벌써 30도가 넘어가는 날이 나오고 습도도 조금씩 높아지고 있습니다. 에어컨처럼 온도를 맞춰 놓으면 자동으로 풍량을 조절하는 선풍기도 있는걸로 알고 있지만 아직 그런 선풍기는 대부분 가지고 있지 않죠. 이번에는 선풍기에 온습도 센서 DHT11을 연결해서 일정온도 이상이 되면 켜지고 온도가 낮아지면 알아서 꺼지는 선풍기를 만들어 보겠습니다. 사실 이걸 만들려고 생각한 이유가 요즘 밤에 잘때 더워서 조그만 USB 선풍기를 켜고 잡니다. 그런데 새벽에 추워져도 선풍기는 계속 돌아가니 끄고는 싶은데 침대에서 나오기는 싫고... 자동으로 꺼졌으면 좋겠는데... 그런 귀차니즘에 만들게 되었습니다. ^^;


좌측부터 DHT11 온습도 센서, 아두이노 나노, 릴레이를 이용할 것입니다. 아두이노 우노를 쓰더라도 코드와 연결은 같습니다.


그리고 지난 릴레이편에서 사용한 위와 같이 생긴 전원코드가 필요 합니다. 220V용 전선, 플러그, 콘센트를 이용해서 만들어 주었습니다. 중간에 릴레이가 들어가서 전원을 끊거나 이어주는 역할을 합니다.


※ 주의: 이 글 에서는 전압과 전류가 높은 위험한 가정용 220V 전원을 다룹니다. 감전되면 위험하므로 만약 따라하실 경우 상당한 주의를 요합니다. 또한 릴레이 규격은 작은 전압 제어용부터 큰 전압용까지 매우 다양하므로 반드시 용도에 맞는 정격용량의 제품을 이용해야 합니다.


그런데, 이 프로젝트에서 사용할 DHT11 은 온도와 습도를 동시에 측정이 가능한 센서 입니다. 온도와 습도를 알 수 있으니 불쾌지수도 구할 수가 있습니다. 따라서 단순하게 온도에 따라 ON/OFF 할 수도 있지만 불쾌지수를 구해서 그 값에 따라서 선풍기가 ON/OFF 되도록 해 보겠습니다. 그럼 사람이 불쾌감을 느끼는 불쾌지수의 기준은 어떻게 될까요?


불쾌지수 기준 - 출처: 기상청 사이트 http://www.kma.go.kr/HELP/basic/help_01_05.jsp


위의 표에 따라서 불쾌감을 느끼기 시작하는 단계인 70 이상이 되면 선풍기가 켜지도록 해 보겠습니다.


■연결


DHT11_RELAY_FAN.fzz


위와 같이 연결하며 DHT11 센서 모듈이 아닌 경우는 위와 같이 VCC 와 Signal 사이에 10KΩ 저항을 풀업용으로 달아주어야 합니다. 저의 경우는 저항이 포함되어 있는 모듈형태의 센서이므로 저항 없이 연결해 주었습니다.


DHT11

아두이노 나노

VCC

3V3

Signal

D2

GND

GND


Relay

아두이노 나노

Signal

D10

VCC

5V

GND

GND


아두이노 우노의 경우도 연결은 같습니다.


위와 같이 연결하고 릴레이 측의 ON 과 C 단자에 위의 전원코드를 연결해 주면 됩니다.


아두이노 나노 사용 시 IDE 는 아래와 같이 설정해 주면 됩니다. 다만 ATmega168 칩을 사용한 나노일 경우에는 ATmega168 을 선택하면 됩니다. 물론 포트도 자신의 컴퓨터에 맞게 설정합니다.



■ 소스1 (불쾌지수로 선풍기 ON/OFF)

온도와 습도로 불쾌지수 구하는 공식은 기상청 홈페이지에서 참조해서 함수로 만들었기 때문에 정확할 것으로 생각 됩니다.

 

불쾌지수 구하는 공식, 출처: 기상청 사이트 kma.go.kr

 

▶ DHT 센서 라이브러리 : 아두이노 IDE 의 Libraries 폴더에 압축풀어서 복사

DHT.zip

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include "DHT.h"  //DHT 라이브러리
 
#define DHTPIN 2        // SDA 핀의 설정
#define DHTTYPE DHT11   // DHT22 센서종류 설정
int relay = 10;         //릴레이단자
 
DHT dht(DHTPIN, DHTTYPE);
 
void setup() {
  Serial.begin(9600); 
  Serial.println("DHT11 RELAY FAN !!!");
  dht.begin();
  pinMode (relay, OUTPUT); 
}
 
void loop() {
  // 센서의 온도와 습도를 읽어온다.
  float humi = dht.readHumidity();
  float temp = dht.readTemperature();
  // 불쾌지수
  float di = discomfortIndex(temp,humi);
 
  if (isnan(temp) || isnan(humi)) {
    //값 읽기 실패시 시리얼 모니터 출력
    Serial.println("Failed to read from DHT");
  } else {
    //습도, 온도, 불쾌지수 시리얼 모니터 출력
    Serial.print("Humi: "); 
    Serial.print(humi);
    Serial.print(" %\t");
    Serial.print("Temp: "); 
    Serial.print(temp);
    Serial.print(" *C");
    Serial.print(" \t");
    Serial.print("DI: ");
    Serial.println(di);
 
    if(di>=70)
    {
      digitalWrite (relay, HIGH);
    } else {
      digitalWrite (relay, LOW);
    }
  }
  //delay(2000);
}
 
//불쾌지수 구하기 (공식출처: 기상청)
float discomfortIndex(float temp, float humi) {
    return (1.8f*temp)-(0.55*(1-humi/100.0f)*(1.8f*temp-26))+32;
}
 
cs



테스트 동영상 입니다. 온도가 높아지면 불쾌지수도 높아지기 때문에 센서를 손으로 집어서 온도를 높였습니다. 온도가 높아지니 불쾌지수가 70을 넘어갑니다. 그럼 릴레이가 ON 되고 선풍기가 돌아 갑니다. 그 후 센서를 선풍기 바람으로 식혀서 온도를 낮추어주니 선풍기가 꺼집니다.


그리고 아래와 같은 식으로 소스를 수정하면 온도만 모니터링 해서 선풍기가 켜지고 꺼지게 만들수도 있습니다. 마찬가지로 습도값 만으로도 선풍기를 ON/OFF 할 수 있습니다. (사실 처음 생각은 온도만 가지고 선풍기를 ON/OFF 할 생각 이었습니다.) 


■ 소스2 (온도에 따라 선풍기 ON/OFF)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include "DHT.h"  //DHT 라이브러리
 
#define DHTPIN 2        // SDA 핀의 설정
#define DHTTYPE DHT11   // DHT22 센서종류 설정
int relay = 10;         //릴레이단자
 
DHT dht(DHTPIN, DHTTYPE);
 
void setup() {
  Serial.begin(9600); 
  Serial.println("DHT11 RELAY FAN !!!");
  dht.begin();
  pinMode (relay, OUTPUT); 
}
 
void loop() {
  float temp = dht.readTemperature();
 
  if (isnan(temp)) {
    //값 읽기 실패시 시리얼 모니터 출력
    Serial.println("Failed to read from DHT");
  } else {
    Serial.print("Temp: "); 
    Serial.print(temp);
    Serial.println(" *C");
    
    if(temp>=30//30도 이상이면 선풍기 ON
    {
      digitalWrite (relay, HIGH);
    } else {
      digitalWrite (relay, LOW);
    }
  }
  //delay(2000);
}
cs



이상으로 온습도 센서와 릴레이를 가지고 선풍기를 ON/OFF 해 보았습니다. 소스에 사용한 DHT 라이브러리는 DHT22 등 DHT 시리즈 센서에는 공통으로 사용이 가능한 라이브러리 입니다. 따라서 소스의 센서종류 정의 부분만 바꿔주면 다른 센서에서도 사용이 가능한 소스 입니다.

반응형
Posted by 대네브 (deneb)

댓글을 달아 주세요

  1. 소고기남냠

    아두이노에 대한 관심이 많아서 여기저기 둘러보다가 게시글들이 너무 유익해서 잘 배우고있습니다. 감사합니다. 위의 아두이노를 나노가 아닌 우노를 통해서 구현하고 싶습니다. 우노의 경우 DHT11과 Relay를 우노의 어디에 연결해야 하는지 감이 안와서 답을 얻고자 댓글 남깁니다. 감사합니다

    2016.09.22 22:15 [ ADDR : EDIT/ DEL : REPLY ]
  2. 이희준

    좋은 게시글 감사합니다 다름이아니라 릴레이대신 led를 사용해 온도 습도 에따라 불이 들어오게 하려는데 회로연결및 코딩이 도저히 감이잡히지 않네요.. 워낙 아두이노에 대해 잘알지도 못하구요 혹시나 시간의 여유가 되신다면 부탁드려보겟습니다. 감사합니다

    2016.12.08 22:17 [ ADDR : EDIT/ DEL : REPLY ]
    • 죄송하지만 그런부탁은 받지 않습니다. 다만 조언을 드리자면 위의 선풍기 on off 소스와 형식상 90프로 이상 유사한 소스가 될 것 같다고 생각됩니다

      2016.12.08 22:54 신고 [ ADDR : EDIT/ DEL ]
  3. 얀얀

    대네브님 블로그를 통해 아두이노 공부를 하고 있는 학생입니다. 좋은 내용으로 도움 많이 받고 있습니다. 블로그를 보다가 궁금한 사항이 있는데
    혹시 이 불쾌지수에 따라 움직이는 선풍기를 블루투스 신호를 받았을때에 자동으로 움직일 수 있도록 할 수 있나요?기기와 어플은 완성이 되었는데 아두이노스케치에서 막혔네요..신호를 받았을때에 자동으로 움직일 수 있게 하고 싶습니다.
    바쁘시겠지만 혹시 시간적 여유가 있으시다면 도움 얻고 싶습니다. 감사합니다.

    2017.06.20 18:56 [ ADDR : EDIT/ DEL : REPLY ]
    • 가능합니다. 저의 블로그에서 블루투스 모듈 검색해 보세요. 조합하면 됩니다

      2017.07.07 15:29 신고 [ ADDR : EDIT/ DEL ]
  4. 궁금이

    습도를 높였을때 선풍기만으로 습도를 낮출수있는지에 대해 궁금합니다 습도는 어떻게 효율적으로 낮출수 있나요?

    2017.11.02 12:48 [ ADDR : EDIT/ DEL : REPLY ]
    • 글쎄요 선풍기 바람이 습기를 증발시켜서 낮아지게 할 수 있을까요?
      확실한건 에어컨이나 제습기는 습도를 낮출수 있습니다

      2017.11.02 13:22 신고 [ ADDR : EDIT/ DEL ]
  5. 온도맨

    안녕하세요 블로그 계시물 잘 보고 궁금한게 있어서 댓글 달아보아요.
    블로그에서 나와있는거처럼 결선을 한뒤 업로드 후 시리얼 모니터를 사용한결과
    Read failFailed to read from DHT
    Temp: 0.00 *c 이런식으로 값이나오네요.. 혹시 조언좀 얻을수있을까요?? 사용한 센서는 dht22 입니다.

    2017.12.02 21:09 [ ADDR : EDIT/ DEL : REPLY ]
    • Dht22 는 온습도 측정하는 소스가 살짝 다릅니다. 저의 블로그에서 dht22 검색해서 소스 보시고 수정 해보세요

      2017.12.02 21:14 신고 [ ADDR : EDIT/ DEL ]
  6. 간절한학생

    선생님 안녕하십니까?

    소스1번 그대로 복사해서 사용하였지만

    컴파일은 되지만 업로드 과정에서 avrdude: ser_open(): can't open device "\\.\COM3": 지정된 파일을 찾을 수 없습니다.라고 뜸니다. ㅜㅜ
    어떻게 해결해야 할까요

    2017.12.17 17:57 [ ADDR : EDIT/ DEL : REPLY ]
    • 아두이노 IDE 에서
      툴->포트 로 들어가서
      다른 포트로 변경하세요
      아두이노가 연결된 PC의 시리얼 포트번호와
      IDE에서 설정된 포트가 불일치해서
      생기는 일 입니다.

      아두이노 프로그래밍에서 가장 기초적인 내용 입니다.
      조금 더 기초를 공부하심이...

      2017.12.17 18:02 신고 [ ADDR : EDIT/ DEL ]
  7. 비밀댓글입니다

    2017.12.30 11:50 [ ADDR : EDIT/ DEL : REPLY ]
    • 둘 다 당연히 가능 합니다. 아두이노나 mcu는 그런거 하라고 존재하는거죠

      2017.12.30 11:53 신고 [ ADDR : EDIT/ DEL ]
    • 아이디어만있는 학생

      오오 그러면 혹시 프로그래밍 소스좀 배울 수 있을까요?ㅜㅜ

      2017.12.30 12:55 [ ADDR : EDIT/ DEL ]
    • 그건 직접 배워서 하셔야죠. ^^
      릴레이 온습도센서 스위치가 어떻게 아두이노를 이용해서 컨트롤 되는지 학습을

      2017.12.30 13:22 신고 [ ADDR : EDIT/ DEL ]
    • 아이디어만있는 학생

      혹시 자세히 배울수있는 교재나 인강 또는 사이트를 알려주실수있으면 감사하겠습니다.

      학과는 메카트로닉스를 나왔지만;; 툴을 이용하는것만 할줄알지 아두이노에 대해서는 너무 전무하네요.

      2017.12.30 13:29 [ ADDR : EDIT/ DEL ]
    • 여기 괜찮은것 같아요.
      https://opentutorials.org/module/2106
      메카트로닉스면 C언어 하실줄 아실텐데
      안다면 아두이노는 껌이죠.
      화이팅!

      2017.12.30 13:33 신고 [ ADDR : EDIT/ DEL ]
    • 아이디어만있는 학생

      빠른 답변 진심으로 감사드리며 꼭 배워서 구현해보도록 노력해봐야겠네요 감사합니다.

      2017.12.30 13:37 [ ADDR : EDIT/ DEL ]
  8. 한번해보자!

    글 잘보고있습니다! 블루투스모듈로 온오프신호를 보내서 서보모터 제어하는것과 온습도센서를 이용하여 선풍기를 키는것을 결합하여 온습도에따라 서보모터를 제어해서 에어콘을 끄고켜고 해보려고하는데 조합해서 만들수 있을까요?!

    2019.06.04 22:32 [ ADDR : EDIT/ DEL : REPLY ]
    • 뭐든 가능하죠. 하지만 에어컨 같은 전자제품은 전원만 꼽는다고 동작하진 않죠.
      뭐 여러가지 방법이 있겠지만
      에어컨의 리모컨 신호를 해킹 후
      아두이노에서 리모트 콘트롤 하는 방법도 있겠네요. 제 블로그에서 irremote 라고 검색해 보세요

      2019.06.04 22:39 신고 [ ADDR : EDIT/ DEL ]
  9. 한번해보자!

    나노보드에서 3v3 이 우노에선 어디에 연결해야하는지 여쭈어봐도 되겠습니까?

    2019.06.05 21:38 [ ADDR : EDIT/ DEL : REPLY ]
  10. 편의점인간

    안녕하세요 이걸 참조해서 실험을 해보려는 학생입니다.
    하드웨어파트를 보는 와중 의문점이 생겨서 질문을 드리는 건데 dht11과 아두이노 나노를 엮는 부분에서 선 하나에서 두 갈래로 갈라지던데 이 부분을 어떻게 만드는 건가요?

    2019.11.12 20:42 [ ADDR : EDIT/ DEL : REPLY ]
    • 그림 밑에 설명 있습니다. 풀업저항 입니다. 가지고 계신 dht11 이 저항이 포함된 모듈형 제품이라면 저항은 생략해도 됩니다

      2019.11.12 20:54 신고 [ ADDR : EDIT/ DEL ]