본문 바로가기
esp32 보드활용

esp32 블루투스 제어

by SwMaker_Jun 2026. 9. 2.
728x90
반응형

 

 

 

1. 블루투스 설정과 내장 led제어

import bluetooth
import time
from machine import Pin

# ==========================================================
# ⭐ [학생 수정 영역] 여기에 고유한 블루투스 이름을 입력하세요!
# (예: "ESP32_1반05번_철수", "ESP32_2조")
DEVICE_NAME = "ESP32_1반01번"
# ==========================================================

# 내장 LED 핀 (수신 테스트용)
led = Pin(2, Pin.OUT)

class BLEUART:
    def __init__(self, name=DEVICE_NAME):
        self.ble = bluetooth.BLE()
        self.ble.active(True)
        self.ble.irq(self._irq)
        
        # Nordic UART Service (NUS) 표준 UUID 정의
        UART_UUID = bluetooth.UUID("6E400001-B5A3-F393-E0A9-E50E24DCCA9E")
        TX_UUID = bluetooth.UUID("6E400003-B5A3-F393-E0A9-E50E24DCCA9E")
        RX_UUID = bluetooth.UUID("6E400002-B5A3-F393-E0A9-E50E24DCCA9E")
        
        UART_SERVICE = (
            UART_UUID,
            (
                (TX_UUID, bluetooth.FLAG_READ | bluetooth.FLAG_NOTIFY),
                (RX_UUID, bluetooth.FLAG_WRITE),
            ),
        )
        
        services = (UART_SERVICE,)
        ((self.tx, self.rx),) = self.ble.gatts_register_services(services)
        
        self._connections = set()
        self.device_name = name
        self._advertise()

    def _irq(self, event, data):
        # 스마트폰이 연결되었을 때
        if event == 1:
            conn_handle, _, _ = data
            self._connections.add(conn_handle)
            print(f"\n>> 스마트폰 연결 성공! [장치명: {self.device_name}]")
            
        # 스마트폰 연결이 끊어졌을 때
        elif event == 2:
            conn_handle, _, _ = data
            if conn_handle in self._connections:
                self._connections.remove(conn_handle)
            print("\n>> 연결 끊김. 다시 검색 신호를 보냅니다...")
            self._advertise()
            
        # 스마트폰에서 데이터를 전송했을 때
        elif event == 3:
            conn_handle, value_handle = data
            if value_handle == self.rx:
                received = self.ble.gatts_read(self.rx).decode().strip()
                print(f"[수신 데이터]: {received}")
                
                # 간단한 LED 제어 실습 연계
                if received == "ON":
                    led.value(1)
                    self.send("LED가 켜졌습니다.")
                elif received == "OFF":
                    led.value(0)
                    self.send("LED가 꺼졌습니다.")

    def send(self, data):
        """스마트폰으로 데이터 전송"""
        for conn_handle in self._connections:
            self.ble.gatts_notify(conn_handle, self.tx, data + "\n")

    def _advertise(self):
        """블루투스 장치 이름을 주변에 브로드캐스팅"""
        name_bytes = bytes(self.device_name, 'utf-8')
        adv_payload = bytearray(
            b'\x02\x01\x06' +                     # Flags 모드
            bytes([len(name_bytes) + 1, 0x09]) + # 0x09: Complete Local Name
            name_bytes
        )
        self.ble.gap_advertise(100000, adv_payload)
        print(f"블루투스 검색 대기 중... [장치명: {self.device_name}]")

# 블루투스 서버 시작
ble = BLEUART(DEVICE_NAME)

print("준비 완료. 스마트폰 앱에서 블루투스를 연결하세요.")

 

 

2. AI 활용 웹앱 만들고 활용하기

728x90
반응형