5주차 ‐ 블루투스 통신 실습 - boguuu/SmartDevice_2025-1 GitHub Wiki

📱무선통신


무선통신이란 전자기파를 이용한 통신 방법과 사람의 가청주파수를 넘는 초음파 영역을 이용한 통신 방법

일반 신호를 고주파와 합성하여 전파를 통해 전송하고 수신 측 에서 이렇게 받은 고주파 신호를 처리하여 다시 원래의 신호로 바꾸는 방법을 말함

근거리 무선통신(Near Field Wireless Communication)


짧은 거리(수 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가 주로 사용되며, 센서 데이터 전송, 게이트웨이 연결 등의 역할을 수행

ESP32에서의 Bluetooth 프로그래밍


  • Arduino IDE: 친숙한 개발 환경으로, ESP32용 Bluetooth 라이브러리를 제공
  • ESP-IDF (Espressif IoT Development Framework): Espressif에서 제공하는 공식 개발 프레임워크로, 더 세밀한 제어와 다양한 기능을 지원

ESP32에서의 BLE 프로그래밍 기본 흐름


  1. 초기화: BLE 환경을 초기화하고, 장치의 역할(예: 서버 또는 클라이언트)을 설정
  2. 서비스 및 특성 정의: BLE 서버로서 제공할 서비스와 특성을 정의
  3. 광고 시작: 다른 BLE 장치가 이 장치를 발견할 수 있도록 광고를 시작
  4. 연결 처리: 클라이언트 장치와의 연결 요청을 처리하고, 데이터 통신을 수행

💡BLE 광고(Advertising)


**BLE(Bluetooth Low Energy) 프로그래밍에서 **광고(Advertising)는 BLE 장치가 자신의 존재와 제공하는 서비스 정보를 주변의 다른 BLE 장치들에게 알리는 과정

클래식 블루투스 데이터 송수신(ESP32 Board)


👉 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) 통신을 쉽게 구현할 수 있도록 설계된 라이브러리 (블루투스 장치를 초기화하고, 데이터 송수신을 관리)

코드설명


이 코드는 양방향 데이터 전송을 구현

  • 시리얼 모니터에서 입력한 데이터는 블루투스로 전송
  • 블루투스로 수신된 데이터는 시리얼 모니터에 출력

스마트폰이나 다른 블루투스 장치와 연결하여 데이터를 송수신

실행방법


1. 코드 업로드


1

2. 스마트폰에서 “Serial Bluetooth Terminal” 앱을 다운로드


2

“playstore”를 통해 “serial bluetooth terminal” 설치

👉 위 실습은 안드로이드 핸드폰 기준으로 실습을 진행하였음

3. 블루투스 설정에서 ESP32-BT-Slave를 검색 후 페어링


3

4. 앱에서 연결 후 데이터 송수신 테스트


4

5

-송신 테스트


6

7

-수신 테스트


8

9

💡

ESP32 -> 스마트폰

스마트폰 -> ESP32

송수신 가능!!!

클래식 블루투스를 이용한 LED 제어


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를 끔

실행 방법


1. 코드 업로드


10

2. 스마트폰에서 “Serial Bluetooth Terminal”앱 실행후 페어링


11

👉 위의 코드를 통해 블루투스 장치의 이름을 "ESP32-BT-LED"로 설정하였음을 확인!

3. 명령어 전송을 통해 LED 제어


LED.control.using.classic.Bluetooth.mp4

👉 '1'을 전송하면 LED가 켜지고, '0'을 전송하면 LED가 꺼짐

BLE를 이용한 RGB LED 제어


BLE 방식으로 ESP32와 스마트폰 간 통신을 통해 RGB LED 색상을 변경하는 실습

12

  • 회로 연결
  • 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 값을 시리얼 모니터에 출력.

실행 방법


1. 코드 업로드


13

2. 스마트폰에서 “nRF Connect for Mobile” 앱을 다운


14

15

3. BLE 스캔 후 ESP32-RGB-Control 장치에 연결.

16

4. ESP32-RGB-Control 장치에 RGB값 수정 업로드

17

18

👉 오른쪽 속성을 TEXT(UTF-8)로 변환 후 RGB값 입력

5. RGB 값을 변경하여 LED 색상 확인


RGB(255,0,0) → 빨간색


19

20

RGB(0,255,0) → 초록색


21

22

RGB(0,0,255) → 파란색


23

RGB(0,86,102) → 청록색


24

25

⚠️ **GitHub.com Fallback** ⚠️