慕容雪花 发表于 2024-5-6 12:52

【FireBeetle 2 ESP32 C6开发板】-5- ESP32C6 BLE主从一体

<div class='showpostmsg'> 本帖最后由 慕容雪花 于 2024-5-6 13:12 编辑

<p><span style="font-size:16px;"><strong>往期测评:</strong></span></p>

<p>【FireBeetle 2 ESP32 C6开发板】-1- 开发环境搭建 <a href="https://bbs.eeworld.com.cn/thread-1279979-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1279979-1-1.html</a></p>

<p>【FireBeetle 2 ESP32 C6开发板】-2- BLE server创建 <a href="https://bbs.eeworld.com.cn/thread-1280292-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1280292-1-1.html</a></p>

<p>【FireBeetle 2 ESP32 C6开发板】-3- C6获取小米温湿度计2数据 <a href="https://bbs.eeworld.com.cn/thread-1280293-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1280293-1-1.html</a></p>

<p>【FireBeetle 2 ESP32 C6开发板】-4- 关于读取温湿度Characteristic值的一些问题记录 <a href="https://bbs.eeworld.com.cn/thread-1280318-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1280318-1-1.html</a></p>

<p>&nbsp;</p>

<p>根据测评计划,C6获取到的温湿度数据要显示在屏幕上。考虑到自己焊接技术太烂,手上刚好有之前使用的FireBeetle 2 ESP32-E并且连接了OLED。于是想把C6同时作为BLE的客户端与服务器,FireBeetle 2 ESP32-E作为客户端,然后把获取到的BLE数据显示在OLED屏幕上。</p>

<p>&nbsp;</p>

<p>主要的框图:</p>

<p> &nbsp;</p>

<p>&nbsp;</p>

<p>C6同时实现BLE CLIENT与BLE SERVER的代码:</p>

<pre>
<code>/*
    Video: https://www.youtube.com/watch?v=oCMOYS71NIU
    Based on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleNotify.cpp
    Ported to Arduino ESP32 by Evandro Copercini

   Create a BLE server that, once we receive a connection, will send periodic notifications.
   The service advertises itself as: 6E400001-B5A3-F393-E0A9-E50E24DCCA9E
   Has a characteristic of: 6E400002-B5A3-F393-E0A9-E50E24DCCA9E - used for receiving data with "WRITE"
   Has a characteristic of: 6E400003-B5A3-F393-E0A9-E50E24DCCA9E - used to send data with"NOTIFY"

   The design of creating the BLE server is:
   1. Create a BLE Server
   2. Create a BLE Service
   3. Create a BLE Characteristic on the Service
   4. Create a BLE Descriptor on the characteristic
   5. Start the service.
   6. Start advertising.

*/

/* 该示例演示了蓝牙数据透传,烧录代码,打开串口监视器,打开手机的BLE调试助手
* 1.即可看见ESP32发送的数据--见APP使用图
* 2.通过BLE调试助手的输入框可向ESP32发送数据--见APP使用图
* 该示例由BLE_uart示例更改而来
*/

#include &lt;BLEDevice.h&gt;
#include &lt;BLEServer.h&gt;
#include &lt;BLEUtils.h&gt;
#include &lt;BLE2902.h&gt;

/* 该部分定义了C6作为BLE Server的一些定义
*/
BLEServer *pServer = NULL;
BLECharacteristic * pTxCharacteristic;
bool otherClientConnectedToServerC6 = false;
uint8_t txValue = 0;

// See the following for generating UUIDs:
// https://www.uuidgenerator.net/

#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"

uint8_t TempHumidData = {0};

/* 该部分定义了C6作为BLE Client来获取小米温湿度计2的传感器数据
*/
static String XiaomiDeviceName = "LYWSD03MMC";
static BLEUUID serviceUUID("ebe0ccb0-7a0a-4b0c-8a1a-6ff2997da3a6");
// The characteristic of the remote service we are interested in.
// In this case, it's Xiaomi Temp and Humidity Sensor Version 2.
static BLEUUID charUUID("ebe0ccc1-7a0a-4b0c-8a1a-6ff2997da3a6");

