스마트디바이스실습 ‐ 5주차 - jiho0419/SmartDevice_2025-1 GitHub Wiki

1️⃣ 무선통신

*️⃣ 정의

💠 무선통신은 공기 중으로 전자기파를 이용해 데이터나 음성, 영상 등의 정보를 전송하는 방식을 말한다.
💠 전선이나 광케이블 같은 물리적인 연결이 없어도 통신이 가능하다.

*️⃣ 구성 요소

💠 송신기(Transmitter)

🔸 정보를 전파 형태로 변환해서 전송하는 장치

💠 수신기(Receiver)

🔸 수신한 전파를 다시 원래 정보로 복원하는 장치

💠 안테나(Antenna)

🔸 전자기파를 송수신하는 장치

💠 매체(Medium)

🔸 공기, 진공 등 전파가 지나가는 통로

*️⃣ 기술 및 개념

💠 변조(Modulation)

🔸 아날로그 신호(음성, 데이터 등)를 전파에 실어서 보내는 기술
🔸 대표적인 방식: AM, FM, QAM, OFDM 등

💠 주파수(Frequency)

🔸 전파의 진동 속도. 단위는 Hz (헤르츠)
🔸 무선통신에서는 보통 kHz, MHz, GHz 단위를 사용함

💠 대역폭(Bandwidth)

🔸 사용할 수 있는 주파수 범위. 넓을수록 더 많은 데이터를 전송 가능

💠 다중접속(Multiple Access)

🔸 여러 사용자가 동시에 무선 자원을 사용하는 방법
🔸 대표 방식: TDMA, FDMA, CDMA, OFDMA 등

*️⃣ 종류

💠 근거리 무선통신

종류 설명
Wi-Fi 무선 LAN, 인터넷 연결용
Bluetooth 단거리 기기 연결 (이어폰, 키보드 등)
Zigbee IoT용 저전력 무선통신
NFC 모바일 결제나 간단한 정보 교환

💠 광역 무선통신

종류 설명
셀룰러 네트워크 (2G ~ 5G, LTE) 스마트폰을 통한 통신
위성통신 지구상의 모든 지역을 커버 가능
무선 마이크로파 통신 고속, 직선거리 통신

*️⃣ 장점과 단점

💠 장점

🔸 이동성, 유연성
🔸 설치가 간편함
🔸 물리적 장애가 적음

💠 단점

🔸 보안 취약성
🔸 간섭 및 신호 약화
🔸 속도 및 안정성은 유선보다 낮을 수 있음

2️⃣ 블루투스

*️⃣ 정의

💠 블루투스는 짧은 거리(보통 10m 이내) 에서 무선으로 데이터를 주고받는 통신 기술을 말한다.
💠 스마트폰, 이어폰, 키보드, 마우스, 차량, IoT 기기들 사이에서 저전력 무선 연결 을 위해 사용한다.

*️⃣ 특징

항목 내용
통신 방식 무선 (2.4GHz ISM 대역 사용)
전송 거리 보통 10m (클래스에 따라 최대 100m)
속도 버전마다 다름 (예: 3 Mbps ~ 수십 Mbps)
연결 수 한 기기가 여러 기기와 연결 가능 (마스터-슬레이브 구조 또는 멀티포인트)
소비 전력 매우 낮음 (BLE의 경우 특히 저전력)
페어링 초기 연결 설정 필요 (일반적으로 한 번만)

*️⃣ 동작 원리

💠 페어링(Paring)

🔸 처음 두 기기를 연결할 때, 서로 인증해서 신뢰를 형성
🔸 보통 숫자 입력이나 자동 인증 과정을 거침

💠 연결 구조

🔸 한 기기(마스터)가 중심이 되어 다른 기기(슬레이브)를 연결
🔸 최신 버전에서는 Mesh 네트워크 도 지원 (IoT에서 활용)

💠 주파수 도약(Frequency Hopping Spread Spectrum, FHSS)

🔸 2.4GHz 대역 내 79개 채널을 빠르게 전환 하면서 통신
🔸 장점: 간섭 회피, 보안 향상

*️⃣ 장점과 단점

💠 장점

🔸 설치 및 사용이 간편함
🔸 저전력 설계 (특히 BLE)
🔸 다양한 기기와의 호환성

💠 단점

🔸 통신 거리 제한 (장거리엔 부적합)
🔸 간섭 발생 가능 (Wi-Fi와 같은 대역 사용)
🔸 속도 한계 (대용량 파일 전송엔 느림)

3️⃣ 실습

*️⃣ 블루투스 데이터 송수신 실습

💠 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에서 서로 보낸 문자를 확인 가능함

*️⃣ 블루투스 LED 제어 실습

💠 블루투스 방식으로 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

*️⃣ 블루투스 RGB LED 제어 실습

💠 블루투스 방식으로 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 색상 변경 확인
🔸 분홍색, 노랑색, 하늘색 순으로 변경되는 것을 볼 수 있음

KakaoTalk_20250406_163846184.mp4
⚠️ **GitHub.com Fallback** ⚠️