스마트디바이스실습 ‐ 5주차 - jiho0419/SmartDevice_2025-1 GitHub Wiki
💠 무선통신은 공기 중으로 전자기파를 이용해 데이터나 음성, 영상 등의 정보를 전송하는 방식을 말한다.
💠 전선이나 광케이블 같은 물리적인 연결이 없어도 통신이 가능하다.
🔸 정보를 전파 형태로 변환해서 전송하는 장치
🔸 수신한 전파를 다시 원래 정보로 복원하는 장치
🔸 전자기파를 송수신하는 장치
🔸 공기, 진공 등 전파가 지나가는 통로
🔸 아날로그 신호(음성, 데이터 등)를 전파에 실어서 보내는 기술
🔸 대표적인 방식: AM, FM, QAM, OFDM 등
🔸 전파의 진동 속도. 단위는 Hz (헤르츠)
🔸 무선통신에서는 보통 kHz, MHz, GHz 단위를 사용함
🔸 사용할 수 있는 주파수 범위. 넓을수록 더 많은 데이터를 전송 가능
🔸 여러 사용자가 동시에 무선 자원을 사용하는 방법
🔸 대표 방식: TDMA, FDMA, CDMA, OFDMA 등
종류 | 설명 |
---|---|
Wi-Fi | 무선 LAN, 인터넷 연결용 |
Bluetooth | 단거리 기기 연결 (이어폰, 키보드 등) |
Zigbee | IoT용 저전력 무선통신 |
NFC | 모바일 결제나 간단한 정보 교환 |
종류 | 설명 |
---|---|
셀룰러 네트워크 (2G ~ 5G, LTE) | 스마트폰을 통한 통신 |
위성통신 | 지구상의 모든 지역을 커버 가능 |
무선 마이크로파 통신 | 고속, 직선거리 통신 |
🔸 이동성, 유연성
🔸 설치가 간편함
🔸 물리적 장애가 적음
🔸 보안 취약성
🔸 간섭 및 신호 약화
🔸 속도 및 안정성은 유선보다 낮을 수 있음
💠 블루투스는 짧은 거리(보통 10m 이내) 에서 무선으로 데이터를 주고받는 통신 기술을 말한다.
💠 스마트폰, 이어폰, 키보드, 마우스, 차량, IoT 기기들 사이에서 저전력 무선 연결 을 위해 사용한다.
항목 | 내용 |
---|---|
통신 방식 | 무선 (2.4GHz ISM 대역 사용) |
전송 거리 | 보통 10m (클래스에 따라 최대 100m) |
속도 | 버전마다 다름 (예: 3 Mbps ~ 수십 Mbps) |
연결 수 | 한 기기가 여러 기기와 연결 가능 (마스터-슬레이브 구조 또는 멀티포인트) |
소비 전력 | 매우 낮음 (BLE의 경우 특히 저전력) |
페어링 | 초기 연결 설정 필요 (일반적으로 한 번만) |
🔸 처음 두 기기를 연결할 때, 서로 인증해서 신뢰를 형성
🔸 보통 숫자 입력이나 자동 인증 과정을 거침
🔸 한 기기(마스터)가 중심이 되어 다른 기기(슬레이브)를 연결
🔸 최신 버전에서는 Mesh 네트워크 도 지원 (IoT에서 활용)
🔸 2.4GHz 대역 내 79개 채널을 빠르게 전환 하면서 통신
🔸 장점: 간섭 회피, 보안 향상
🔸 설치 및 사용이 간편함
🔸 저전력 설계 (특히 BLE)
🔸 다양한 기기와의 호환성
🔸 통신 거리 제한 (장거리엔 부적합)
🔸 간섭 발생 가능 (Wi-Fi와 같은 대역 사용)
🔸 속도 한계 (대용량 파일 전송엔 느림)
💠 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); // 블루투스 데이터를 시리얼로 출력
}
}
🔸Play 스토어에서 Serial Bluetooth Terminal 을 다운로드

🔸휴대폰에 블루투스 설정에서 ESP32-BT-Slave 을 찾아 페어링

🔸어플에서 밑에 사진 순서대로 접속해 송수신 테스트 진행
🔸휴대폰에는 test2025 전송 / Arduino IDE에서는 hello2025 전송
🔸코드에서 Serial.begin(115200) 으로 설정했으므로 시리얼 모니터도 115200 buad 로 맞춰줘야함
🔸어플과 Arduino IDE에서 서로 보낸 문자를 확인 가능함
💠 블루투스 방식으로 ESP32와 스마트폰 간 통신을 통해 LED On/Off를 변경하는 실습을 진행