static boolean doConnect = false;
static boolean connected = false;
static boolean doScan = true;
static BLERemoteCharacteristic* pRemoteCharacteristic;
static BLEAdvertisedDevice* myDevice;

static void notifyCallback(
BLERemoteCharacteristic* pBLERemoteCharacteristic,
uint8_t* pData,
size_t length,
bool isNotify) {
    Serial.print("Notify callback for characteristic ");
    Serial.print(pBLERemoteCharacteristic-&gt;getUUID().toString().c_str());
    Serial.print(" of data length ");
    Serial.println(length);

    for(uint8_t i = 0; i &lt; length; i++){
      Serial.println("pData[" + String(i) + "] = " + String(pData));
    }

    uint16_t TempVal = pData*256 + pData;
    Serial.println("Temperature is: "+ String(TempVal/100) + "." + String(TempVal%100) + " degree");
    float temperature = TempVal*1.0/100;

    uint8_t HumidityVal = pData;
    Serial.println("Humidity is: " + String(pData) + "% ");

    uint16_t BatteryVal = pData*256 + pData;
    Serial.println("Battery Voltage is: "+ String(BatteryVal/100) + "." + String(BatteryVal%100) + " mV");
    Serial.println();

    char buffer;
    snprintf(buffer, sizeof(buffer), "%.1f C, %d%%", temperature, HumidityVal);
    Serial.println(buffer);

    /****************数据发送部分*************/
    /****************************************/
    if (otherClientConnectedToServerC6) {//如果有蓝牙连接,就发送数据
      //pTxCharacteristic-&gt;setValue("Hello");//发送字符串
      pTxCharacteristic-&gt;setValue(buffer);
      pTxCharacteristic-&gt;notify();
      delay(10); // bluetooth stack will go into congestion, if too many packets are sent
    }

}

class MyClientCallback : public BLEClientCallbacks {
void onConnect(BLEClient* pclient) {
}

void onDisconnect(BLEClient* pclient) {
    connected = false;
    Serial.println("onDisconnect");
}
};

bool connectToServer() {
    Serial.print("Forming a connection to ");
    Serial.println(myDevice-&gt;getAddress().toString().c_str());
   
    BLEClient*pClient= BLEDevice::createClient();
    Serial.println(" - Created client");

    pClient-&gt;setClientCallbacks(new MyClientCallback());

    // Connect to the remove BLE Server.
    pClient-&gt;connect(myDevice);// if you pass BLEAdvertisedDevice instead of address, it will be recognized type of peer device address (public or private)
    Serial.println(" - Connected to server");
    pClient-&gt;setMTU(517); //set client to request maximum MTU from server (default is 23 otherwise)

    // Obtain a reference to the service we are after in the remote BLE server.
    BLERemoteService* pRemoteService = pClient-&gt;getService(serviceUUID);
    if (pRemoteService == nullptr) {
      Serial.print("Failed to find our service UUID: ");
      Serial.println(serviceUUID.toString().c_str());
      pClient-&gt;disconnect();
      return false;
    }
    Serial.println(" - Found our service");


    // Obtain a reference to the characteristic in the service of the remote BLE server.
    pRemoteCharacteristic = pRemoteService-&gt;getCharacteristic(charUUID);
    if (pRemoteCharacteristic == nullptr) {
      Serial.print("Failed to find our characteristic UUID: ");
      Serial.println(charUUID.toString().c_str());
      pClient-&gt;disconnect();
      return false;
    }
    Serial.println(" - Found our characteristic");

    // Read the value of the characteristic.
    if(pRemoteCharacteristic-&gt;canRead()) {
      String value = pRemoteCharacteristic-&gt;readValue();
      uint8_t* test = pRemoteCharacteristic-&gt;readRawData();
      uint8_t i;
      uint8_tTempHumidData={0};

      for(i = 0; i &lt; 5; i++){
      if(test != nullptr){
          Serial.print("The characteristic value using readRawData was: ");
          Serial.println(*test);
          TempHumidData = *test;
      }else{
          Serial.println("pRemoteCharacteristic-&gt;readRawData() returns NULL PTR");
      }
      test++;
      }

    static uint16_t Test_TempVal = TempHumidData*256 + TempHumidData;
    Serial.println("Test Temperature is: "+ String(Test_TempVal/100) + "." + String(Test_TempVal%100) + " degree");
    static uint8_t Test_HumidityVal = TempHumidData;
    Serial.println("Test Humidity is: " + String(TempHumidData) + "% ");
    static uint16_t Test_BatteryVal = TempHumidData*256 + TempHumidData;
    Serial.println("Test Battery Voltage is: "+ String(Test_BatteryVal/100) + "." + String(Test_BatteryVal%100) + " mV");      

    }
    if(pRemoteCharacteristic-&gt;canNotify())
      pRemoteCharacteristic-&gt;registerForNotify(notifyCallback);

    connected = true;
    return true;
}

