RS's Travel & Electronic

HC-06 : 페어링이 유지되는지 확인하는 코드 본문

시퀀스와 아두이노

HC-06 : 페어링이 유지되는지 확인하는 코드

RS 2021. 7. 18. 16:12
SMALL

블루투스 페어링이 불시에 끊어지는 이유는 크게 세 가지를 들어볼 수 있습니다.

 

1. 상대편의 전원이 OFF된다.

2. 내쪽이 OFF 된다.

3. 두 장치의 간격이 통신 유지 거리보다 더 멀어진다.

 

어느 쪽도 아두이노 입장에서는 블루투스가 끊어졌는지 유지되고 있는지 알 수가 없어요.

그래서 페어링이 유지되고 있을 경우의 코드를 계속 실행하고 있을 겁니다.

허공에 삽질하는 거죠.

 

페어링이 끊어졌다면 끊어졌다고 사용자한테 알려주고 유지되고 있을 경우에만 실행하는 코드는 실행하지 않도록 해줄 필요가 있습니다.

 

방식을 대충 설명하자면, 페어링이 유지되고 있는 한, 어떠한 정해진 신호를 계속해서 서로 주고받게 합니다. 그 '신호'는 단순하고 짧으면서 다른 이유로 사용하지 않아야 하죠.

그리고 어떠한 이유로 페어링이 불시에 끊겨서 나는 신호를 보내는데 상대방이 응답을 안 주는 것이 몇 회 반복되면 아 통신이 끊겼구나 하고 판단한 뒤 그에 맞는 액션을 해주는 거죠.

 

실제 시제품을 제작할 때는 다양한 신호가 앱과 아두이노(정확히는 HC-06) 사이를 오갈 겁니다.

그런 상황에서 페어링 감시 신호가 다른 신호에 씹혀서 못 읽고서는 페어링 중인데도 페어링이 끊겼다고 아두이노나 앱이 제멋대로 판단하지 않는가 확인하기 위해서 잡스러운 신호를 보내는 기능을 추가해 보겠습니다.

 

이번 주제에서는 앱인벤터로 만든 어플과 HC-06간의 페어링 유지를 감시하는 코드를 보도록 하겠습니다.

 

 

#include <SoftwareSerial.h>
#define BLUE_TX      2
#define BLUE_RX      3


SoftwareSerial hc06 (BLUE_TX, BLUE_RX);

unsigned long previousCheckSendTime = 0;
unsigned long previousPairingCheckTime = 0;

boolean isThereCheckSignal = false;
boolean blueConnect = false;


void pairingCheckSend () {
  unsigned long presentTime = millis();
  if ( presentTime >= (previousCheckSendTime+1000) )  {
    previousCheckSendTime = presentTime;
    hc06.print("c");
    Serial.println ( "Check 'c' Send to Phone. " );
  }
}


void pairingCheckCome () {
  unsigned long presentTime = millis();
  if ( (millis()) >= (previousPairingCheckTime+2000) ) {
    if ( !(isThereCheckSignal) ) {
      blueConnect = false;
      isThereCheckSignal = false;
      previousCheckSendTime = 0;
      previousPairingCheckTime = 0;
      Serial.println ("judged that the Bluetooth connection is disconnected.");
    }
    else {
      isThereCheckSignal = false;
      previousPairingCheckTime = millis();
    }
  }
  
}



void hc06Receive () {
  String answer = "";
  while (hc06.available())
  {
    char val = hc06.read();
    answer += val;
    
    unsigned long atThisTime = millis();
    do
    {
        ;
    }while (atThisTime+5 > millis() );// 데이터 끊김 방지
  }

  if (answer != "") {
    if (answer == "c") {
      isThereCheckSignal = true;
      Serial.println ( "Check 'c' come from Phone" );
    }
    else if (answer == "LEON") {
      Serial.println ("Phone send signal - LEON ");
      isThereCheckSignal = true;
    }
    else if (answer == "CLAIRE") {
      Serial.println ("Phone send signal - CLAIRE ");
      isThereCheckSignal = true;
    }
    else if (answer == "ZOMBIE") {
      Serial.println ("Phone send signal - ZOMBIE ");
      isThereCheckSignal = true;
    }
    else if (answer == "HAZARD") {
      Serial.println ("Phone send signal - HAZARD ");
      isThereCheckSignal = true;
    }
    else if (answer == "BLUE") {
      blueConnect = true;
      Serial.println ("Phone send signal - BLUE ");
    }
  }
}


