[Juo-Factory]

[Juo-Factory] 스마트팬 - 소프트웨어편

BaeJuo 2018. 10. 14. 00:41

이번 포스트에선 스마트팬에 들어간 아두이노 코드에 대해 알아보고

실제 동작 모습을 보려한다.


구현 내용은 간단하다.


4가지 모드에 따라 팬과 히팅 모듈이 동작과 멈춤을 하게 한다.

모드는 다음과 같다.


1. 대기 모드

2. 스마트 모드

3. 팬 모드

4. 히터 모드


각각의 모드들은 순서대로 바뀌며 히터모드에서 모드 변경시 다시 대기모드로 변환된다.


각각의 모드에 대해 자세히 살펴보자


1. 대기 모드

대기모드는 말 그대로 모든 장치가 정지된 상태이다.

주 전원(뒷편 스위치)를 켜면 처음 놓여지는 모드가 대기모드이다.


1) LED - 흰색(R: HIGH, G: HIGH, B: HIGH)

2) 팬 - HIGH

3) 히팅 모듈 - HIGH


2. 스마트 모드

스마트 모드는 주변 온도를 체크 한 후 그 온도에 따라 모드를 자동으로 동작시켜주는 모드이다.

예를 들어 세팅 온도를 23도로 맞춰 놓은 경우

스마트 모드 시 23도보다 높으면 팬 모드로, 23도 보다 낮으면 히터 모드로 동작시켜준다.


1) LED - 초록(R: LOW, G: HIGH, B: LOW)

2) 팬, 히팅모듈 - 조건에 따라 다름


3. 팬 모드

팬 모드는 단순히 팬만 동작시켜주는 모드이다.


1) LED - 파랑(R: LOW, G: HIGH, B: LOW)

2) 팬 - LOW

3) 히팅 모듈 - HIGH


3. 히터 모드

히터 모드는 팬과 히팅 모듈을 함께 동작시켜주는 모드이다.


1) LED - 빨강(R: LOW, G: HIGH, B: LOW)

2) 팬 - LOW

3) 히팅 모듈 - LOW



이 모드들은 버튼 또는 리모컨 '모드' 버튼에 따라 순서대로 변하게 된다.


아두이노 코드를 살펴보자



#include <IRremote.h>

#include <IRremoteInt.h>


#define LED_R 9

#define LED_G 10

#define LED_B 11

#define IR 12

#define BTN 8

#define relay_1 2 //FAN

#define relay_2 3 //HEAT

#define Temp A7


int MODE = 0;


IRrecv irrecv(IR);

decode_results results;


void setup() {

  //RGB

  pinMode(LED_R,OUTPUT);

  pinMode(LED_G,OUTPUT);

  pinMode(LED_B,OUTPUT);

  pinMode(IR,INPUT);

  pinMode(BTN,INPUT_PULLUP); // 버튼 풀업저항

  pinMode(relay_1,OUTPUT);

  pinMode(relay_2,OUTPUT);

  pinMode(Temp,INPUT);

  Serial.begin(9600);


  irrecv.enableIRIn();

  

}


void loop() {

  int reading = analogRead(Temp); // 온도센서로부터 온도 데이터를 수신한다.


  if(digitalRead(BTN)==0) // 버튼이 눌러졌을 때

  {

    MODE+=1;

    if(MODE==4)

    {

      MODE=0;

    }

  }

  

  if(irrecv.decode(&results))

  {

    if(results.value==924466310) //리모컨 '모드' IR 데이터

    {

      Serial.println(results.value);

      MODE+=1;

      if(MODE==4)

      {

        MODE=0;

      }

      irrecv.resume();

    }else if(results.value==2737486129) //리모컨 '정지' IR 데이터

    {

      Serial.println(results.value);

      MODE=0;

      irrecv.resume();

    }

    irrecv.resume();

  }

  delay(500);

  

  if(MODE==1)

  {

    SmartState((5.0*reading*100.0)/1024.0);

  }else if(MODE==2)

  {

    FanState();

  }else if(MODE==3)

  {

    HeatState();

  }else if(MODE==0)

  {

    readyState();

  }

}