/**
* Scan for BLE servers and find the first one that advertises the service we are looking for.
*/
class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
/**
   * Called for each advertising BLE server.
   */
void onResult(BLEAdvertisedDevice advertisedDevice) {
    Serial.println("*-------------------------------------------------------------------*");
    Serial.print("BLE Advertised Device found: ");
    Serial.println(advertisedDevice.toString().c_str());

    // We have found a device, let us now see if it contains the service we are looking for.

    Serial.println(advertisedDevice.getServiceUUID().toString().c_str());
    Serial.println(advertisedDevice.getName().c_str());
    if(0 == advertisedDevice.getName().compareTo(XiaomiDeviceName)){
      Serial.println("Great, Found " + advertisedDevice.getName());

      Serial.println("advertisedDevice.getServiceUUIDCount() = " + String(advertisedDevice.getServiceUUIDCount()));

      BLEDevice::getScan()-&gt;stop();
      myDevice = new BLEAdvertisedDevice(advertisedDevice);
      doConnect = true;
      doScan = true;      
    }

} // onResult
}; // MyAdvertisedDeviceCallbacks

/* 该部分定义了C6作为BLE Server把获取到的小米温湿度计2的传感器数据发给另外一块ESP开发板
*/
//蓝牙连接/断开处理。当有连接/断开事件发生时自动触发
class MyServerCallbacks: public BLEServerCallbacks {
    void onConnect(BLEServer* pServer) {   //当蓝牙连接时会执行该函数
      Serial.println("蓝牙已连接");
      otherClientConnectedToServerC6 = true;
    };

    void onDisconnect(BLEServer* pServer) {//当蓝牙断开连接时会执行该函数
      Serial.println("蓝牙已断开");
      otherClientConnectedToServerC6 = false;
      delay(500); // give the bluetooth stack the chance to get things ready
      pServer-&gt;startAdvertising(); // restart advertising

    }
};

/****************数据接收部分*************/
/****************************************/
//蓝牙接收数据处理。当收到数据时自动触发
class MyCallbacks: public BLECharacteristicCallbacks {
    void onWrite(BLECharacteristic *pCharacteristic) {
      std::string rxValue = (pCharacteristic-&gt;getValue()).c_str();//接收数据,并赋给rxValue

      //if(rxValue == "ON"){Serial.println("开灯");}   //判断接收的字符是否为"ON"

      if (rxValue.length() &gt; 0) {
      Serial.println("*********");
      Serial.print("Received Value: ");
      for (int i = 0; i &lt; rxValue.length(); i++){
          Serial.print(rxValue);
      }
      Serial.println();
      Serial.println("*********");
      }
    }
};
/***************************************/
/****************************************/


void setup() {
Serial.begin(115200);
Serial.println("Starting Arduino BLE Client application...");
BLEDevice::init("");

// Retrieve a Scanner and set the callback we want to use to be informed when we
// have detected a new device.Specify that we want active scanning and start the
// scan to run for 5 seconds.
BLEScan* pBLEScan = BLEDevice::getScan();
pBLEScan-&gt;setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
pBLEScan-&gt;setInterval(1349);
pBLEScan-&gt;setWindow(449);
pBLEScan-&gt;setActiveScan(true);
pBLEScan-&gt;start(5, false);

//Start BLE Server
BLEServerBegin();//初始化蓝牙

}

