릴레이로 가습기 제어하기

by 고학능 | 2017-12-10 01:01
dht22 iot relay wemos d1 가습기 아두이노

지금까지 wemos d1, DHT22 센서, OLED 액정, ubidots 서비스에 대해서 알아보았습니다.

이번에는 릴레이를 활용해서 가습기를 제어해보겠습니다.




제가 만든 가습기 사진 그리고 동영상을 봅시다. 

위에 있는 가습기는 오아 가습기로 이마트에서 9,900원에 산 가습기 입니다. 이 가습기를 작동하려면 제가 손가락으로 버튼을 눌뤄줘야 하죠.

하지만 영상에서 보이는 가습기는 주변 습도에 반응해서 혼자 켜지고, 혼자 꺼집니다. 그 방법은 바로 릴레이에 있습니다. 그 과정을 지금부터 설명하겠습니다.

이번 장에서는

  1. 스위치 특징

  2. 릴레이로 스위치 제어하기

  3. 릴레이를 활용한 가습기 제어

순으로 작성하겠습니다.


1. 스위치 특징 

아두이노에 입문해서 예제를 따라하다 보면 4선짜리 스위치를 사용해본 경험이 있을겁니다. 4선짜리 스위치 특징은 1번 2번은 연결되어 있고 3번 4번이 연결되어 있다가 스위치를 누르면 1,2,3,4번 모두 연결이 됩니다.



스위치가 안눌렸을때는 입출력 핀이 저항, GND로 연결이 됩니다.

digitalRead(Pin)값은 '0' 을 갖습니다.

스위치가 눌렷을 때 입출력 핀이 저항 - GND 및 vcc로 연결이 됩니다.

digitalRead(Pin) 값은 '1'을 갖습니다. 

회로는 Pull_down으로 연결되어 있습니다. (코코아팹 pulldown, pullup 설명 참조)


2. 릴레이로 스위치 제어하기

여기서 주목할 부분은 스위치를 누른 다는 것은 위 파란선과 아래 파란선을 연결시킨다는 것입니다. 

좌우 스위치는 안눌린 상태입니다. 위 파란선과 아래 파란선에 하늘색 전선을 연결했습니다. 왼쪽 하늘색 선은 단선된 상태이고 오른족 하늘색 선은 연결된 상태입니다.

스위치는 안눌렀지만 위, 아래로 각각 연결한 하늘색 선이 연결되면서 스위치를 누른 것과 같은 상태를 만듭니다.

그렇다면 하늘색 선을 연결시키고 단선시키는 역할을 사람이 아닌 전기 신호로 한다면 ??? 스위치를 자동화할 수 있습니다. 그 역할은 바로 릴레이가 합니다.!

릴레이입니다. 릴레이는 디지털 신호에 따라 왼쪽 부분 연결상태를 달리합니다. digitalWrite(Pin, LOW)면 2번과 3번(NC, Normally Closed)이 연결되고, digitalWrite(Pin, HIGH)면 2번, 1번(NO, Normally Open)이 연결됩니다. 릴레이를 스위치에 연결하겠습니다.


스위치를 직접 누르는 것 대신에 릴레이에 HIGH, LOW 신호를 주면 스위치를 제어할 수 있습니다.

여러분은 손이 아닌 코드로 스위치를 제어할 수 있습니다!!!!!!!!!!!!!!!  


3. 릴레이를 활용한 가습기 제어

스위치가 있는 가습기를 찾아 릴레이를 연결해봅시다.

일단은 가습기에 선을 붙이고 ... 그리고 릴레이에 선을 붙인 다음... 두 선을 연결하겠습니다.

1. 상단부와 몸통을 돌려서 분리합니다. 그리고 상단부에서 필터를 돌려서 분리합니다.

2. 총 3곳이 나사 조여져 있는데 부식 방지를 위해 고무 뚜껑으로 덮혀있습니다. 송곳같이 날카로운 것으로 고무뚜껑을 제거 한뒤 나사를 풉니다.

3. 덮개를 분리하니 기판이 보이고 스위치가 보입니다. 기판 상단부에서는 작업할 수 없으니 나사를 풀고 기판 하단부에서 작업을 합니다.

4. 기판 하단부입니다. 

※위에 설명한 스위치는 4선짜리인데, 가습기에 붙어 있는 스위치는 2선짜리네요. 다르다고 당황하지 마세요. 오히려 더 쉬우닌까요.

5. 가습기에 있는 스위치는 빨간 동그라미 두 부분이 스위치를 기준으로 단선되어 있습니다. 스위치를 누르면 연결되고 스위치를 안누르면 단선되는 것이지요. 그래서 빨간색 동그라미 부분에 각각 두 주황색 선(위에서 설명한 하늘색 선이라고 생각하면 됩니다.)을 붙이겠습니다. 빵판이 아니닌까 납땜을 해야합니다!!  화상에 조심합시다.

6. 스위치에 붙인 두 선이 나올 수 있도록 공간을 만듭니다. 즉 자른다는 이야기입니다.

 분해과정의 역순을 거쳐서 가습기를 조립합니다. 그러면 기존 가습기에서 스위치 부근에 두 선이 나오게 됩니다.

(디자인이 ㅠㅠ)

