5주차 ‐ 블루투스 통신 실습 - boguuu/SmartDevice_2025-1 GitHub Wiki
무선통신이란 전자기파를 이용한 통신 방법과 사람의 가청주파수를 넘는 초음파 영역을 이용한 통신 방법
일반 신호를 고주파와 합성하여 전파를 통해 전송하고 수신 측 에서 이렇게 받은 고주파 신호를 처리하여 다시 원래의 신호로 바꾸는 방법을 말함
짧은 거리(수 cm~수십 m) 내에서 유선 없이 데이터를 송수신하는 기술
주요 특징:
- 짧은 통신 거리
- 낮은 전력 소모
- 간편한 연결
- 다양한 디지털기기와의 연동
기술 | 주파수 대역 | 최대 거리 | 속도 | 주요 활용 |
---|---|---|---|---|
Bluetooth | 2.4 GHz | 1~100m | 최대 3 Mbps | 웨어러블, 차량, 오디오 |
NFC | 13.56 MHz | 4~10cm | 424 Kbps | 결제, 인증 |
Wi-Fi Direct | 2.4/5 GHz | 200m | 250 Mbps+ | P2P 파일 전송 |
Zigbee | 2.4 GHz | 100m | 250 Kbps | 스마트홈 |
UWB | 3.1~10.6 GHz | 10m | 110 Mbps+ | 위치추적, 자동차 키 |
블루투스는 근거리 무선 통신 기술로, 스마트폰, 스피커, IoT 기기 등에서 널리 사용됨
👉 ESP32에서는 **클래식 블루투스(Classic Bluetooth)**와 **BLE(Bluetooth Low Energy)** 두 가지 방식을 지원
✅ 블루투스 방식 비교
방식 | 전력 소비 | 데이터 전송 속도 | 연결 범위 |
---|---|---|---|
BLE | 저전력 | 낮음 | 짧음 |
클래식 블루투스 | 상대적으로 높음 | 높음 | 김 |
IoT 시스템에서는 BLE가 주로 사용되며, 센서 데이터 전송, 게이트웨이 연결 등의 역할을 수행
- Arduino IDE: 친숙한 개발 환경으로, ESP32용 Bluetooth 라이브러리를 제공
- ESP-IDF (Espressif IoT Development Framework): Espressif에서 제공하는 공식 개발 프레임워크로, 더 세밀한 제어와 다양한 기능을 지원
- 초기화: BLE 환경을 초기화하고, 장치의 역할(예: 서버 또는 클라이언트)을 설정
- 서비스 및 특성 정의: BLE 서버로서 제공할 서비스와 특성을 정의
- 광고 시작: 다른 BLE 장치가 이 장치를 발견할 수 있도록 광고를 시작
- 연결 처리: 클라이언트 장치와의 연결 요청을 처리하고, 데이터 통신을 수행
**BLE(Bluetooth Low Energy) 프로그래밍에서 **광고(Advertising)는 BLE 장치가 자신의 존재와 제공하는 서비스 정보를 주변의 다른 BLE 장치들에게 알리는 과정
👉 ESP32를 블루투스 장치로 설정하고 스마트폰과 데이터를 주고받는 실습
#include "BluetoothSerial.h"
BluetoothSerial SerialBT;
void setup() {
Serial.begin(115200);
SerialBT.begin("ESP32-BT-Slave"); // 블루투스 장치 이름 설정
Serial.println("Bluetooth Started! Pair with ESP32-BT-Slave");
}
void loop() {
if (Serial.available()) {
char incoming = Serial.read();
SerialBT.write(incoming); // 시리얼 데이터를 블루투스로 전송
}
if (SerialBT.available()) {
char incoming = SerialBT.read();
Serial.write(incoming); // 블루투스 데이터를 시리얼로 출력
}
}
💡
BluetoothSerial
클래스는 ESP32에서 클래식 블루투스(Serial Port Profile, SPP) 통신을 쉽게 구현할 수 있도록 설계된 라이브러리 (블루투스 장치를 초기화하고, 데이터 송수신을 관리)
이 코드는 양방향 데이터 전송을 구현
- 시리얼 모니터에서 입력한 데이터는 블루투스로 전송
- 블루투스로 수신된 데이터는 시리얼 모니터에 출력
스마트폰이나 다른 블루투스 장치와 연결하여 데이터를 송수신
“playstore”를 통해 “serial bluetooth terminal” 설치
👉 위 실습은 안드로이드 핸드폰 기준으로 실습을 진행하였음
💡
ESP32 -> 스마트폰
스마트폰 -> ESP32
송수신 가능!!!
ESP32의 블루투스 시리얼 통신을 활용하여 LED를 원격으로 제어하는 방법 이를 통해 스마트폰이나 다른 블루투스 지원 기기에서 명령을 보내 LED를 켜거나 끌 수 있음
블루투스 시리얼 통신을 통해 수신한 명령에 따라 LED를 제어
#include "BluetoothSerial.h"
BluetoothSerial SerialBT;
const int ledPin = 22; // LED가 연결된 핀 번호
void setup() {
Serial.begin(115200);
SerialBT.begin("ESP32-BT-LED"); // 블루투스 장치 이름 설정
Serial.println("Bluetooth Started! Pair with ESP32-BT-LED");
pinMode(ledPin, OUTPUT); // LED 핀을 출력으로 설정
digitalWrite(ledPin, LOW); // 초기 상태를 OFF로 설정
}
void loop() {
if (SerialBT.available()) {
char incoming = SerialBT.read();
Serial.write(incoming); // 수신된 데이터를 시리얼 모니터에 출력
if (incoming == '1') {
digitalWrite(ledPin, HIGH); // '1'을 수신하면 LED ON
Serial.println("LED ON");
} else if (incoming == '0') {
digitalWrite(ledPin, LOW); // '0'을 수신하면 LED OFF
Serial.println("LED OFF");
}
}
}
👉 LED를 ESP32의 GPIO 22번 핀에 연결
-
블루투스 초기화:
SerialBT.begin("ESP32-BT-LED");
를 통해 블루투스 장치의 이름을 "ESP32-BT-LED"로 설정하고, 블루투스 통신을 시작 -
LED 핀 설정:
pinMode(ledPin, OUTPUT);
를 사용하여 LED가 연결된 핀을 출력 모드로 설정하고, 초기 상태를 LOW(꺼짐)으로 설정 -
블루투스 데이터 수신 및 처리:
SerialBT.available()
를 통해 블루투스 시리얼로부터 데이터가 수신되었는지 확인하고, 수신된 데이터가 '1'이면 LED를 켜고, '0'이면 LED를 끔
👉 위의 코드를 통해 블루투스 장치의 이름을 "ESP32-BT-LED"로 설정하였음을 확인!
LED.control.using.classic.Bluetooth.mp4
👉 '1'을 전송하면 LED가 켜지고, '0'을 전송하면 LED가 꺼짐
BLE 방식으로 ESP32와 스마트폰 간 통신을 통해 RGB LED 색상을 변경하는 실습
- 회로 연결
-
RGB LED 모듈
- R 핀 → D4
- G 핀 → D15
- B 핀 → D2
- VCC → 3.3V
- GND → GND
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>
BLEServer* pServer;
BLECharacteristic* pCharacteristic;
void setup() {
Serial.begin(115200);
BLEDevice::init("ESP32-RGB-Control");
pServer = BLEDevice::createServer();
BLEService *pService = pServer->createService(BLEUUID((uint16_t)0x1812));
pCharacteristic = pService->createCharacteristic(
BLEUUID((uint16_t)0x2A56),
BLECharacteristic::PROPERTY_WRITE | BLECharacteristic::PROPERTY_NOTIFY
);
pService->start();
BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
pAdvertising->addServiceUUID(pService->getUUID());
pAdvertising->start();
}
void loop() {
if (pCharacteristic->getValue().length() > 0) {
std::string rgbValue = pCharacteristic->getValue();
Serial.println(rgbValue.c_str()); // 수신된 RGB 값 출력
}
}
이 코드는 ESP32 마이크로컨트롤러를 Bluetooth Low Energy (BLE) 서버로 설정하여, 클라이언트 장치로부터 RGB 값을 수신하고 이를 시리얼 모니터에 출력하는 기능을 수행
1. BLE 초기화
-
BLEDevice::init("ESP32-RGB-Control");
: BLE 장치를 초기화하고 이름을 "ESP32-RGB-Control"로 설정.
2. BLE 서버 및 서비스 생성
-
pServer = BLEDevice::createServer();
: BLE 서버를 생성. -
BLEService *pService = pServer->createService(BLEUUID((uint16_t)0x1812));
: UUID가 0x1812인 BLE 서비스를 생성. -
pCharacteristic = pService->createCharacteristic(BLEUUID((uint16_t)0x2A56), BLECharacteristic::PROPERTY_WRITE | BLECharacteristic::PROPERTY_NOTIFY);
: UUID가 0x2A56인 특성을 생성하며, 클라이언트가 데이터를 쓰거나 알림을 받을 수 있도록 설정.
3. 광고 시작
BLE 디바이스가 연결되기 전에 주변 스캐닝 장치(Central)에 자신의 정보를 전송하여 탐색 가능하게 함
-
BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
: 광고 객체를 가져옴 -
pAdvertising->addServiceUUID(pService->getUUID());
: 서비스 UUID를 광고에 추가하여 클라이언트가 서비스에 접근할 수 있도록 설정 -
pAdvertising->start();
: BLE 광고를 시작하여 클라이언트가 서버를 탐색하고 연결할 수 있도록 설정.
4. 데이터 수신 및 출력
-
pCharacteristic->getValue()
: 클라이언트가 특성에 쓴 데이터를 가져옴. -
Serial.println(rgbValue.c_str());
: 수신된 RGB 값을 시리얼 모니터에 출력.
👉 오른쪽 속성을 TEXT(UTF-8)로 변환 후 RGB값 입력