본문 바로가기
ESP32

ESP32 BLE 초보사용자

by 모빌리티키즈 2023. 3. 6.
728x90

ESP32 기반 BLE(Bluetooth Low Energy)는 저전력 장거리 통신이 가능한 새로운 형태의 무선 통신 장치입니다. ESP32 Wi-Fi + 블루투스 SoC를 기반으로 하며, Wi-Fi와 블루투스 통신이 모두 필요한 애플리케이션을 위한 강력한 듀얼 코어 MCU를 제공합니다. BLE 모듈은 저전력 소비로 견고하고 안전한 무선 통신을 제공하도록 설계되었으며, GAP, GATT 및 ATT 프로토콜을 포함한 다양한 프로토콜을 지원합니다.

ESP32 BLE는 스마트폰, 태블릿, 노트북을 포함한 다양한 BLE 지원 장치와의 연결을 설정할 수 있습니다. 두 개 이상의 BLE 지원 장치 간의 데이터 교환을 용이하게 하는 데 사용될 수 있으며, 장치 간 통신을 가능하게 하는 데에도 사용될 수 있다. ESP32BLE은 근접 감지, 상태 모니터링, 홈 오토메이션 등 다양한 응용 분야를 가지고 있다.

ESP32BLE은 매우 효율적이고 비용 효율적이며 다양한 프로젝트에 사용할 수 있습니다. 다양한 통신 프로토콜을 지원하며 광범위한 개발 보드와 호환됩니다. ESP32BLE은 또한 일반 액세스, 일반 속성 프로파일, 서비스 검색 프로토콜 및 Security Manager 프로토콜을 포함한 다양한 통신 프로파일을 지원합니다.

ESP32BLE은 중앙 역할과 주변 역할을 모두 지원하며 데이터를 보내고 받을 수 있습니다. 또한 ESP32 BLE는 블루투스 5.0을 지원하여 향상된 데이터 전송 속도와 향상된 범위를 제공합니다. 여러 ESP32 장치가 서로 통신할 수 있는 메시 네트워킹도 지원한다.

ESP32BLE은 신뢰성이 높고 배터리 수명이 길기 때문에 다양한 용도에 이상적입니다. 또한 보안 인증 및 암호화를 지원하기 때문에 매우 안전합니다. 또한 ESP32 BLE는 구성 및 사용이 간편하며 다양한 개발 플랫폼과 호환됩니다.

이것은 BlueTooth Low Energy, BLE를 사용하여 휴대폰에 태양열 충전기 상태를 표시하는 새로운 기능을 추가하여 이전 기사의 확장입니다.

내 태양열 충전 컨트롤러는 내 차고에 있습니다. NRF24L01을 사용하여 컨트롤러 상태를 표시하기 위해 원격 디스플레이 장치가 제작되었습니다. 리모컨은 집 안의 고정 된 위치에있었습니다. 그렇게 편리하지 않았습니다. 컨트롤러 상태가 휴대폰에 표시되도록 장치를 만들기로 결정했습니다.

나는 2 가지 선택을했는데, 하나는 WiFi를 사용하고 다른 하나는 블루투스를 사용하고있었습니다. 나는 둘 다에 대해 아무것도 몰랐다. 블루투스는 암호가 필요하지 않으며 배우고 구현하기가 더 쉬울 수 있다고 생각했습니다. 그래서 블루투스를 선택했습니다. 그러나 내 프로그래밍 기술로는 진실과 거리가 멀었습니다.

ESP32를 다음 태양열 충전기 컨트롤러로 사용하기로 결정했습니다. 내장 메모리가 많고 속도는 Arduino 나노보다 10 배 빠릅니다. 무엇보다도 블루투스 및 WiFi 기능이 내장되어 있으며 저렴합니다.

ESP32 작동에 익숙해지기 위해 블루투스 디스플레이 프로젝트는 좋은 훈련장이 될 것입니다.

ESP32를 배우는 것은 생각보다 훨씬 어려웠습니다. 코드가 작동하는 데 몇 주가 걸렸습니다.