//대기모드

void readyState()

{

  digitalWrite(LED_R,HIGH);

  digitalWrite(LED_G,HIGH);

  digitalWrite(LED_B,HIGH);


  digitalWrite(relay_1,HIGH);

  digitalWrite(relay_2,HIGH);

}


//스마트 모드

void SmartState(float temp_value)

{

  digitalWrite(LED_R,LOW);

  digitalWrite(LED_G,HIGH);

  digitalWrite(LED_B,LOW);


  if(temp_value<23) //설정된 온도 값보다 낮으면

  {

    digitalWrite(relay_1,LOW);

    digitalWrite(relay_2,LOW);

    Serial.println("23 Low");

    Serial.println(temp_value);

  }else if(temp_value>=23) //설정된 온도 값보다 낮으면

  {

    digitalWrite(relay_1,LOW);

    digitalWrite(relay_2,HIGH);

    Serial.println("23 HIGH");

    Serial.println(temp_value);

  }

}


//팬 모드

void FanState()

{

  digitalWrite(relay_2,HIGH);

  

  digitalWrite(LED_R,LOW);

  digitalWrite(LED_G,LOW);

  digitalWrite(LED_B,HIGH);


  digitalWrite(relay_1,LOW);

}


//히터 모드

void HeatState()

{

  digitalWrite(relay_2,HIGH);

  

  digitalWrite(LED_R,HIGH);

  digitalWrite(LED_G,LOW);

  digitalWrite(LED_B,LOW);


  digitalWrite(relay_2,LOW);

}



설정 온도 값은 전역 변수로 따로 관리를 하는게 더 나을 듯 싶다.

또한 리모컨 시간 버튼을 이용하여 시간 설정을 할 수 있게 기능을 추가 할 수도 있다.


이렇게 해서 완성된 실제 동작 영상을 보자!



버튼과 리모컨은 그 신호를 받아오는 주기에 따라 신호 수신이 되지 않거나 중복으로 수신되어 모드를 건너뛰는 경우도 생긴다.


위 영상에서 스마트 모드일 때 릴레이가 계속해서 동작하게 되는데

이는 설정 온도의 딱 경계 근처일 경우 모드가 계속해서 바뀌게 되는데 

이러한 이유로 릴레이가 계속해서 동작과 정지를 반복하게 된다.

이러한 오류를 해결하기 위해선 온도 체크를 일정한 주기를 가지고 실행해

그때마다 모드를 변경해주는 것으로 변경해주면 될것이다.

(그 작업은 나중에....)




후기

어쩌면 이번 프로젝트의 가장 중요한 부분일지 모른다.

왜냐하면 이 프로젝트는 실패했기 때문이다. ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ

실패의 이유는 두 가지 이다.


1. 쿨링팬 사용으로 인한 바람의 방향성이 전방을 향하지 않는다는 점이다.

무슨말이냐! 즉 바람이 앞으로 나오지 않는다;;; 

그냥 공기 순환을 시켜주는 장치라는 것이다. 그것도 내부에서만...

따라서 참고해서 만드실 분은 쿨링팬이 아닌  DC모터와 선풍기 날개, 

또는 처음부터 선풍기 모듈을 사용하시기 바란다.


2. 히팅 모듈이 생각보다 열이 많이 나지 않는다는 것이다.

알리 익스프레스에서 산 12V 140도 히팅 모듈에 방열판 두개를 아래위로 달아 사용하였지만,

12V 쿨링팬의 위엄 앞에 무너져 내리는 히팅 모듈이 되었다.. ㅠㅠ

따라서 더 높은 고온의 히팅 모듈을 사용하거나 드라이어기를 이용하면 어떨까 하는 생각을 하게 된다.

이에 따라 전압과 전류량을 철저히 체크하고 다시 구성해야 할 것이다.


여담으로... 집에서 목재를 가공하다보니 먼지가;;; 정말 ㅠㅠ 

목재 가공은 집 밖에 나가서 하는걸로 ㅠㅠ



그럼 다음 프로젝트를 기대하며....!