본문 바로가기
IoT 디바이스 활용/Arduino

Arduino - 블루투스 통신 HC-05 (BtMiniCom.h)

by cooluk 2020. 10. 16.

아두이노 블루투스 통신

HC-05

  • Bluetooth 버전: 2.0 EDR
  • Bace: csr BC417 라디오 + MX 29LV800CBXBI-70G 메모리
  • 동작모드: AT mode, 통신모드
  • AT모드 기본 통신속도: 38400
  • 통신모드 기본 통신속도: 9600
  • 입력전압: 5V
  • 동작전압: 3.3V
  • 민감도: -80dBm
  • 전송출력: +4dBm

image-20201005153351392

image-20201005143302943


AT 모드 진입 방법

  • 버튼을 누른채 전원 블루투스 전원을 뽑았다가 다시 연결
  • 블루투스 LED가 2초 간격으로 점멸 시(AT 모드 진입) 버튼을 뗌
  • 참고) 연결 모드시 빠르게 LED 점멸
  • AT 모드의 속도 : 38400
  • 데이터 통신 속도 : 9600

동작확인

chapter6/ex01/app.ino

#include <SoftwareSerial.h>

SoftwareSerial BTSerial(2, 3); // SoftwareSerial(RX, TX)

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

}

void loop() {
  if (BTSerial.available()) {       
    Serial.write(BTSerial.read());  //블루투스측 내용을 시리얼모니터에 출력
  }
  if (Serial.available()) {         
    BTSerial.write(Serial.read());  //시리얼 모니터 내용을 블루추스 측에 WRITE
  }
}
  • 시리얼 모니터 입력창

    image-20201005144618702

  • 'AT' 입력 후 전송

  • 'OK' 답변 확인

    image-20201005144646438


블루투스 모듈 이름 및 PIN의 변경

  • 블루투스 모듈 이름 변경
    • AT+NAME=원하는이름 입력 후 전송
    • AT+NAME으로 변경 이름 확인
  • PIN 변경
    • AT+PSWD="1234"

마스터/슬레이브 모드, 주소 확인

  • 역할 확인

    • AT+ROLE
      • 0: 슬레이브
      • 1: 마스터
      • 2: LOOPBACK
  • 역할 변경

    • AT+ROLE=1
  • 주소 확인

    • AT+ADDR

      +ADDR:18:91:d7a231 (M)

      +ADDR:18:91:d71021 (S)

  • 슬레이브 주소 확인

    • AT+ADDR

      +ADDR:98d3:31:fb22d7

  • 마스터에서 슬레이브 주소 BIND

    • AT+BIND=98d3,31,fd22d7
    • AT+RESET 또는 전원 재인가

Bluetooth Terminal HC-05 앱 설치

image-20201005153900027


스마트폰과 블루투스 모듈과의 통신을 통한 문자열 전송, led 작동

chapter6/ex02/app.ino

#include <SoftwareSerial.h>

SoftwareSerial BTSerial(2, 3); // SoftwareSerial(RX, TX)

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

}

void loop() {
  if (BTSerial.available()) {       
    Serial.write(BTSerial.read());  //블루투스측 내용을 시리얼모니터에 출력
  }
  if (Serial.available()) {         
    BTSerial.write(Serial.read());  //시리얼 모니터 내용을 블루추스 측에 WRITE
  }
}

블루투스 클래스화

BtMiniCom.h

#pragma once

#include <Arduino.h>
#include <SoftwareSerial.h>
#include <MiniCom.h>

typedef void (*btminicom_callback_t)(String message);

class BtMiniCom : public MiniCom {
protected:    
    SoftwareSerial btSerial;
    btminicom_callback_t callback;

public:
    BtMiniCom(int rx, int tx,  btminicom_callback_t callback);
    void init();
    String readLine();      // \r\n를 제외한 문자열을 리턴
    void send(const char *msg);
    void run();
};

BtMiniCom.cpp

#include "BtMiniCom.h"

BtMiniCom::BtMiniCom(int rx, int tx,  btminicom_callback_t callback) 
    : MiniCom(), btSerial(rx, tx), callback(callback) {
}

void BtMiniCom::init() {
    MiniCom::init();
    btSerial.begin(9600);
}

String BtMiniCom::readLine() {  // \r\n를 제외한 문자열을 리턴
    String message = "";
    while(btSerial.available()) {
        char data = (char)btSerial.read();
        if(data == '\r') continue;
        if(data == '\n') break;

        message += data;
        delay(5);  // 수신 문자열 끊김 방지
    }
    return message;
}

void BtMiniCom::send(const char *msg) {
    btSerial.println(msg);
}


void BtMiniCom::run() {
    String msg = readLine();
    if(msg != "" && callback != NULL) {
        callback(msg);
    }
    MiniCom::run();
}

문자열 전송, led 작동

app.ino

#include "BtMiniCom.h"
#include <Led.h>

void received(String msg);

Led led(13);
BtMiniCom com(2, 3, received);

void received(String msg) {
    if(msg=="on") {
        led.on();
        com.send("OK");
    } else if(msg=="off") {
        led.off();
        com.send("OK");
    } else {
        com.send("Bad Command");
    }
}

void setup(){
    com.init();
}

void loop() {
   com.run();
}

댓글