내가 이해하지 못하는 많은 프로그래밍 구문이 있습니다. 누구든지 Bluetooth 라이브러리에서 이벤트 처리기가 어떻게 작동하는지 알려 주시면 감사하겠습니다. 지금까지 내 프로그램은 며칠 동안 완벽하게 작동합니다.

마이크로 컨트롤러에 대한 지식이없는 초보자에게는 ESP32를 사용하거나 초보자이기 때문에 내 기사를 따르라고 조언하지 않습니다.

블루투스 배경이없는 나를 좋아한다면 블루투스 저에너지 링크의 모든 비디오를보십시오. 그들은 매우 유익합니다.

ESP32 블루투스에 대한 많은 비디오와 지침이 유튜브와 Instructable에 있습니다. 대부분은 Arduino IDE에 나열된 예제를 자세히 설명하고 있습니다. 그러나 예제 이외의 혁신은 드뭅니다.

처음에는 Arduino IDE의 예제에 따라 Bluetooth classic을 사용했습니다. 휴대폰과 ESP32 간의 통신을 설정할 수있었습니다. 그러나 신호 손실 또는 수동 연결 해제로 인해 연결이 끊어졌습니다. 그런 다음 ESP32를 재부팅하지 않으면 다시 연결할 수 없었습니다. 그러나 전원을 켠 후 마이크로 컨트롤러를 재부팅하면 큰 결과가 발생합니다.

"BluetoothSerial.h"및 "BluetoothSerial.ccp"를 읽음으로써 문제를 해결하려고했습니다. 나 같은 초보자에게는 기능과 매개 변수에 대한 의견이나 설명이없는 파일의 내용을 이해하려면 신성한 개입이 필요했습니다. 그 라이브러리 파일은 너무 사용자 친화적이지 않았습니다.


문제를 봤지만 해결책을 찾을 수 없었습니다. 아무도 방법을 알고 있다면 말해주십시오.

또한 누군가가 다음 문장, 특히 '->'에 대한 프로그래밍 구문을 설명 할 수 있습니까?

원격 BLE 서버의 서비스에서 특성에 대한 참조를 얻습니다.

pRemoteCharacteristic = pRemoteService->getCharacteristic(charUUID);

지식 부족은 나를위한 변명이 아닙니다. 엔지니어의 주요 임무는 징징 대지 않고 일을 작동시키는 것입니다.

몇 주간의 시행착오 끝에 이해할 수 없는 코드가 많아도 Bluetooth Low Energy를 사용하여 성공적으로 연결 및 연결 해제를 할 수 있었습니다.

이 기사를 게시하려는 나의 목표는 나 자신에 대한 자세한 기록을 유지하고 나와 같은 블루투스 배경이없는 사람에게 휴대 전화를 사용하여 블루투스 저에너지를 통해 원격 장치를 제어하는 방법을 보여주는 것입니다.

공급

컴퓨터.

휴대 전화.

ESP-VROOM-32D 또는 동급.

NRF24L01 32개. 이것은 선택 사항입니다. ESP24는 NRF01L<>에서 데이터를 가져오는 대신 전송할 일부 데이터를 자체 생성할 수 있습니다.

USB 케이블.

1단계: 마이크로 컨트롤러 요구 사항

ESP32에 대한 자세한 내용은 ESP32 데이터 시트를 참조하십시오.

설정 방법과 사용 방법에 대해 설명하는 많은 비디오와 기사가 있습니다. 나는 그들을 여기에 제시하지 않는다.


내 태양 광 컨트롤러 프로젝트에 필요한 기능.

A. 무선 데이터 통신.

ESP32에는 와이파이와 블루투스가 있습니다.

B. 유선 데이터 통신.

ESP32에는 SPI 및 I2C가 있습니다.

C. 벅 컨버터용 PWM.

ESP32 PWM 주파수는 200KHz보다 높습니다. 그것으로 충분합니다.

D. 아날로그-디지털 변환기. ESP32에는 12비트 ADC가 있습니다.

충분히 좋은 것 같습니다. 그러나 데이터 시트를 읽으면 ADC INL은 +/- 12 비트입니다. 이는 ADC 분해능에서 마이너스 3.5비트에 해당합니다. ADC의 유효 비트는 8.5비트입니다. 그것은 내 프로젝트에 충분하지 않습니다.

