아두이노 시제품 만들기

by 고학능 | 2017-09-29 15:05
iot 블루투스 선풍기 아두이노

첨부파일

쉽게 사용할 수 있는 방법이 있는데 굳이 어려운 방법을 쓰는 것은 현명한 행동은 아닌 것 같습니다.

선풍기에 스위치가 있는 상태로 블루투스 기능을 넣으면 좋은거지 스위치를 없애고 블루투스 기능만 넣으면 많은 사람이 쉽게 사용하기 어렵기에 심지어 조작하기 위해서 새로운 기기가 필요하기에 좋은 방법은 아닌 것 같습니다.

그래서 선풍기에 있는 물리적 스위치를 유지하면서 블루트스 기능을 추가하도록 하겠습니다.

※기존 바람세기를 선풍기 버튼 대신 토글스위치를 썼는데 쓰는 방법이 어려워서 선풍기 버튼으로 바꿨습니다.


선풍기 내부는 복잡해 보이지만 그렇게 어렵지만은 않아요!!


위 사진은 완성사진 및 선풍기 내부, 회로도 입니다.

특징은 다음과 같습니다.

1. 물리적 스위치로 선풍기를 조작할 수 있다.(기존 선풍기를 조작할 수 있다면 누구나 조작할 수 있다.)

2. 블루투스로 선풍기를 조작할 수 있다.(원격 조작 가능)

3. 자동 모드가 존재합니다. 즉, 주변 온도에 따라서 on/off 및 바람세기를 선택합니다.


코드 순서대로 설명하겠습니다.

변수-초기화(setup)-반복(loop)-함수 순서입니다.


1. 변수 설정입니다.

#include <SoftwareSerial.h>
SoftwareSerial bluetooth(14,15); // rx, tx

// 릴레이가 아두이노 보드에 연결된 핀을 정의합니다.
#define relay1 2 // 미풍      
#define relay2 3 // 약풍
#define relay3 4 // 강풍
#define relay4 5 // 회전

// 스위치가 아두이노 보드에 연결될 핀을 정의합니다. 
#define switch_weak 6
#define switch_middle 7
#define switch_strong 8
#define switch_rotate 9

#define switch_auto 10        // 선풍기를 자동 혹은 수동 선택할 스위치를 연결합니다.
#define auto_manual_LED 16    // 자동, 수동을 구분하기 위해서 LED를 하나 사용합니다.
#define tmp36 A1              // 자동모드일 때 주변 온도를 기준으로 on/off 및 바람세기를 결정합니다.
// 그래서 tmp36 온도센서를 연결합니다.


char bluetooth_receive1, bluetooth_receive2;            // 블루투스 통신을 통해 문자를 받아드릴 변수입니다.

int Work_relay1, Work_relay2, Work_relay3, Work_relay4; // 변수는 수동모드 조작할 때 설명하겠습니다.
int State_switch_weak, State_switch_middle, State_switch_strong, State_switch_rotate, State_switch_auto;
int bluetooth_relay1, bluetooth_relay2, bluetooth_relay3, bluetooth_relay4;

int readA0;
float temperature[10]; // 온도를 10번 측정하고 그 평균값을 구합니다.
float temperature_average; // 온도센서가 정밀한 센서는 아니여서 가끔 이상값을 측정하는데 이를 방지하기 위함입니다.


2. setup 초기설정입니다.

void setup() {
Serial.begin(9600);
bluetooth.begin(9600);
pinMode(relay1, OUTPUT); pinMode(relay2, OUTPUT); pinMode(relay3, OUTPUT); pinMode(relay4, OUTPUT);
pinMode(switch_weak, INPUT_PULLUP); pinMode(switch_middle, INPUT_PULLUP); pinMode(switch_strong, INPUT_PULLUP); pinMode(switch_rotate, INPUT_PULLUP); pinMode(switch_auto, INPUT_PULLUP);
pinMode(auto_manual_LED, OUTPUT);
digitalWrite(relay1, LOW); digitalWrite(relay2, LOW); digitalWrite(relay3, LOW); digitalWrite(relay4, LOW);
}







6~10번 핀은 스위치를 연결하기에 pinMode에서 INPUT_PULLUP으로 설정합니다.

INPUT으로 설정하면 플로팅 현상(0과1을 왔다리 갔다리합니다.)이 일어나서 PULLDOWN, PULLUP 회로를 구성해줘야 안정적입니다. 빵판도 아니고 선풍기 스위치에 PULLUP, PULLDOWN 회로 구성하기는 귀찮으니 pinMode에 INPUT 대신 INPUT_PULLUP으로 설정합니다. 보드 내 회로를 바탕으로 PULLUP이 됩니다. 플로팅 현상이 일어나지 않아 안정적으로 작동시킬 수 있습니다.


