초여름 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 센서 모듈이 아닌 경우는 위와 같이 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 폴더에 압축풀어서 복사
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 시리즈 센서에는 공통으로 사용이 가능한 라이브러리 입니다. 따라서 소스의 센서종류 정의 부분만 바꿔주면 다른 센서에서도 사용이 가능한 소스 입니다.
'아두이노' 카테고리의 다른 글
[아두이노] 스크래치(Scratch)로 아두이노를 제어해보자 - ScratchX (4) | 2016.06.09 |
---|---|
[아두이노] 리눅스 민트에서 아두이노 IDE 폰트를 보기 좋게 하기 (0) | 2016.06.09 |
[아두이노] 블루투스 모듈(HC-06)과 릴레이를 이용해서 220V 전원을 무선으로 제어하기 (12) | 2016.05.30 |
[아두이노] 블루투스 모듈(HC-06)을 이용한 서보모터(SG90) 제어 (29) | 2016.05.26 |
[아두이노] 6축 자이로/가속도 센서 MPU-6050 의 사용 (19) | 2016.05.17 |