E. 입력, 출력 및 밸런싱 스위치를 제어하는 6개 이상의 GPIO.

ESP32에는 40개의 GPIO 핀이 있지만 대부분은 GPIO로 자유롭게 사용할 수 없습니다.

2단계: GPIO에 대한 간략한 설명

GPIO 40 핀이 있으며 GPIO 20,24,28-31, 37, 38의 경우 ESP32 보드에서 찾지 못했습니다.

대부분의 GPIO 핀에는 보조 기능이 있습니다. 입력 및 출력으로 자유롭게 사용할 수 없습니다. 내가 만든 치트 시트에서 볼 수 있듯이 연한 녹색의 핀 9개만 범용 입력 출력으로 인정됩니다.

2개의 SPI 버스, VSPI 및 HSPI가 있습니다. 대부분의 표준 라이브러리에서는 VSPI를 사용합니다. 이러한 핀을 해제하는 HSPI(MOSI=G13 MISO=G12 CLK=G14 CS=G15)를 사용할 필요가 없습니다.

I2C의 경우 SDA=G21 및 SCL=G22를 사용하는 대부분의 표준 라이브러리입니다. 이러한 핀 할당은 Wire.begin(SDA, SCL)에 의해 변경될 수 있습니다. 하지만 왜 귀찮게.

G34 - G39는 입력 전용 핀용입니다. ADC 측정 또는 디지털 입력에 사용하여 다른 핀을 확보하십시오. G36 및 G39는 홀 효과 센서 핀용입니다. 홀 효과 센서를 작동시키거나 다른 용도로 사용할 수 없습니다. 쓸모가 없습니다. 활성화하지 않습니다.

G25, G26 보조 함수는 dacWrite(8, i) 또는 dacWrite(25, I)에 의한 26비트 디지털-아날로그 변환기 프로그래밍입니다.

플랫폼 IO는 디버깅을 위해 GPIO 12에서 15를 사용합니다. 플랫폼 IO를 사용하지 않습니다. 따라서 이러한 핀은 GPIO로 사용하는 것이 좋습니다.

WIFI가 활성화된 경우 모든 ADC2를 사용할 수 없습니다. 그들은 주황색입니다.

밑줄이 있는 GPIO의 경우 부팅 중에 PWM 신호가 있습니다. 이를 사용하는 경우 회로가 부팅 중에 PWM을 견딜 수 있는지 확인하십시오.

지금까지 아직 터치 핀을 사용하지 않았습니다. 그래서 그 핀에 대한 의견이 없습니다.

3 단계 : RF 라디오 NRF24L01

이전 프로젝트에서 NRF24L01은 태양열 충전기 데이터를 방송하는 데 사용되었습니다. 이제 ESP32는 NRF24L01을 사용하여 방송 된 데이터를 캡처하고 BLE를 통해 텍스트 형식의 데이터를 휴대폰으로 재전송합니다.

NRF24L01은 ESP32와 휴대폰 간의 통신을 테스트하기 위한 것이라면 필요하지 않습니다. 수신 데이터는 ESP32에 의해 생성 된 모든 유형의 데이터로 대체 될 수 있습니다.

NRF24L01은 블루투스에 비해 장점이 있습니다. 동일한 주소를 가진 모든 NRF24L01은 데이터를 보내고받을 수 있습니다. 블루투스의 경우 페어링 및 연결되면 다른 모든 장치를 차단합니다.

NRF24L01용 프로그래밍 코드.

NRFLite > Basic_RX_ESP32 > 예제에서 복사 및 수정되었습니다.

NRF24L01을 사용하려면 2개의 라이브러리가 필요합니다

#include // SPI library

#include // NRF24L01 library

Wires connections

// Radio ESP32

// CE -> 4

// CSN -> 5

// MOSI -> 23

// MISO -> 19

// SCK -> 18

// IRQ -> No connection

// VCC -> 3.3V

// GND -> GND

// Defining and config the NRF24L01

#define RADIO_TX_ID 13 // Transmitter Radio ID. Not use in receiving

#define DESTINATION_RADIO_ID 18 // The Receiving Radio ID.

#define RF_CHAN 108 // Channel used by NRF24L01

#define PIN_RADIO_CE 4 // CE pin

