006.合宙ESP32-C3+蓝牙调试器通过BLE发送接收数据教程

2023-11-07 18:59

本文主要是介绍006.合宙ESP32-C3+蓝牙调试器通过BLE发送接收数据教程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

合宙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字节
0xA50x5A

四、代码框架

/*********************头文件*********************/
#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;
/**/        };
/**/    
/**/        void onDisconnect(BLEServer* pServer) 
/**/        {
/**/            deviceConnected = false;
/**/        }
/**/    };
/**/    void getBlueData(uint8_t *Value);
/**/    uint8_t modes[8];
/**/    class MyCallbacks: public BLECharacteristicCallbacks 
/**/    {
/**/        void onWrite(BLECharacteristic *pCharacteristic) 
/**/        {
/**/            std::string rxValue = pCharacteristic->getValue();
/**/            if (rxValue.length() > 0) 
/**/            {
/**/                for (int i = 0; i < rxValue.length(); i++)
/**/                {
/**/                    modes[i]=rxValue[i];
/**/                }
/**/                getBlueData(modes);
/**/            }
/**/        }
/**/    };
/**/    void BLEinit()
/**/    {
/**/        BLEDevice::init("BalanceCar");
/**/        pServer = BLEDevice::createServer();
/**/        pServer->setCallbacks(new MyServerCallbacks());
/**/        BLEService *pService = pServer->createService(SERVICE_UUID);
/**/        pTxCharacteristic = pService->createCharacteristic(CHARACTERISTIC_UUID_TX,BLECharacteristic::PROPERTY_NOTIFY);                      
/**/        pTxCharacteristic->addDescriptor(new BLE2902());
/**/        BLECharacteristic * pRxCharacteristic = pService->createCharacteristic(CHARACTERISTIC_UUID_RX,BLECharacteristic::PROPERTY_WRITE);
/**/        pRxCharacteristic->setCallbacks(new MyCallbacks());
/**/        pService->start();
/**/        pServer->getAdvertising()->start();
/**/        Serial.println("BLE is OK.");
/**/    }
/**/#endif 
/************************************************/void setup() 
{Serial.begin(115200);#if Step1_BlueToothBLEinit();#endifBClock_Init(1000);  //定时器单位为ms,发送数据至手机的频率
}//
以上不需要做任何修改
//
//+++++_____+++++_____+++++_____+++++_____+++++_____以上不需要做任何修改_____+++++_____+++++_____+++++_____+++++_____+++++//
//
以上不需要做任何修改
////
以下不需要做任何修改
//
//+++++_____+++++_____+++++_____+++++_____+++++_____以下不需要做任何修改_____+++++_____+++++_____+++++_____+++++_____+++++//
//
以下不需要做任何修改
//static void IRAM_ATTR Timer0_CallBack(void)
{BLEsendflag=true;
}void BClock_Init(int duty_ms)
{timer=timerBegin(0,80,true);timerAttachInterrupt(timer,Timer0_CallBack,true);timerAlarmWrite(timer,1000*duty_ms,true); // 单位us,定时模式,10mstimerAlarmEnable(timer); // 启动定时器
}void Short2Byte(short i,uint8_t *byte)
{unsigned long longdata=0;longdata=*(unsigned long *)&i;byte[1]=(longdata&0xFF00)>>8;byte[0]=(longdata&0x00FF);
}void Int2Byte(int i,uint8_t *byte)
{unsigned long longdata=0;longdata=*(unsigned long *)&i;byte[3]=(longdata&0xFF000000)>>24;byte[2]=(longdata&0x00FF0000)>>16;byte[1]=(longdata&0x0000FF00)>>8;byte[0]=(longdata&0x000000FF);
}void Float2Byte(float f,uint8_t *byte)
{unsigned long longdata=0;longdata=*(unsigned long *)&f;byte[3]=(longdata&0xFF000000)>>24;byte[2]=(longdata&0x00FF0000)>>16;byte[1]=(longdata&0x0000FF00)>>8;byte[0]=(longdata&0x000000FF);
}

自己需要做的只是在中间加上 void loop()

五、手机——>单片机解码

手机发送5个数据 bool(MotorStatus)、int16_t(kp)、int16_t(kd)、int16_t(ksp)、int16_t(ksi)
在这里插入图片描述

/*****************蓝牙发送接收数据*****************/
/**/#if Step1_BlueTooth
/**/    bool MotorStatus;//控制电机开关
/**/    int16_t kp,kd,ksp,ksi;
/**/    //以上为手机发送来的数据
/**/    bool BLEsendflag=false;//定时发送标志
/**/#endif  
/************************************************/void loop() 
{}#if Step1_BlueTooth
/**/    void getBlueData(uint8_t *Value)
/**/    {
/**/        MotorStatus=Value[1];
/**/        kp=(Value[3]<<8)+Value[2];  
/**/        kp=(Value[3]<<8)+Value[2];
/**/        kd=(Value[5]<<8)+Value[4];
/**/        ksp=(Value[7]<<8)+Value[6];
/**/        ksi=(Value[9]<<8)+Value[8];
/**/        Serial.printf("MotorStatus=%d,kp=%d,kd=%d,ksp=%d,ksi=%d\n",MotorStatus,kp,kd,ksp,ksi);
/**/    }
#endif 

