ESP32直连Phyphox任意传输测量量通过ESP32给手机物理工坊即Phyphox编程或创作实验,数据的收发是按照小端序Little Endian来存储的。知道了这个道理,我们能够攻克使用Phyphox官方BLE库来实验创作的两处困难: 1.使用官方BLE库创作实验,只能传输float浮点型数据,不能传输int整型、char字符或字符数组。官方BLE库没给其他类型数据的接口函数。大概官方以为Phyphox里面没有字符或字符数组类型变量,因此也就无需创作者使用这些类型。 2.使用官方BLE库创作实验,最多只能传输5个浮点型变量,算上时间,最多6个。在官方库的源码里: void PhyphoxBLE::write(float& f1, float& f2, float& f3, float& f4) { float array[4] = {f1, f2, f3, f4}; data = reinterpret_cast<uint8_t*>(array); dataCharacteristic->setValue(data,16); dataCharacteristic->notify(); }
官方源码为什么要这样一个一个的函数重写来实现传输数据的用意,我们难于知道;但是,Phyphox Editor里面允许用户传输有格式字符串formattedString,并指示出预先设定的分隔符separator。如果我们在传输数据时,把多个传感器的测量数据提前拼接成字符串,再使用formattedString传输,由Phyphox Editor拆分开,也就实现了多数据传输了。 这里只测试字符串,以示道理。 仍然使用ESP32 BLE Arduino里的BLE_notify.ino修改。不改动的部分,以……表示。 原来的代码: #include <BLEDevice.h> #include <BLEServer.h> #include <BLEUtils.h> #include <BLE2902.h>
BLEServer* pServer = NULL; BLECharacteristic* pCharacteristic = NULL; bool deviceConnected = false; bool oldDeviceConnected = false;
uint8_t value = 0;//这里需要改动
#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b" #define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
……
void loop() {//以下需要改动 // notify changed value if (deviceConnected) { pCharacteristic->setValue(&value, 1); pCharacteristic->notify(); value++; delay(10); } …… }
改动后的代码: #include <BLEDevice.h> #include <BLEServer.h> #include <BLEUtils.h> #include <BLE2902.h>
BLEServer* pServer = NULL; BLECharacteristic* pCharacteristic = NULL; bool deviceConnected = false; bool oldDeviceConnected = false;
std::string value = "";
#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b" #define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
……
void loop() { value = "12345.67"; delay(500); // notify changed value if (deviceConnected) { pCharacteristic->setValue(value); pCharacteristic->notify(); // value++; delay(3); } …… }
到Phyphox editor里面: 运行效果:
|