#define PIN_RADIO_CSN 5 // CSN pin

#define PIN_RADIO_MOSI 23 //MOSI pin

#define PIN_RADIO_MISO 19 //MISO pin

#define PIN_RADIO_SCK 18 //SCK pin.

NRFLite _radio; // using the NRF24L01.

Codes Inside the setup()

// configure the NRF24L01 pins

SPI.begin(PIN_RADIO_SCK, PIN_RADIO_MISO, PIN_RADIO_MOSI, PIN_RADIO_CSN);

// Indicate to NRFLite that it should not call SPI.begin() during initialization since it has already been done. uint8_t callSpiBegin = 0;

//Check for connection

if (!_radio.init(DESTINATION_RADIO_ID, PIN_RADIO_CE, PIN_RADIO_CSN, NRFLite::BITRATE250KBPS, RF_CHAN, callSpiBegin)) { Serial.println(" Initial communicate with radio fail"); while (1);

else Serial.println(" NRF24L01 Connected");

Codes inside the loop()

// wait for the availability of data and store the data to Vm.

while (_radio.hasData()) {

_radio.readData(&vm);

....

}

단계 4: BLE 프로그래밍 코드

ble_ex1.ino를 다운로드하고 아두이노 IDE를 시작하고 다운로드한 파일을 엽니다.

ble_ex1.ino는 Examples>ESP32 BLE Ardinio> BLE uart에서 수정 된 사본입니다.

UUID를 고유하게 만들고 144 행으로 이동하여 UUID 링크를 클릭하고 3 개의 버전 -4 UUID를 생성하십시오. 그런 다음 146,147,148행의 UUID를 새로 생성된 UUID로 바꿉니다. 그런 다음 194 행으로 이동하여 "태양열 충전기"를 "원하는 이름"으로 변경하십시오.

코드 설명

#include "BLEDevice.h"

#include "BLEServer.h"

#include "BLEUtils.h"

#include "BLE2902.h"

BLEServer *pServer = NULL;

BLECharacteristic * pTxCharacteristic;

모든 블루투스 관련 코드에 대해 거의 알지 못하기 때문에 설명이 없습니다. 내가 아는 것은 BLE 라이브러리와 일부 주소 포인터입니다. 나는 그들이 작동하기 때문에 맹목적으로 그 코드를 따르고 있습니다. 나중에 더 많이 알면이 기사를 업데이트하겠습니다.

33-40행

#define RADIO_TX_ID 13 // Transmitter Radio ID. Not use in this program

#define DESTINATION_RADIO_ID 18 // Our Receiving Radio ID.

#define RF_CHAN 108 //Using Radio Channel

#define PIN_RADIO_CE 4

#define PIN_RADIO_CSN 5

#define PIN_RADIO_MOSI 23

#define PIN_RADIO_MISO 19

#define PIN_RADIO_SCK 18

NRFLite _radio;

NRF24L01 구성을 정의합니다. NRF24L01을 사용하지 않는 경우 삭제하십시오.

Line 43 to 53

char strf1[10];

char strf2[10];

char strf3[10];

char strout1[40];

char strout2[40];

char strout3[40];

char strout4[40];

char strout5[40];

char strout6[40];

char strout7[40];

그들은 휴대 전화로 전송 된 문자 메시지를 저장하는 데 사용되는 char 배열입니다.

라인 54

uint8_t BCdata[40];

BCdata는 블루투스에 의해 배송되는 정수 배열입니다.

233 - 258행에서 블루투스 함수는 데이터 전송을 수행합니다.

pTxCharacteristic->setValue(BCdata, strlen(strout1));

pTxCharacteristic->notify();

uint8_t 배열이 필요합니다. 컴파일러는 char 배열을 허용하지 않습니다.

char 배열에서 uin8_t 배열로의 변환은 다음과 같이 수행됩니다.

for(int i=0;i<32;i++) BCdata[i] = strout1[i];

그건 그렇고, 블루투스 함수는 최대 32 바이트 만 전송, 텍스트 메시지에는 배열 끝에 \n 문자와 NULL 문자가 필요합니다. 즉, 메시지에 30바이트의 데이터만 있습니다. 배열 길이는 32바이트일 수 있습니다. 배열을 오버런하고 프로그램을 중단하는 부주의 한 실수를 피하기 위해 안전을 위해 배열 길이를 40으로 설정했습니다.

56-136행

They are for reading and interpreting the data from NRF24L01. Delete them if not using NRF24L01.

Line 139, 140

bool deviceConnected = false;

bool oldDeviceConnected = false;

Line 150 to 158

class MyServerCallbacks: public BLEServerCallbacks { void onConnect(BLEServer* pServer) { deviceConnected = true; };

void onDisconnect(BLEServer* pServer) { deviceConnected = false; } };

연결 상태를 정의합니다. 그러나 나는 그것이 무엇을 의미하는지 모른다.

160-174행

class MyCallbacks: public BLECharacteristicCallbacks { void onWrite(BLECharacteristic *pCharacteristic) { std::string rxValue = pCharacteristic->getValue();

if (rxValue.length() > 0) { Serial.println("*********");

Serial.print("Received Value: "); for (int i = 0; i < rxValue.length(); i++) Serial.print(rxValue[i]);

Serial.println(); Serial.println("*********"); } } };

rxValue는 휴대폰에서 ESP32로 전송되는 메시지입니다. ESP32의 명령으로 사용하겠습니다.

라인 176

라디오 패킷 vm; 이것은 NRF24L01에 의해 전송 된 데이터 구조입니다.

183-191행

SPI.begin(PIN_RADIO_SCK, PIN_RADIO_MISO, PIN_RADIO_MOSI, PIN_RADIO_CSN);

이미 완료되었으므로 초기화 중에 SPI.begin()을 호출해서는 안 된다는 것을 NRFLite에 나타냅니다.

uint8_t 호출SpiBegin = 0;

if (!_radio.init(DESTINATION_RADIO_ID, PIN_RADIO_CE, PIN_RADIO_CSN, NRFLite::BITRATE250KBPS, RF_CHAN, callSpiBegin)) { Serial.println(" Initial communication with radio fail");

동안 (1); 여기서 영원히 기다려. }

else Serial.println("NRF24L01 Connected");

이는 SPI 버스와 NRF24N01을 초기화하기 위한 것이다. NRF24L01을 사용하지 않는 경우 삭제할 수 있습니다.

196에서 223 행 이것은 BLE를 초기화하는 것입니다.이 외에는 무엇을하고 있는지 모르겠습니다.

226-275행

루프()

NRF24L01에서 사용 가능한 데이터가 있는지 확인하고, 사용 가능한 데이터와 BLE가 연결된 경우, 데이터를 가져와 문자 메시지로 변환하여 BLE를 통해 보냅니다. 휴대 전화 BLE 연결이 되었는지 확인합니다.

5 단계 : 휴대폰 설정

더 예쁜 사용자 인터페이스를 위해 MIT App Inventor를 사용하여 나만의 휴대폰 APP를 만들 수 있습니다. 하지만 게으르다, 나는 내 휴대 전화에 Play 스토어에서 직렬 블루투스 터미널을 설치했다. 외관은 좋지 않지만 작업을 완료했습니다.

직렬 블루투스 터미널을 설치 한 후 ESP32의 전원을 켜고 Arduino 프로그램을 ESP32에 업로드하십시오. 업로드 할 때 부팅 버튼을 길게 누른 다음 재설정 버튼을 눌러 프로그램을 시작하는 것을 좋아하지 않습니다. 업로드를보다 편리하게 할 수있는 방법이 있어야합니다.

휴대폰 설정

휴대폰 블루투스를 켜고 장치를 검색합니다. 프로그램 라인 194에서 변경한 장치 이름을 찾아야 합니다. 그런 다음 해당 장치와 페어링하고 직렬 블루투스 터미널 앱을 엽니다.

그림의 단계를 따릅니다. 5단계에 있고 휴대폰에 ESP32의 메시지가 표시되고 ESP32에 대한 메시지가 직렬 모니터에 표시되는 경우. 그런 다음 휴대 전화 블루투스의 전원을 껐다가 켭니다. 직렬 블루투스 터미널 앱이 장치에 다시 연결할 수 있습니다.

 

728x90