六、单片机——>手机编码

单片机发送3个数据 short(PwmOut)、int(Encode_L)、float(Angle)
在这里插入图片描述

/*****************蓝牙发送接收数据*****************/
/**/#if Step1_BlueTooth
/**/    bool BLEsendflag=false;//定时发送标志/**/    
/**/    uint8_t BLEBUF[13];// 数据包的顺序为BOOL(1)/BYTE(1)/SHORT(2)/INT(4)/FLOAT4)
/**/    short PwmOut=-12;
/**/    int Encode_L=-34;
/**/    float Angle=5.6;
/**/#endif  
/************************************************/void loop() 
{if(deviceConnected&BLEsendflag){BLEsendflag=false;BLEBUF[0]=0xA5;//包头Short2Byte(PwmOut,&BLEBUF[1]);Int2Byte(PwmOut,&BLEBUF[3]);Float2Byte(Angle,&BLEBUF[7]);BLEBUF[11]=(uint8_t)((BLEBUF[1]+BLEBUF[2]+BLEBUF[3]+BLEBUF[4]+BLEBUF[5]+BLEBUF[6]+BLEBUF[7]+BLEBUF[8]+BLEBUF[9]+BLEBUF[10])&0xFF);BLEBUF[12]=0x5A;//包尾pTxCharacteristic->setValue(BLEBUF,13);pTxCharacteristic->notify();}
}

这篇关于006.合宙ESP32-C3+蓝牙调试器通过BLE发送接收数据教程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/365646

相关文章

Ubuntu固定虚拟机ip地址的方法教程

《Ubuntu固定虚拟机ip地址的方法教程》本文详细介绍了如何在Ubuntu虚拟机中固定IP地址,包括检查和编辑`/etc/apt/sources.list`文件、更新网络配置文件以及使用Networ... 1、由于虚拟机网络是桥接,所以ip地址会不停地变化,接下来我们就讲述ip如何固定 2、如果apt安

PyCharm 接入 DeepSeek最新完整教程

《PyCharm接入DeepSeek最新完整教程》文章介绍了DeepSeek-V3模型的性能提升以及如何在PyCharm中接入和使用DeepSeek进行代码开发,本文通过图文并茂的形式给大家介绍的... 目录DeepSeek-V3效果演示创建API Key在PyCharm中下载Continue插件配置Con

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

Spring Boot整合log4j2日志配置的详细教程

《SpringBoot整合log4j2日志配置的详细教程》:本文主要介绍SpringBoot项目中整合Log4j2日志框架的步骤和配置,包括常用日志框架的比较、配置参数介绍、Log4j2配置详解... 目录前言一、常用日志框架二、配置参数介绍1. 日志级别2. 输出形式3. 日志格式3.1 PatternL

MySQL8.2.0安装教程分享

《MySQL8.2.0安装教程分享》这篇文章详细介绍了如何在Windows系统上安装MySQL数据库软件,包括下载、安装、配置和设置环境变量的步骤... 目录mysql的安装图文1.python访问网址2javascript.点击3.进入Downloads向下滑动4.选择Community Server5.

CentOS系统Maven安装教程分享

《CentOS系统Maven安装教程分享》本文介绍了如何在CentOS系统中安装Maven,并提供了一个简单的实际应用案例,安装Maven需要先安装Java和设置环境变量,Maven可以自动管理项目的... 目录准备工作下载并安装Maven常见问题及解决方法实际应用案例总结Maven是一个流行的项目管理工具

本地私有化部署DeepSeek模型的详细教程

《本地私有化部署DeepSeek模型的详细教程》DeepSeek模型是一种强大的语言模型,本地私有化部署可以让用户在自己的环境中安全、高效地使用该模型,避免数据传输到外部带来的安全风险,同时也能根据自... 目录一、引言二、环境准备(一)硬件要求(二)软件要求(三)创建虚拟环境三、安装依赖库四、获取 Dee

MySql9.1.0安装详细教程(最新推荐)

《MySql9.1.0安装详细教程(最新推荐)》MySQL是一个流行的关系型数据库管理系统,支持多线程和多种数据库连接途径,能够处理上千万条记录的大型数据库,本文介绍MySql9.1.0安装详细教程,... 目录mysql介绍:一、下载 Mysql 安装文件二、Mysql 安装教程三、环境配置1.右击此电脑

在idea中使用mysql数据库超详细教程

《在idea中使用mysql数据库超详细教程》:本文主要介绍如何在IntelliJIDEA中连接MySQL数据库,并使用控制台执行SQL语句,还详细讲解了如何使用MyBatisGenerator快... 目录一、连接mysql二、使用mysql三、快速生成实体、接口、sql文件总结一、连接mysql在ID