合宙ESP32-C3+蓝牙调试器通过BLE发送接收数据教程
一、问题提出
在平衡小车制作过程中,需要对KP/KD/KSP/KSI等PID系数进行调试,而平衡小车无法通过USB等进行有线调试,而ESP32-C3自带蓝牙+WIFI,使用WIFI比较吃算力,故选择通过蓝牙进行调参,同时能够将Angle/Encoder/PWM等数据回传至手机端进行查看。
二、合宙ESP32-C3自带蓝牙分析
前期通过查找资料,发现合宙ESP32-C3自带蓝牙不是经典蓝牙,无法使用BluetoothSerial.h进行编程,只能通过低功耗BLE使用蓝牙。
下面为需要用到的库,PIO环境自带,无需下载。
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
具体原理,没有理解明白,不在赘述。
三、蓝牙调试器分析
蓝牙调试器有3种模式,分别为对话模式、专业调试、按钮控制
需要特别注意的是其通信设置,也就是通信协议。
数据包结构为
包头 | 数据 | 校验和 | 包尾 |
---|---|---|---|
1字节 | bool为1字节 | 1字节 | 1字节 |
0xA5 | 0x5A |
四、代码框架
/*********************头文件*********************/
#include <Arduino.h>
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
/************************************************/
/********************基本设置********************/
/**/ hw_timer_t *timer=NULL;
/**/ void BClock_Init(int duty_ms);
/**/ static void IRAM_ATTR Timer0_CallBack(void); //以上为定时器
/**/ void Short2Byte(short i,uint8_t *byte);
/**/ void Int2Byte(int i,uint8_t *byte);
/**/ void Float2Byte(float f,uint8_t *byte); //以上为数据类型转BYTE
/************************************************/
#define Step1_BlueTooth 1
/*********************蓝牙BLE********************/
/**/#if Step1_BlueTooth
/**/ BLEServer *pServer = NULL;
/**/ BLECharacteristic * pTxCharacteristic;
/**/ bool deviceConnected = false;
/**/ bool oldDeviceConnected = false;
/**/ uint8_t txValue = 0;
/**/ #define SERVICE_UUID "6E400001-B5A3-F393-E0A9-E50E24DCCA9E" // UART service UUID
/**/ #define CHARACTERISTIC_UUID_RX "6E400002-B5A3-F393-E0A9-E50E24DCCA9E"
/**/ #define CHARACTERISTIC_UUID_TX "6E400003-B5A3-F393-E0A9-E50E24DCCA9E"
/**/ class MyServerCallbacks: public BLEServerCallbacks
/**/ {
/**/ void onConnect(BLEServer* pServer)
/**/ {
/**/ deviceConnected = true;