void loop() {
// If the flag "doConnect" is true then we have scanned for and found the desired
// BLE Server with which we wish to connect.Now we connect to it.Once we are
// connected we set the connected flag to be true.
if (doConnect == true) {
    if (connectToServer()) {
      Serial.println("We are now connected to the BLE Server-Xiaomi Temp-Humid Device.");
    } else {
      Serial.println("We have failed to connect to the server; there is nothin more we will do.");
    }
    doConnect = false;
}

// If we are connected to a peer BLE Server, update the characteristic each time we are reached
// with the current time since boot.
if (connected) {

}else if(doScan){
    BLEDevice::getScan()-&gt;start(5);// this is just example to start scan after disconnect, most likely there is better way to do it in arduino
}

/****************************************/
/****************************************/
delay(1000); // Delay a second between loops.
}


void BLEServerBegin(){
// Create the BLE Device
BLEDevice::init(/*BLE名称*/"BLE ROUTE Service");

// Create the BLE Server
pServer = BLEDevice::createServer();
pServer-&gt;setCallbacks(new MyServerCallbacks());

// Create the BLE Service
BLEService *pService = pServer-&gt;createService(SERVICE_UUID);

// Create a BLE Characteristic
pTxCharacteristic = pService-&gt;createCharacteristic(
                  CHARACTERISTIC_UUID_TX,
                  BLECharacteristic::PROPERTY_NOTIFY
                  );

pTxCharacteristic-&gt;addDescriptor(new BLE2902());

BLECharacteristic * pRxCharacteristic = pService-&gt;createCharacteristic(
                      CHARACTERISTIC_UUID_RX,
                      BLECharacteristic::PROPERTY_WRITE
                  );

pRxCharacteristic-&gt;setCallbacks(new MyCallbacks());

// Start the service
pService-&gt;start();
//pService-&gt;stop();

// Start advertising
pServer-&gt;getAdvertising()-&gt;addServiceUUID(SERVICE_UUID);
pServer-&gt;getAdvertising()-&gt;start();
Serial.println("Waiting a client connection to notify...");
}</code></pre>

<p>&nbsp;</p>

<p>FireBeetle 2 ESP32-E实现BLE客户端与OLED相关代码:</p>

<pre>
<code>/**
* A BLE client example that is rich in capabilities.
* There is a lot new capabilities implemented.
* author unknown
* updated by chegewara
* 2024/5/2 update by sy: using readRawData 5 times to get the real temperature and humidity value. works.
*/

#include "BLEDevice.h"
//#include "BLEScan.h"

// The remote service of Xiaomi Temp and Humidity Sensor we wish to connect to.
static BLEUUID serviceUUID("6E400001-B5A3-F393-E0A9-E50E24DCCA9E");
// The characteristic of the remote service we are interested in.
// In this case, it's Xiaomi Temp and Humidity Sensor Version 2.
static BLEUUID charUUID("6E400003-B5A3-F393-E0A9-E50E24DCCA9E");

static boolean doConnect = false;
static boolean connected = false;
static boolean doScan = true;
static BLERemoteCharacteristic* pRemoteCharacteristic;
static BLEAdvertisedDevice* myDevice;

/*oled related*/
#include &lt;SPI.h&gt;
#include &lt;Wire.h&gt;

#include &lt;Adafruit_GFX.h&gt;
#include &lt;Adafruit_SSD1306.h&gt;

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
// The pins for I2C are defined by the Wire-library.
// On an arduino UNO:       A4(SDA), A5(SCL)
// On an arduino MEGA 2560: 20(SDA), 21(SCL)
// On an arduino LEONARDO:   2(SDA),3(SCL), ...
#define OLED_RESET   -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///&lt; See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32. SensorYoung: 2024/1/29 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &amp;Wire, OLED_RESET);