코드를 작성하기 전에 가습기가 어떻게 작동하는지 파악해야합니다. 이번 프로젝트에서 wemos가 가습기 모듈을 직접 제어하는 것이 아니라 스위치를 제어합니다. 가습기 모듈을 직접 제어한다면 조건문을 이용해 '습도가 낮으면 가습기를 켜고 습도가 높으면 가습기를 꺼라' 이렇게 작성하면 됩니다. 하지만 스위치를 제어한다는 것은 가습기에 프로그래밍이 되어 있는 것을 건들 수가 없고 단지 스위치만 누르기만 할 뿐입니다. 그래서 가습기가 스위치를 누를때 어떻게 변하는지 알아야 하고 가습기를 작동시키려면 원하는 만큼 스위치를 눌려야 합니다.

오아 가습기는 1번 누르면 가습기가 작동하고 LED는 꺼져있고, 2번누르면 가습기 작동 및 LED가 켜지고, 3번 누르면 가습기는 꺼지고 LED가 켜지고, 4번 누르면 가습기가 꺼지고 LED도 꺼집니다.

스위치를 한번 누른다는 이야기는 정확히 이야기 하면 '초기 상태는 스위차가 안눌린 상태입니다. 스위치가 눌러지고(pressed , connected) - 잠시 기다리고(delay) - 스위치에서 안 눌린다(unpressed, disconnected)는 것입니다.

저는 가습기가 켜지고 LED는 꺼진 상태(1번 누른 것)와 가습기와 LED 모두 꺼진 상태(4번 누른 것)를 구현하려합니다. 가습기는 꺼질려면 일단 켜져 있어야 합니다. 켜질때는 스위치가 한번 누르는 함수를, 꺼질때는 스위치를 3번 누르는 함수를 작성했습니다.

void turn_on(){
digitalWrite(RELAY, HIGH);
delay(100);
digitalWrite(RELAY, LOW);
delay(100);
} // 가습기를 켜는, 스위치를 1번 누르는 함수입니다.

void turn_off(){
for(int i = 0; i < 3; i++){
digitalWrite(RELAY, HIGH);
delay(100);
digitalWrite(RELAY, LOW);
delay(100); // 가습기를 끄려면 일단 가습기가 켜져 있어야 합니다.
} // 가습기가 켤 때 1번 스위치를 눌렀으니 3번만 더 누르면 됩니다.
} // 반복문을 이용해서 스위치를 3번 눌렀습니다.














알고리즘을 말로 표현하는 것은 쉽습니다. '습도가 40%보다 낮으면 가습기를 켜고 습도가 40%보다 높으면 가습기를 꺼라' 이를 컴퓨터가 받아드리는 경우의 수를 나눠보면 4가지가 나옵니다.

↓가습기 상태 / 습도→

< 40%>= 40% 
꺼짐가습기 켜기 꺼진 상태 유지           
켜짐켜진 상태 유지           가습기 끄기

이를 위해 변수 2가지를 생성하겠습니다. 습도 상태(hum)와 가습기 상태(turn)입니다.

#include "DHT.h"
#define DHTPIN D6 // what pin we're connected to
#define DHTTYPE DHT22 // DHT 22 (AM2302)
DHT dht(DHTPIN, DHTTYPE,11);

#define RELAY D5

int hum; // 습도가 40% 늦으면 1, 40% 높으면 0 입니다.
int turn; // 가습기가 꺼져 있으면 0, 켜져 있으면 1입니다.


void setup() {
// put your setup code here, to run once:
dht.begin();
pinMode(RELAY, OUTPUT);
turn_on(); turn_off(); // 테스트 겸 초기화를 해줍니다.
}

void loop() {
float h = dht.readHumidity();
if (isnan(t) || isnan(h)) {
Serial.println("Failed to read from DHT");
} else {
if(h<40){
hum = 1;
}else{
hum = 0;
}
delay(5000);
}

if(hum == 1 & turn == 0){ // 습도가 40%보다 낮고 가습기가 꺼져 있는 조건에서
turn_on(); // 스위치를 한번 눌러 가습기를 켭니다.
turn = 1; // 그리고 가습기가 켜진 상태로 표시합니다.
}else if(hum == 0 & turn == 1){ // 습도가 40%보다 높고, 가습기가 켜져 있는 조건에서
turn_off(); // 스위치를 세번 눌러 가습기를 끕니다.
turn = 0; // 그리고 가습기를 꺼진 상태로 표시합니다.
}else{ // 그외에는 켜진 상태 혹은 꺼진 상태를 유지합니다.
delay(1000);
}
}

void turn_on(){
digitalWrite(RELAY, HIGH);
delay(100);
digitalWrite(RELAY, LOW);
delay(100);
}

void turn_off(){
for(int i = 0; i < 3; i++){
digitalWrite(RELAY, HIGH);
delay(100);
digitalWrite(RELAY, LOW);
delay(100);
}
}





















































다음 장에서는 DHT22, 0.96인치 OLED 액정, 릴레이, 가습기, ubidots서비스 이용하기를 묶어서 마무리하겠습니다. 

또한 아두이노 프로토 쉴드로 회로도를 설명하겠습니다.

댓글 0

MADE BY

고학능

3d모델링, 아두이노, 전기회로 구성