ESP32C6의 BLE는 ESP32C3의 5.0에서 5.3으로 성능이 향상되었다고 한다. 그렇다면 테스트 해봐야지.. 우선 가장 기본이 된는 BLE UART를 ESP32C6에서 BLE를 테스트해 보자.
뭔가 달라진 것이 있을 까 했지만 예제 코드는 기존과 동일하다. 새로운 칩을 테스트 해 보는것이니 뭐라도 새로운 스터디를 할 수 있도록 해보자.
기존 코드에서 LED관련 GPIO만 수정해서 코드 작성하자.
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
// LED 핀 정의
#define LED_PIN1 14
#define LED_PIN2 15
// BLE Server 및 Characteristic 포인터 선언
BLEServer *pServer = NULL;
BLECharacteristic * pTxCharacteristic; // TX Characteristic 포인터
bool deviceConnected = false; // 장치 연결 여부 플래그
bool oldDeviceConnected = false; // 이전 연결 상태 저장용 플래그
uint8_t txValue = 0; // 전송할 데이터 변수
// 서비스 및 Characteristic UUID 정의
#define SERVICE_UUID "6E400001-B5A3-F393-E0A9-E50E24DCCA9E" // UART 서비스 UUID
#define CHARACTERISTIC_UUID_RX "6E400002-B5A3-F393-E0A9-E50E24DCCA9E" // RX Characteristic UUID
#define CHARACTERISTIC_UUID_TX "6E400003-B5A3-F393-E0A9-E50E24DCCA9E" // TX Characteristic UUID
int servo_pwm1 = 0; // 서보 모터 PWM 변수 1
int servo_pwm2 = 0; // 서보 모터 PWM 변수 2
// BLE Server가 연결되었을 때 호출되는 콜백 클래스
class MyServerCallbacks: public BLEServerCallbacks {
// 장치가 연결되면 실행
void onConnect(BLEServer* pServer) {
deviceConnected = true; // 장치가 연결되었음을 표시
};
// 장치가 연결 해제되면 실행
void onDisconnect(BLEServer* pServer) {
deviceConnected = false; // 장치 연결 해제 상태로 설정
}
};
// BLE Characteristic에서 데이터를 쓸 때 호출되는 콜백 클래스
class MyCallbacks: public BLECharacteristicCallbacks {
// 데이터를 쓰면 호출됨
void onWrite(BLECharacteristic *pCharacteristic) {
String rxValue = pCharacteristic->getValue(); // 받은 값 읽기
// 받은 값이 있다면, 값을 출력
if (rxValue.length() > 0) {
for (int i = 0; i < rxValue.length(); i++) {
Serial.print(rxValue[i], HEX); // 16진수로 출력
Serial.print(" ");
}
Serial.println();
// 받은 값에 따라 LED 제어
if(rxValue[0] == 'a') // 'a'를 받으면 LED1 끄기
digitalWrite(LED_PIN1, 0);
else if(rxValue[0] == 'b') // 'b'를 받으면 LED1 켜기
digitalWrite(LED_PIN1, 1);
}
}
};
void setup() {
Serial.begin(115200); // 시리얼 통신 시작
// LED 핀을 출력으로 설정
pinMode(LED_PIN1, OUTPUT);
pinMode(LED_PIN2, OUTPUT);
// LED 초기 상태를 켬 (HIGH)
digitalWrite(LED_PIN1, 1);
digitalWrite(LED_PIN2, 1);
// BLE 장치 초기화
BLEDevice::init("BLE UART");
// BLE 서버 생성
pServer = BLEDevice::createServer();
pServer->setCallbacks(new MyServerCallbacks()); // 서버에 콜백 설정
// BLE 서비스 생성
BLEService *pService = pServer->createService(SERVICE_UUID);
// TX Characteristic 생성 (알림 가능)
pTxCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID_TX,
BLECharacteristic::PROPERTY_NOTIFY // notify 속성 설정
);
// Descriptor 추가 (알림을 받을 수 있도록 설정)
pTxCharacteristic->addDescriptor(new BLE2902());
// RX Characteristic 생성 (쓰기가 가능하도록 설정)
BLECharacteristic * pRxCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID_RX,
BLECharacteristic::PROPERTY_WRITE // write 속성 설정
);
// RX Characteristic에 콜백 설정
pRxCharacteristic->setCallbacks(new MyCallbacks());
// 서비스 시작
pService->start();
// 광고 시작 (BLE 장치 검색 가능)
pServer->getAdvertising()->start();
Serial.println("Waiting a client connection to notify...");
}
void loop() {
// 장치가 연결되었으면 LED_PIN2 끄기
if (deviceConnected) {
digitalWrite(LED_PIN2, 0);
}
// 장치가 연결되지 않았으면 LED_PIN2 켜기
else {
digitalWrite(LED_PIN2, 1);
}
// 연결이 끊어졌을 때 처리
if (!deviceConnected && oldDeviceConnected) {
delay(500); // Bluetooth 스택 준비 시간 대기
pServer->startAdvertising(); // 광고를 다시 시작
Serial.println("start advertising");
oldDeviceConnected = deviceConnected;
}
// 장치가 새로 연결되었을 때 처리
if (deviceConnected && !oldDeviceConnected) {
// 연결되었을 때 할 작업 (현재는 빈 상태)
oldDeviceConnected = deviceConnected;
}
}
프로그램을 다운로드 하면 BLE UART가 정상적으로 인식이 되고 접속되는 것을 확인 할 수 있다.
ESP32S3보드에서 기존에 테스트 했던 코드를 이용해서 Web Bluetooth 예제를 좀더 작성해 보면 좋을것 같다.
[ESP32S3-SSM] BLE 테스트 - Web Bluetooth API (Web BLE) 테스트
ESP32S3으로 소형의 테스트 보드를 제작 했으니 BLE 기능을 테스트 해보자기존에 BLE 테스트는 BLE앱을 이용해서 테스트 했었는데 이번에는 좀더 새로운 기술인 Web Bleutooth로 테스트 해보면 좋을것
nexp.tistory.com
Web Bluetooth 코드를 수정해서 간단히 웹페이지에서 ESP32C6의 BLE 기능을 테스트 해볼 수 있다.
반응형