#define NUMFLAKES   10 // Number of snowflakes in the animation example

#define LOGO_HEIGHT   16
#define LOGO_WIDTH    16
static const unsigned char PROGMEM logo_bmp[] =
{ 0b00000000, 0b11000000,
0b00000001, 0b11000000,
0b00000001, 0b11000000,
0b00000011, 0b11100000,
0b11110011, 0b11100000,
0b11111110, 0b11111000,
0b01111110, 0b11111111,
0b00110011, 0b10011111,
0b00011111, 0b11111100,
0b00001101, 0b01110000,
0b00011011, 0b10100000,
0b00111111, 0b11100000,
0b00111111, 0b11110000,
0b01111100, 0b11110000,
0b01110000, 0b01110000,
0b00000000, 0b00110000 };


static void notifyCallback(
BLERemoteCharacteristic* pBLERemoteCharacteristic,
uint8_t* pData,
size_t length,
bool isNotify) {
    Serial.print("Notify callback for characteristic ");
    Serial.print(pBLERemoteCharacteristic-&gt;getUUID().toString().c_str());
    Serial.print(" of data length ");
    Serial.println(length);
    Serial.write(pData, length);
    Serial.println();

    display.clearDisplay();
    display.setTextSize(1);             // Draw 2X-scale text
    display.setTextColor(SSD1306_WHITE);
    display.setCursor(0, 0);   // Start at top-left corner
    display.println(F("Temperature,Humidity"));    //display.display();
    display.println(F(pData));    //display.display();
    display.display();

}

class MyClientCallback : public BLEClientCallbacks {
void onConnect(BLEClient* pclient) {
}

void onDisconnect(BLEClient* pclient) {
    connected = false;
    Serial.println("onDisconnect");
}
};

bool connectToServer() {
    Serial.print("Forming a connection to ");
    Serial.println(myDevice-&gt;getAddress().toString().c_str());
   
    BLEClient*pClient= BLEDevice::createClient();
    Serial.println(" - Created client");

    pClient-&gt;setClientCallbacks(new MyClientCallback());

    // Connect to the remove BLE Server.
    pClient-&gt;connect(myDevice);// if you pass BLEAdvertisedDevice instead of address, it will be recognized type of peer device address (public or private)
    Serial.println(" - Connected to server");
    pClient-&gt;setMTU(517); //set client to request maximum MTU from server (default is 23 otherwise)

    // Obtain a reference to the service we are after in the remote BLE server.
    BLERemoteService* pRemoteService = pClient-&gt;getService(serviceUUID);
    if (pRemoteService == nullptr) {
      Serial.print("Failed to find our service UUID: ");
      Serial.println(serviceUUID.toString().c_str());
      pClient-&gt;disconnect();
      return false;
    }
    Serial.println(" - Found our service");


    // Obtain a reference to the characteristic in the service of the remote BLE server.
    pRemoteCharacteristic = pRemoteService-&gt;getCharacteristic(charUUID);
    if (pRemoteCharacteristic == nullptr) {
      Serial.print("Failed to find our characteristic UUID: ");
      Serial.println(charUUID.toString().c_str());
      pClient-&gt;disconnect();
      return false;
    }
    Serial.println(" - Found our characteristic");

    // Read the value of the characteristic.
    if(pRemoteCharacteristic-&gt;canRead()) {
      String value = pRemoteCharacteristic-&gt;readValue();   
      Serial.print("FireBeetle ESP32-E read The characteristic value was: ");
      Serial.println(value.c_str());
    }
    if(pRemoteCharacteristic-&gt;canNotify())
      pRemoteCharacteristic-&gt;registerForNotify(notifyCallback);

    connected = true;
    return true;
}
/**
* Scan for BLE servers and find the first one that advertises the service we are looking for.
*/
class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
/**
   * Called for each advertising BLE server.
   */
