반응형

【 아두이노모듈#17】아두이노 2대로 블루투스 통신하여 LED ON/OFF 제어하기! (HC-05

 지난 시간 HC-05 모듈을 이용해서 블루투스 설정과 기본 페어링에 대해 학습해 보았다. 

 이번 시간 부터는 본격적으로 블루투스 상호간 통신을 활용한 응용작품 들을 구현해보고자 한다. 

선없이 무선으로 컨트롤 된다는 것은 매우 매력적이며, 관심과 흥미 또한 엄청나게 커질 것이다. 

 그 첫 시간으로 블루투스(회로) 기기 상호간 버튼제어를 해보려 한다. BT Master(회로)에서 버튼을 누르면, BT Slave(회로) 에서 LED가 켜지도록 할 것이다.  또한 그 반대도 가능하도록 두 회로 모두 버튼과 LED를 달아서, 동일한 회로 두개를 만들면 된다.   코딩도 마스터, 슬레이브 구분 없이 동일한 코드를 사용한다. 


 (단, 기계식의 버튼(스위치)을 사용하게 되면 , 예전에 다룬 것처럼 채터링 현상(바운싱)이 일어 나게 되니,  채터링 방지 루틴을 참고하여 넣을 것이다.   아래, 선수 학습 참조)   

Let's get it~!

 

▶ 선수 학습 :

   1. [아두이노모듈#16] 아두이노 2대로 블루투스통신! (블루투스 기본사용법)  ☜ (클릭)

   2. [아두이노기초#06] 채터링과 디바운스 (버튼의 바운싱 현상 제거)  ☜ (클릭)

 

▶ 실습 회로 도면 :

▶ 실습목표  :  

    1. 블루투스 모듈(HC-05,06)의 설정과 사용법에 대해 익힌다. (페어링, 기타 설정법)

    2. 블루투스 상호간 통신을 이해하고, 이를 이용해 아두이노 상호간 데이터를 주고 받거나 제어할 수 있다.

 

▶ 실습절차  :  

    1. 위와 같은 회로 두 개를 만들고, "회로1"의 HC-05 모듈은 Master 모드로 설정한다. 

    2. "회로2" 의 HC-05 모듈은 Slave 모드로 설정하고 아래 코드를 업로드 한다. 

    3.  '회로1'과 '회로2'에 전원을 공급하고 인접하게 두 면 페어링(연결)에 성공한다.

    4. '회로1'의 스위치를 누르면  숫자 '1'이 블루투스 모듈을 통해 '회로2'로 전달 되며, '회로2'에서는
        전달받는 신호('1')가 있을 경우 LED를 ON 시킨다.    그 반대의 경우도 동일하게 동작하여야 한다. 

    5. '회로1'에서 스위치를 누를 경우 '회로1' 에 있는 자신의 LED도 'SW 누름 확인'을 위해 한 번 깜빡이도록 한다.('회로2'에서도 마찬가지)

    6. 채터링(스위치의 기계적 다중 접점에 의한 바운싱 현상) 현상 해결을 위해 바운싱 방지 알고리즘을 적용한다.
       (선수학습 참조)

 

▶ 회로 동작 영상 :

 

▶ 아두이노 코드 :   (아래코드를 동일하게 만든 두 개의 회로에 각각 업로드 한다)

 

/* LED_SW On-Off  블루투스 Master/Slave code        */

#include  <SoftwareSerial.h>
#define SW 12 
#define LED 11
#define bounceTimer 200   
// 바운싱 카운트 200으로 설정 
u8 keyState = HIGH;   
// 버튼의 상태 저장용 변수
u8 bounceCount = 0; 
// 바운스 변수 선언
SoftwareSerial BTSerial(2, 3); 
// BTSerial(Rx, Tx)
int BTstates=0;         
// 블루투스 신호 상태 저장용 변수

void setup()  {
Serial.begin(9600);
BTSerial.begin(9600);  // 자신의 BT모듈의 설정값으로 변경 할 것
pinMode(SW, INPUT);
pinMode(LED, OUTPUT);
}

void loop()  {
// ---- 버튼 바운싱에러 방지 코드와 블루투스 신호 발신 영역 ----
  u8 key = digitalRead(SW); 
// 버튼 값 읽어 key변수에 저장
  if(key == HIGH)  {          
// 버튼이 눌러졌다면
    if(keyState == LOW) {     
// 이전의 버튼 상태가 LOW 였었다면
          if(bounceCount == 0) {  
            bounceCount = bounceTimer;   
            Serial.println("Push");          
            BTSerial.write('1'); 
// 버튼이 눌러졌으니,블루투스를 통해1을 전송
            digitalWrite(LED, HIGH); 
//버튼 눌림 확인용 LED On
            delay(100);
            digitalWrite(LED, LOW); 
//버튼 눌림 확인용 LED Off
            keyState = key;   
// 현재의 키값 저장
          }  
          else {
              bounceCount --; 
//  바운스 카운트 값 감소
          }      
    }    
  }    
  else{                          
 // 버튼이 안 눌러졌었다면
    if(keyState == HIGH)  {    
// 이전의 상태가 눌린 상태였다면
      Serial.println("Pull");    
 // 버튼을 놓은(Pull) 것임 
      keyState = key;   }     
 // 놓은(Pull)버튼 상태 저장
  }

//--- 수신되는 블루투스 신호 체크 후 LED ON/OFF 루틴 ---
  if (BTSerial.available())
  {
    char str=BTSerial.read();
    if (str=='1')
    {
      BTstates=!BTstates;
      Serial.println(str);
      digitalWrite(LED, BTstates);
    }    
  } 
}

 

▶ 아두이노 코드 다운로드 :

02_LEDSW_MS.zip
0.00MB

 

▶ 전체 과정 영상 :

(YouTube 1080P로 보기)

https://youtu.be/NqZV7kYnl-I

 

(카카오)

 

반응형