컴퓨터/아두이노 라즈베리파이

[아두이노] 안드로이드와 BLE(Bluetooth4) 통신3 - 앱으로 데이터 전송

우유식빵 2021. 12. 2. 20:25

   0. 준비                                                   

앞서 아래 글에서 안드로이드 앱에서

아두이노로 블루투스 통신을 통해 값을 전송했었다.

https://waytocse.tistory.com/74

 

[아두이노] 안드로이드와 BLE(Bluetooth4) 통신2 - 회로도/코드

   0. 준비 앞서 아래 글을 통해 통신할 안드로이드를 개발하고 https://waytocse.tistory.com/73 [아두이노] 안드로이드와 BLE(Bluetooth4) 통신1 - 안드로이드 개발 0. 준비 안드로이드에서 BLE통신을 구현하.

waytocse.tistory.com

이 글에서 이어서 진행한다.


 

   1. 아두이노 블루투스 통신 회로도

앞 글과 아두이노 회로도는 같다. 

RX를 5번, TX를 4번핀에 연결한다. 

GND를 연결하고 VCC를 3.3V에 연결한다. 

 

   2. 아두이노 블루투스 통신 코드

앱에서 아두이노로 값을 전송받을 때는

SoftwareSerial BTSerial(4,5); 로 선언한 BTSerial을 통해

while(BTSerial.available()) {
    byte data = BTSerial.read()
}


이런식으로 값을 전송 받았다면,

 

아두이노에서 안드로이드로 값을 전송하기 위해서는 

간단하게

BTSerial.write(전송할 값);

이렇게만 해주면 된다. 

 

앞선 코드와 동일하게 작성 한 후

#include <SoftwareSerial.h>
SoftwareSerial BTSerial(4,5); //TX, RX 
String byteToString = "";
String outputString = "";
int inputValue[3] = {1,2,3};
bool commandActive = false;
int inputCount = 0;

void setup() {
  Serial.begin(9600);
  BTSerial.begin(9600); 
}

void loop() {
 while(BTSerial.available()) {//안드로이드 앱에서 아두이노로 데이터 전송
    byte data = BTSerial.read();//바이트 단위로 읽힘
    
    //JACKPOT의 J가 들어오면 byteToString 값 초기화
    if(data == 'J'){ 
      byteToString = "";
    }
    
    byteToString += char(data); //char로 형변환 안하면 숫자만 저장됨

    //커맨드 들어옴
    if(byteToString == "JACKPOT"){
      Serial.println(byteToString);
      commandActive = true;
      BTSerial.write("COMMAND ACTIVATED");
      byteToString = "";
      continue;
    }

    //JACKPOT 커맨드 받고 뒤 값 3개 받는 과정
    if(commandActive){
      inputValue[inputCount] = data - 48;//어차피 숫자라 형변환 필요 없음, 아스키코드 형태라서 -48이나 -'0'해야함
      inputCount += 1;
    }

    //값 3개 다 받았으면 출력
    if(inputCount == 3){
      inputCount = 0;
      commandActive = false;
      for(int i=0; i<3; i++){
        Serial.println(inputValue[i]);
      }
    }
  }
}

커맨드가 들어왔을 때 커맨드가 들어왔다고 알려주는

메세지를 안드로이드에게 전달하기 위해 

BTSerial.write("COMMAND ACTIVATED")부분만 추가 해주었다.

 

 

안드로이드 앱 부분에서는

TerminalFragment.java에서 

receive 메서드 부분이 값을 전달받는 부분이다.

 

아두이노에서 "COMMAND ACTIVATED"를 전송했으니

System.out.println(msg)를 하면 

안드로이드 스튜디오 RUN창에서 같은 메세지가 출력될 것이다. 

 

 

 

   3. 결과

안드로이드에서 값을 아두이노에 전달하면

아두이노에서 안드로이드로 "COMMAND ACTIVATED"가 출력된다

안드로이드 RUN창에서 확인하면

System.out으로 출력된 것을 확인할 수 있다.

 

다음 글에서는 더 심화해서 작성해야겠다.