void setup() {
  Serial.begin(9600);
  hc06.begin(9600);

  Serial.println ("start.");
}



void loop() {
  if (blueConnect)   {
    pairingCheckSend ();
    pairingCheckCome ();
  }
  hc06Receive ();

}

 

 

이번엔 앱인벤터의 코드 블록과 실행화면입니다.

테스트용이라 간단하게 만들었습니다.

페어링 버튼을 눌러서 미리 등록한 HC-06을 선택하면 페어링 버튼 아래에 있는 페어링 끊어짐이 페어링 연결됨이라고 바뀝니다.

 

디자이너 탭에서 타이머를 두 개 넣어주세요. 하나는 1ms(마스터 타이머), 또 하나는 100ms(원 세크 타이머)로 지정합니다.

 

 

 

아두이노 스케치에서 블루투스 처리 함수를 보시면 수신된 데이터가 'c'인가 확인하는 코드가 있습니다.

'c' <- 이게 이 코드에서의 페어링 감시 신호가 되겠습니다. 별 의미 없고 Check의 C를 따온 거뿐입니다.

이게 1초에 한 번씩 페어링이 유지되는 한 계속 아두이노와 앱을 오가고 있습니다.

 

 

실제로 페어링 감시 신호를 정할 때는 다른 이유로 쓰는 일이 없는 문자인 것이 좋습니다.

뭐 가령 '(' 라던가 '+'라던가.. 문자 단독으로 전송할 이유가 없는 특수문자가 좋겠죠.

 

 

수신처리 코드에 있는 LEON CLAIRE ZOMBIE HAZARD의 네 가지 신호 종류가 위에서 설명한 노이즈들입니다.

페어링 감시 신호는 저 네 가지 신호들이 마구 들어오는 가운데에서도 1초 단위로 계속해서 수신 송신을 반복해야 합니다.

페어링을 한 뒤에 어플에 있는 네 버튼을 마구마구 눌러줍니다.

 

 

의미도 없는 신호들이 마구마구 들어오면 c를 아두이노 측에서 보내기는 하는데 받지는 못하는 경우가 생깁니다.

위에 시리얼 창을 보시면 6번째 줄에 Send 했는데 9번째 줄에서 c를 또 Send 하고 있죠.

이건 아두이노 측에서 수신하는 c가 다른 신호에 씹히는 겁니다. 

이런 상황이 세 번 정도 반복된다면 아두이노는 블루투스가 끊겼다고 판단할 겁니다.

실제 시제품 테스트를 하는 중에 이런 식으로 버튼을 초당 몇 번씩 바 바박 누를 일은 없지만, 여러 개의 신호가 동시에 올 수는 있죠? 

c가 씹힐 정도의 상황이 세 번 연속으로 일어날 일은 없다고 생각하지만 그래도 어떤 상황이 벌어질지 모릅니다.

 

그래서 아두이노 코드의 다른 잡신 호인 LEON, CLAIRE, ZOMBIE, HAZARD들이 들어왔을 때도 c가 들어왔을 때와 동일하게  isThereCheckSignal라는 변수를 true로 세트 해줍니다. 

잡신 호든 뭐든 간에 신호가 들어왔다면 블루투스가 끊기진 않았다는 거니까요.

 

아, 신호 이름이 저렇냐고 하신다면, 제가 바이오하자드 2 리메이크를 플레이하다 포스팅을 하는 거라서 ㅋ

 

 

3초, 즉 세 번 상대방에게서 응답신호가 오지 않는다면 페어링이 끊어졌다고 판단하고 시리얼 창에 

judged that the Bluetooth connection is disconnected.라고 출력한 뒤 페어링 여부를 저장하는 blueConnect 변수를 false로 세팅합니다.

 

LIST
Comments