🔸 LED 모듈
🔸 S: D4
🔸 VCC: 3.3V
🔸 GND: GND
#include "BluetoothSerial.h"
BluetoothSerial SerialBT;
const int ledPin = 4; // 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");
}
}
}
🔸어플에서 0을 입력하면 LED가 꺼지고 1을 입력하면 켜진다.
KakaoTalk_20250406_163826852.mp4
💠 블루투스 방식으로 ESP32와 스마트폰 간 통신을 통해 RGB LED 색상을 변경하는 실습을 진행

🔸 RGB LED 모듈
🔸 R 핀 → D4
🔸 G 핀 → D15
🔸 B 핀 → D2
🔸 VCC → 3.3V
🔸 GND → GND
//라이브러리를 가져옵니다.
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
//서비스와 특성에 대한 UUID를 정의합니다.
#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define RGB_CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
#define NOTYFY_CHARACTERISTIC_UUID "d501d731-f0f9-4121-a7f6-2c0f959f1583"
//RGB LED에 사용될 핀 번호를 정의합니다
#define RED_PIN 4
#define GREEN_PIN 15
#define BLUE_PIN 2
//BLE 관련 객체를 선언합니다.
BLEServer *pServer; //BLE 서버 객체
BLEService *pService; // BLE 서비스 객체
BLECharacteristic *pRGBCharacteristic = NULL; //BLE 특성 객체
BLECharacteristic* pCharacteristic = NULL; //BLE 특성 객체
//RGB 값을 저장할 변수들을 초기화합니
int redValue = 0;
int greenValue = 0;
int blueValue = 0;
//BLE 특성에 대한 콜백 클래스를 정의합니다.
class MyCallbacks : public BLECharacteristicCallbacks {
//특성의 값을 읽어와 RGB 값을 파싱하고 LED를 제어합니다.
void onWrite(BLECharacteristic *pCharacteristic) {
String value = pCharacteristic->getValue().c_str(); //특성의 값을 문자열로 읽어옵니다.
// 값이 유효한 경우에만 처리
if (value.length() > 0) {
// RGB 값을 파싱하여 각각의 변수에 저장
int delimiterPos1 = value.indexOf(',');
int delimiterPos2 = value.lastIndexOf(',');
if (delimiterPos1 != -1 && delimiterPos2 != -1 \
&& delimiterPos2 < value.length() - 1) {
redValue = value.substring(0, delimiterPos1).toInt();
greenValue = value.substring(delimiterPos1 + 1, delimiterPos2).toInt();
blueValue = value.substring(delimiterPos2 + 1).toInt();
// RGB 값을 LED의 밝기로 변환하여 제어합니다.
analogWrite(RED_PIN, 255 - redValue);
analogWrite(GREEN_PIN, 255 - greenValue);
analogWrite(BLUE_PIN, 255 - blueValue);
}
}
}
};
void setup() {
// BLE 초기화하고 이름을 "RGB LED Control"로 설정합니다
BLEDevice::init("LDevRGB");
pServer = BLEDevice::createServer();
pService = pServer->createService(SERVICE_UUID);
// RGB 특성 생성 및 설정
pRGBCharacteristic = pService->createCharacteristic(
RGB_CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_WRITE
);
pRGBCharacteristic->setCallbacks(new MyCallbacks());
// Notify/Indicate 특성 생성 및 설정
pCharacteristic = pService->createCharacteristic(
NOTYFY_CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_NOTIFY |
BLECharacteristic::PROPERTY_INDICATE
);
// Create a BLE Descriptor
pCharacteristic->addDescriptor(new BLE2902());
// 서비스를 서버에 추가
pService->start();
// BLE 광고 시작
BLEAdvertising *pAdvertising = pServer->getAdvertising();
pAdvertising->start();
// 모든 핀을 HIGH로 설정하여 LED를 꺼진 상태로 초기화합니다.
digitalWrite(RED_PIN, HIGH);
digitalWrite(GREEN_PIN, HIGH);
digitalWrite(BLUE_PIN, HIGH);
}
void loop() {
// RGB 값을 16진수 형태로 변환하여 Notify
char hexValue[8];
sprintf(hexValue, "#%02X%02X%02X", redValue, greenValue, blueValue);
//Notify 특성의 값을 hexValue로 설정합니다.
pCharacteristic->setValue(hexValue);
pCharacteristic->notify(); //Notify를 통해 값을 전달합니다.
delay(100); // 알림 간격을 조절할 수 있습니다.
}
🔸Play 스토어에서 nRF Connect for Mobile 을 다운로드

🔸어플에서 밑에 사진 순서대로 접속해 RGB LED 테스트 진행
🔸 TEXT (UTF-8) 로 설정하고 원하는 색상의 RGB를 입력하여 LED 색상 변경 확인
🔸 분홍색, 노랑색, 하늘색 순으로 변경되는 것을 볼 수 있음