※단 PULLUP 저항이다 보니 스위치 off 일때 1이고 on일 때 0입니다. (참고)풀업, 풀다운, 플로팅현상 코코아팹

3. 반복(loop)되는 부분입니다.

void loop() {
// 온도 측정하는 부분입니다.
  for(int i = 0 ; i <10 ; i ++){    // 온도는 10번을 측정한 다음 평균값을 구합니다.
    readA0 = analogRead(tem36);         
    temperature[i] = (((readA0*4.7)/1024)-0.5)*100;    
    delay(5);
    if(i == 9){                                           // 10번 측정은 반복구문을 활용하고  마지막 반복 때 평균을 구합니다.
      temperature_average = (temperature[0] + temperature[1] + temperature[2] + temperature[3] + temperature[4] + temperature[5] + temperature[6] + temperature[7] + temperature[8] + temperature[9])/10;   
    }
  }

// 블루투스 통신으로 명령을 받아드리는 부분입니다.
if(State_switch_weak & State_switch_middle & State_switch_strong == 1){ if(bluetooth.available()){ // 스위치가 눌린상태에서는 블루투스로 바람세기 조작이 안되도록 코드를 추가했습니다. bluetooth_receive1 = bluetooth.read(); bluetoothReceive(); } }else{ if(bluetooth.available()){ // 단, 스위치가 눌린상태라도 회전은 되도록 else if를 추가했습니다. bluetooth_receive2 = bluetooth.read(); } if(bluetooth_receive2 == 'a'){ bluetooth_relay4 = 1; }else if(bluetooth_receive2 == 'e'){ bluetooth_relay4 = 0; } }

// 자동, 수동을 설정합니다.
  State_switch_auto = digitalRead(switch_auto);          // 자동, 수동 스위치 상태를 읽습니다.
  if(State_switch_auto == 0){                              // 스위치 상태가 0이면 수동모드로 작동시킵니다.
    manual_pan();                                         
    digitalWrite(auto_manual_LED, State_switch_auto);  // 자동, 수동 모드를 구분하기 위해서 LED를 부착했고 수동일 때 LED를 끕니다.
  }else{
    Serial.print("temperature : ");  Serial.println(temperature_average);  
    auto_pan();                                            // 스위치 상태가 1일 때 자동모드로 작동시킵니다. 
    digitalWrite(auto_manual_LED, State_switch_auto);      // 자동, 수동 모드를 구분하기 위해서 LED를 부착했고 수동일 때 LED를 켭니다.
  }
  delay(1000);
}

수동모드에서는 고려할게 2가지가 있습니다.

1. 바람세기를 선풍기 스위치와 블루투스 버튼으로 조작이 가능하다 점입니다.

2. 미풍, 약풍, 강풍은 동시에 켜지면 안된다는 점입니다.

즉 선풍기 스위치로 미풍 스위치를 켜고, 블루투스로 약풍 버튼을 누른다면?? 우선순위가 필요합니다.

저는 선풍기 스위치에 1순위를 두고 블루투스 버튼을 2순위로 설정했습니다.

선풍기 미풍, 약풍, 강풍 스위치가 눌린 상태에서는 블루투스 버튼으로 회전은 되지만 바람세기가 안 바뀌도록 코드를 추가했고 선풍기 미풍, 약풍, 강풍 스위치가 안 눌린 상태에서는 블루루스 버튼으로 회전 및 바람세기 바꿀 수 있도록 수정했습니다.


4. 함수 부분입니다.

  4-1 자동모드일 때 함수입니다.

void auto_pan(){
  relay4_function(); // 자동모드에서 회전은 수동으로 조작할 수 있도록 했습니다.
  if(temperature_average >33){       // 조건문을 활용하고 온도를 기준으로 on/off 및 미풍, 약풍, 강풍 설정합니다.
    digitalWrite(relay1, LOW);
    digitalWrite(relay2, LOW);
    digitalWrite(relay3, HIGH);       
    delay(10000);
  }else if(temperature_average <= 33 & temperature_average > 29){
    digitalWrite(relay1, LOW);
    digitalWrite(relay2, HIGH);
    digitalWrite(relay3, LOW);   
    delay(10000);
  }else if(temperature_average <= 29 & temperature_average > 25){
    digitalWrite(relay1, HIGH);
    digitalWrite(relay2, LOW);
    digitalWrite(relay3, LOW);       
    delay(10000);
  }else{
    digitalWrite(relay1, LOW);
    digitalWrite(relay2, LOW);
    digitalWrite(relay3, LOW);       
  }
}


  4-2 수동모드일 때 함수입니다.

선풍기 스위치 미풍/약풍/강풍 값을 State_switch_weak/middle/strong에 저장합니다.(안눌리면 1, 눌리면 0)

블루투스 버튼 미풍/약풍/강풍 값을 bluetooth_relay1/relay2/relay3에 저장합니다.(안눌리면0, 눌리면 1)

선풍기 미풍 스위치 값과 블루투스 미풍 버튼 값을 OR 연산을 해서 둘 중 어느 것 하나면 켜져도 미풍이 켜질 수 있도록 합니다. 그 결과를 Work_relay1에 켜지면 1, 안 켜지면 0으로 저장합니다.(약풍, 강풍도 동일하게 작성)

굳이 Work_relay 변수를 만든 이유는 미풍, 약풍, 강풍은 같이 작동하면 안됩니다. 그러면 고장납니다. Work_relay1, Work_relay2, Work_relay3 변수 값을 AND 연산을 합니다. 그래서 Work_relay(1/2/3) 중 하나만 1일 때 선풍기가 작동하도록 코드를 작성했습니다.

void manual_pan(){
  relay1_function();
  relay2_function();
  relay3_function();
  relay4_function();
  working();
}

void relay1_function(){
  State_switch_weak = digitalRead(switch_weak);
  if(State_switch_weak == 0 | bluetooth_relay1 == 1){  // 선풍기 미풍 스위치를 누르거나 혹은 블루투스 미풍 버튼을 켜는 것을 OR 연산을 합니다.
    Work_relay1 = 1;                                // (선풍기 미풍 스위치가 눌리고 블루투스 미풍 버튼 아니거나), (선풍기 미풍 스위치가 안눌리고 블루투스 미풍 버튼이 눌리거나), (선풍기 미풍 스위치 및 블루투스 미풍 버튼이이모두 눌렸을 때)일 때
  }else{                                              // 미풍을 켜야하닌까 work_relay1 변수에 1을 저장합니다.
    Work_relay1 = 0;                              // 선풍기 미풍 스위치가 안눌리고, 블루투스 미풍 버튼이 안눌렸을 때 
  }                                                  // 미풍을 안 켜야 하닌까 work_relay1 변수에 0을 저장합니다.
}

void relay2_function(){                         // 약풍도 미풍과 동일합니다.
  State_switch_middle = digitalRead(switch_middle);
  if(State_switch_middle == 0 | bluetooth_relay2 == 1){
    Work_relay2 = 1;
  }else{
    Work_relay2 = 0;
  } 
}

void relay3_function(){
  State_switch_strong = digitalRead(switch_strong);
  if(State_switch_strong == 0 | bluetooth_relay3 == 1){
    Work_relay3 = 1;
  }else{
    Work_relay3 = 0;
  } 
}

void relay4_function(){                                  // 회전의 경우는 릴레이1,2,3과 동시에 켜져도 상관이 없습니다. 사실 모터가 작동이 되야 회전이 될 수 있습니다.
  State_switch_rotate = digitalRead(switch_rotate);      // working() 함수에서 미풍, 약풍, 강풍 and 연산할 필요가 없습니다.
  if(State_switch_rotate == 0 | bluetooth_relay4 == 1){
    digitalWrite(relay4, HIGH);   
  }else{
    digitalWrite(relay4, LOW);
  }
}

void working(){
  if(Work_relay1 == 1 & Work_relay2 == 0 & Work_relay3 == 0){     // 미풍만 켜져있을 때, 즉 미풍은 켜지고, 약풍, 강풍은 꺼질 때 
    digitalWrite(relay1, HIGH);                                   // 미풍 relay만 HIGH 상태로 하고 약풍, 강풍 relay는 LOW로 합니다.
    digitalWrite(relay2, LOW);
    digitalWrite(relay3, LOW);
  }else if(Work_relay1 == 0 & Work_relay2 == 1 & Work_relay3 == 0){
    digitalWrite(relay1, LOW);
    digitalWrite(relay2, HIGH);
    digitalWrite(relay3, LOW);
  }else if(Work_relay1 == 0 & Work_relay2 == 0 & Work_relay3 == 1){
    digitalWrite(relay1, LOW);
    digitalWrite(relay2, LOW);
    digitalWrite(relay3, HIGH);

  }else{
    digitalWrite(relay1, LOW);
    digitalWrite(relay2, LOW);
    digitalWrite(relay3, LOW);     
  }
}


이번 장에서는 코드만 봤는데 다음장에서는 직접 회로를 보면서 코드를 설명하도록 하겠습니다.


댓글 0

MADE BY

고학능

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