Arduino, 블루투스 연동

이도현·2023년 8월 10일
0

아두이노 학습

목록 보기
30/34
post-custom-banner

1. 블루투스

1) 블루투스: 무선 기술 중 하나로, 짧은 거리에서
데이터를 주고받을 수 있도록 하는 기술,

  • 2,4GHz에서 작동
  • 기기들은 페어링이 되어 데이터를 주고 받을 수 있게 됩니다.
  • 배터리 수명도 길고, 저전력이므로 스마트 홈 기기로 많이 사용된다.

2) 페어링(Pairing): 블루투스 기기끼리 서로를 인식하고 연결하는 과정

  • 두 장치 간의 안전한 통신을 위해 서로를 인식하고 검증하는 과정
  • 공개키 암호화 방식을 사용
  • 각각의 장치는 랜덤한 숫자 값을 생성하고, 상대방에게 이 값을 전달
  • 이어서, 상대방의 공개키를 사용하여 전달받은 값을 암호화하고, 다시 전달
  • 이 과정을 반대쪽 장치도 수행
  • 이후 암호화된 데이터를 주고받을 수 있게됩니다.

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

#include <SoftwareSerial.h>

SoftwareSerial BTSerial(13, 12); // SoftwareSerial(RX, TX)

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



  • 지금 구글 스토어에 위 어플 없음. 대체할 만한 어플 찾기

3. 스마트폰과 블루투스 모듈과의 통신을 통한 문자열 전송

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

    MiniCom com;

    SoftwareSerial BTSerial(13, 12); // SoftwareSerial(RX, TX)

    String myString=""; //받는 문자열
    int count=0;

    void setup() {
    	com.init();
    	com.print(0, "[[Bluetooth]]");
    	BTSerial.begin(9600); //블루투스 시리얼 개방
    }

    void loop() {
    	while(BTSerial.available()) { //BTSerial에 전송된 값이 있으면
    		//BTSerial int 값을 char 형식으로 변환
    		char myChar = (char)BTSerial.read(); 
    		//수신되는 문자를 myString에 모두 붙임 (1바이트씩 전송되는 것을 연결)
    		myString+=myChar; 
    		delay(5); //수신 문자열 끊김 방지
    	}

    	if(!myString.equals("")) { //myString 값이 있다면
    		myString.trim();
    		char buf[17];
    		sprintf(buf, "%d)%s", ++count, myString.c_str());
    		com.print(1, buf);
    		BTSerial.println("input value: "+myString); 
    		myString=""; //myString 변수값 초기화
    	}
    }

4. BtMiniCom

//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=NULL, 
					long serial_bps=115200, int lcd_addr=0x27);
	void init();
	String readLine(); // \r\n를 제외한 문자열을 리턴
	void send(String msg); // 메시지 전송
	void run();
};
//BtMiniCom.cpp

#include "BtMiniCom.h"

BtMiniCom::BtMiniCom(int rx, int tx, btminicom_callback_t callback, 
long serial_bps, int lcd_addr)
 : MiniCom(serial_bps, lcd_addr), 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(); 
		message+=data; 
		delay(5); //수신 끊김 방지 ***
	}
	message.trim();
	return message;
}

void BtMiniCom::send(String msg){
	btSerial.println(msg);
}

void BtMiniCom::run(){
	String msg = readLine();
	if(msg != "" && callback != NULL) {
	callback(msg);
	}
	MiniCom::run();
}
//app.ino
#include <BtMiniCom.h>

void receive_msg(String msg);

BtMiniCom com(13, 12, receive_msg);
int count=0;

void receive_msg(String msg) {
	char buf[17];
	sprintf(buf, "%d)%s", ++count, msg.c_str());
	com.print(1, buf);
	com.send("input value: " + msg); 
}

void setup() {
	com.init();
	com.print(0, "[[Bluetooth]]");
}

void loop() {
	com.run();
}
profile
좋은 지식 나누어요
post-custom-banner

0개의 댓글