void onResult(BLEAdvertisedDevice advertisedDevice) {
    Serial.println("*-------------------------------------------------------------------*");
    Serial.print("BLE Advertised Device found: ");
    Serial.println(advertisedDevice.toString().c_str());

    // We have found a device, let us now see if it contains the service we are looking for.

    Serial.println(advertisedDevice.getServiceUUID().toString().c_str());
    Serial.println(advertisedDevice.getName().c_str());

    // if(0 == advertisedDevice.getName().compareTo(XiaomiDeviceName)){
    //   Serial.println("Great, Found " + advertisedDevice.getName());

    //   Serial.println("advertisedDevice.getServiceUUIDCount() = " + String(advertisedDevice.getServiceUUIDCount()));

    //   BLEDevice::getScan()-&gt;stop();
    //   myDevice = new BLEAdvertisedDevice(advertisedDevice);
    //   doConnect = true;
    //   doScan = true;      
    // }

    if (advertisedDevice.haveServiceUUID() &amp;&amp; advertisedDevice.isAdvertisingService(serviceUUID)) {
    if(advertisedDevice.haveName() &amp;&amp; advertisedDevice.getName().c_str())
      BLEDevice::getScan()-&gt;stop();
      myDevice = new BLEAdvertisedDevice(advertisedDevice);
      doConnect = true;
      doScan = true;

    } // Found our server
} // onResult
}; // MyAdvertisedDeviceCallbacks


void setup() {
Serial.begin(115200);
    // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
}else{
    Serial.println("SSD1306 Init Successfully");
}

    // Show initial display buffer contents on the screen --
// the library initializes this with an Adafruit splash screen.
display.display();
delay(2000); // Pause for 2 seconds


Serial.println("Starting Arduino BLE Client application...");
BLEDevice::init("");

// Retrieve a Scanner and set the callback we want to use to be informed when we
// have detected a new device.Specify that we want active scanning and start the
// scan to run for 5 seconds.
BLEScan* pBLEScan = BLEDevice::getScan();
pBLEScan-&gt;setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
pBLEScan-&gt;setInterval(1349);
pBLEScan-&gt;setWindow(449);
pBLEScan-&gt;setActiveScan(true);
pBLEScan-&gt;start(5, false);
} // End of setup.


// This is the Arduino main loop function.
void loop() {

// If the flag "doConnect" is true then we have scanned for and found the desired
// BLE Server with which we wish to connect.Now we connect to it.Once we are
// connected we set the connected flag to be true.
if (doConnect == true) {
    if (connectToServer()) {
      Serial.println("We are now connected to the BLE Server.");
    } else {
      Serial.println("We have failed to connect to the server; there is nothin more we will do.");
    }
    doConnect = false;
}

// If we are connected to a peer BLE Server, update the characteristic each time we are reached
// with the current time since boot.
if (connected) {
    //String newValue = "Time since boot: " + String(millis()/1000);
    //Serial.println("Time since boot: " + newValue);
   
    // Set the characteristic's value to be the array of bytes that is actually a string.
    //pRemoteCharacteristic-&gt;writeValue(newValue.c_str(), newValue.length());
}else if(doScan){
    BLEDevice::getScan()-&gt;start(5);// this is just example to start scan after disconnect, most likely there is better way to do it in arduino
}

delay(1000); // Delay a second between loops.
} // End of loop
</code></pre>

<p>&nbsp;</p>

<p>ESP32-E与C6的串口日志:</p>

<p> &nbsp;</p>

<p>实物照片</p>

<p> &nbsp;</p>

<p>&nbsp;</p>

<p><span style="font-size:18px;"><strong>总结:</strong></span></p>

<p>非常感谢论坛提供的体验c6的机会,本次的体验主要围绕在BLE方面,从熟悉基础知识,到搭建简单的Server,client,到获取小米温湿度计2的数据,最后在c6上部署了BLE主从一体固件,从而实现了把采集到的温湿度数据进行二次转发给别的设备,并最终在oled屏幕上显示了正确结果。</p>

<p>在此也感谢论坛朋友的热情帮助,一起进步!</p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>
页: [1]
查看完整版本: 【FireBeetle 2 ESP32 C6开发板】-5- ESP32C6 BLE主从一体