esp32蓝牙传输数据

在使用代码时套用的是Arduino中的BLE代码,但是里面传输的是广播一个数字。
现在要将从模块里获得的实验数据通过蓝牙传送到手机里,而不是一个指定的数字,查了资料都是一些经典的,各位带佬指点一下!

img

可以将从模块获得的实验数据作为变量传递给 BLECharacteristic.setValue() 函数。以下是如何修改你的代码来传递实验数据:
 
首先,在 setup() 函数中定义数据变量:
 

float data_value = 0.0;

请注意,data_value的类型应该与你所传输的实验数据的类型相匹配。
 
在 loop() 函数中获取实验数据,并将其存储在变量data_value中:
 

// 示例代码,获取实验数据,并将其存储在变量中
data_value = read_experiment_data();

修改 sendData() 函数,将实验数据传递给蓝牙从设备。首先,将value变量定义为一个字符数组,用于存储实验数据的字符串表示:
 

char value[20];

请注意,数组的大小应该足够大,以容纳实验数据的字符串表示。
 
将data_value转换为字符串,并将其赋值给value数组:
 

dtostrf(data_value, 7, 2, value);

dtostrf() 函数将 data_value 转换为字符串,并将结果存储在value中。请注意,第一个参数指定要转换的值,第二个参数指定整数位数,第三个参数指定小数位数,第四个参数指定结果存储在哪个字符串数组中。
 
使用 setValue() 函数将value数组传递给蓝牙从设备。在这里,我们需要将value强制转换为uint8_t*类型:

experimentCharacteristic.setValue((uint8_t*)value, strlen(value));

注意,setValue()函数的第一个参数是一个指向要传输的数据的指针,第二个参数是数据的长度。
 
完整代码如下:
 

#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>

BLEServer* pServer = NULL;
BLECharacteristic* experimentCharacteristic = NULL;
bool deviceConnected = false;
bool oldDeviceConnected = false;
float data_value = 0.0;

char value[20];

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

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

void setup() {
  Serial.begin(115200);

  BLEDevice::init("Experiment");
  pServer = BLEDevice::createServer();
  pServer->setCallbacks(new MyServerCallbacks());

  BLEService* pService = pServer->createService(BLEUUID("6E400001-B5A3-F393-E0A9-E50E24DCCA9E"));

  experimentCharacteristic = pService->createCharacteristic(
                      BLEUUID("6E400002-B5A3-F393-E0A9-E50E24DCCA9E"),
                      BLECharacteristic::PROPERTY_NOTIFY |
                      BLECharacteristic::PROPERTY_READ   |
                      BLECharacteristic::PROPERTY_WRITE  |
                      BLECharacteristic::PROPERTY_WRITE_NR
                    );
                      
  pService->start();
                        
  BLEAdvertising* pAdvertising = BLEDevice::getAdvertising();
  pAdvertising->addServiceUUID(BLEUUID(pService->getUUID()));
  pAdvertising->setScanResponse(true);
  pAdvertising->setMinPreferred(0x0);  
  pAdvertising->setMinPreferred(0x12);
  BLEDevice::startAdvertising();
}

void sendData() {
  
  dtostrf(data_value, 7, 2, value);
  
  experimentCharacteristic->setValue((uint8_t*)value, strlen(value));
  experimentCharacteristic->notify();
  Serial.print("Sent Value: ");
  Serial.println(value);
}

void loop() {

  // 获取实验数据
  data_value = read_experiment_data();
  
  if (deviceConnected) {
    sendData();
  }
  
  delay(500);
}

 
在上面的代码示例中,read_experiment_data()是一个函数或方法,用于从模块获取实验数据。我们还是需要根据实际情况编写此函数。
注意,由于蓝牙从设备需要以固定的速率接收数据,所以需要以合适的频率发送实验数据,以避免数据溢出或丢失。在上面的示例代码中,我们使用了delay(500)函数来控制发送数据的速率。可以根据需要或实验要求调整发送数据的频率。

  • 这篇博客: arduino的esp32环境搭建(不需要翻墙,不需要离线安装)中的 第一步,配置附加开发板管理器网址: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 写下https://dl.espressif.com/dl/package_esp32_index.json

    首先可以尝试在网页上这个文件是否可以打开,如果能正常打开就没问题,直接写在“文件-》首选项”里面

    如果网页打不开,那就说明这个网站被和谐了,需要用迅雷下载这个文件,直接将上面的网址在迅雷中新建,迅雷基本是可以下到的,也可以尝试其他下载软件。

    下载到package_esp32_index.json文件后放置到C:\Users\Administrator\AppData\Local\Arduino15

    目录下即可,这个目录可以点击首选项中进入。

     

     到这里就设置好了开发板的管理器。