아두이노 블루투스 데이터 전송 오류 - adu-ino beullutuseu deiteo jeonsong olyu

   0. 준비                                                   

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

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

https://waytocse.tistory.com/74

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

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

waytocse.tistory.com

아두이노 블루투스 데이터 전송 오류 - adu-ino beullutuseu deiteo jeonsong olyu

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


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

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

아두이노 블루투스 데이터 전송 오류 - adu-ino beullutuseu deiteo jeonsong olyu

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]);
      }
    }
  }
}

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

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

아두이노 블루투스 데이터 전송 오류 - adu-ino beullutuseu deiteo jeonsong olyu

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

안드로이드 앱 부분에서는

아두이노 블루투스 데이터 전송 오류 - adu-ino beullutuseu deiteo jeonsong olyu

TerminalFragment.java에서 

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

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

System.out.println(msg)를 하면 

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

   3. 결과

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

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

아두이노 블루투스 데이터 전송 오류 - adu-ino beullutuseu deiteo jeonsong olyu

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

아두이노 블루투스 데이터 전송 오류 - adu-ino beullutuseu deiteo jeonsong olyu

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

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

전에 아두이노 우노에서 

oled와 블루투스 모듈을 한번에 사용하려고 했다가

메모리 문제로 인해 동시 사용을 못하게 된 후

(바로 그 문제를 직면했던 날 게시글)

https://waytocse.tistory.com/76

[아두이노] Uno에서 Adafruit_SSD1306와 SoftwareSerial 동시 사용 불가(OLED와 Bluetooth)

아래 상황 처럼 위의 스캐치를 업로드 한 경우  Adafruit_SSD1306와 SoftwareSerial 즉, OLED와 Bluethooth모듈을 동시에 사용하고 싶은 경우 위 스캐치는 업로드 되고 작동 잘 되는데 아래 스케치에서는 Oled

waytocse.tistory.com

아두이노 블루투스 데이터 전송 오류 - adu-ino beullutuseu deiteo jeonsong olyu

바~~~로 아두이노 메가를 샀다. (비싸...)

그런데 아두이노 우노에서 돌아가던 코드를 그대로

아두이노 메가에서 사용하려고 하자 작동이 안되는 것을 확인할 수 있었다.

아두이노 블루투스 데이터 전송 오류 - adu-ino beullutuseu deiteo jeonsong olyu

막 처음에는 이런 오류도 뜨고, 블루투스도 앱과 연동했는데

앱으로는 값을 잘 전송하는데 아두이노 시리얼 모니터에서는 출력을 안해서

(그러니까 블루투스 모듈로 쓰기는 되는데 읽기가 안되는 상황..)

무슨 문제인지 알아보다가 세 가지 문제를 발견했다.

1. Arduino > 툴 > 보드가 Uno로 되어있음

2. OLED가 안먹힘

3. BLE(Bluetooth4, HM-10)이 안먹힘

그래서 빨리 하던 프로젝트를 마무리하기 위해

이 세가지 문제를 해결해주었다.

   1번 문제 해결  (보드 설정)

1번 문제는 아래처럼 메가로 바꾸어주고 해결했다.

아두이노 블루투스 데이터 전송 오류 - adu-ino beullutuseu deiteo jeonsong olyu
사실은 매우 당연했던걸 놓쳤음...

   2번 문제 해결  (OLED)

2번 문제는 이전에 UNO에서는 OLED의 SDA, SCL핀을 4,5번에 꽂았다면

Mega에서는 OLED의 SDA, SCL을 20, 21번에 꽂아야 했다. 

메가를 보면

아두이노 블루투스 데이터 전송 오류 - adu-ino beullutuseu deiteo jeonsong olyu

안그래도 이렇게 20, 21번에 SDA, SCL이라고 적혀있다... ㅎㅎ

이렇게만 연결하면 아두이노 우노에서처럼 OLED가 잘 작동한다. 

우노에서 OLED 제어한 방법이 궁금하다면 아래를 참고하자

https://waytocse.tistory.com/71?category=1020896 

[아두이노] OLED

OLED을 통해 원하는 문구나 그림을 표시할 수 있다. 내가 사용한 OLED는 전에 ESP로 OLED동작시켰을 때와 같은 [ELECROW] 128x64 OLED 디스플레이 블루 [DO1286496BY]를 사용했다. 이녀석은 3.3v~5v사이 전압을 주

waytocse.tistory.com

아두이노 블루투스 데이터 전송 오류 - adu-ino beullutuseu deiteo jeonsong olyu

   3번 문제 해결  (Bluetooth4, HM-10)        

3번 문제도 2번문제와 같은 맥락으로 해결할 수 있었다.

이전에 아두이노 우노에서는 블루투스 모듈에 RX, TX연결 핀을 설정해줬어야 했다면

아두이노 메가에서는 블루투스 모듈의 TX핀을 보드의 19번 RX에 꽂고

블루투스 모듈의 RX핀을 보드의 18번 TX에 꽂아준 후

아두이노 블루투스 데이터 전송 오류 - adu-ino beullutuseu deiteo jeonsong olyu
모듈의 RX, TX

코드를 이렇게

#include <SoftwareSerial.h>
String byteTmp = "";
void setup() {
  Serial.begin(9600);
  Serial1.begin(9600);
}

void loop() {
  while(Serial1.available()){//블스루투->아두이노
    byte data = Serial1.read(); 
    Serial.write(data);
  }
}

따로 핀 설정을 하지 않고 Serial1 로 해주면 끝이었다.

매우 간단..

아주 작동을 잘한다. 굳...