HonestQiao 发表于 2024-5-20 14:51

【Beetle ESP32 C6迷你开发板】基于ESP32-C6 BLE的温度环境传感器

<div class='showpostmsg'><p>在这篇分享中,我使用&nbsp;Beetle ESP32 C6迷你开发板的ESP32-C6核心自带的温度传感器,结合ESP32-C6的BLE,实现标准的温度环境传感器功能。</p>

<p>当然,如果接上一个SHT30的话,那就可以进行实际的环境温度测量了。</p>

<p>&nbsp;</p>

<p><strong>一、BLE环境传感器了解</strong></p>

<p>BLE环境传感器是一种利用蓝牙低功耗(Bluetooth Low Energy, BLE)技术来传输数据的传感器,它能够监测和记录环境参数,并通过无线方式将数据发送到接收设备,如智能手机、平板电脑或专用的监控系统。BLE环境传感器因其低功耗、易于集成和使用方便等特点,在智能家居、工业监测、环境研究等领域得到了广泛的应用。</p>

<p>&nbsp;</p>

<p>在BLE标准的GATT定义中,有如下的部分:</p>

<p> &nbsp;</p>

<p>其中,定义了环境传感器服务的UUID是 0x181A。环境传感器中温度特性对应的的UUID是0x2A6E,表示以0.01&deg;C为单位的整型温度值。</p>

<p>&nbsp;</p>

<p>了解了上面的两个定义,后面在实际创建BLE服务的时候,就需要用到。</p>

<p>&nbsp;</p>

<p><strong>二、ESP32-C6核心自带的温度传感器</strong></p>

<p>ESP32-C6 内置1个温度传感器,用于测量芯片内部的温度。该温度传感器模组包含一个 8 位 Sigma-Delta 模拟-数字转换器 (ADC) 和一个数字-模拟转换器 (DAC),可以补偿测量结果,减少温度测量的误差。该温度传感器主要用于测量芯片内部的温度变化。芯片内部温度通常高于环境温度,并且受到微控制器的时钟频率或 I/O 负载、外部散热环境等因素影响。</p>

<p>详细的信息,可以从乐鑫文档了解:<a href="https://docs.espressif.com/projects/esp-idf/zh_CN/v5.1.2/esp32c6/api-reference/peripherals/temp_sensor.html" target="_blank">https://docs.espressif.com/projects/esp-idf/zh_CN/v5.1.2/esp32c6/api-reference/peripherals/temp_sensor.html</a></p>

<p>&nbsp;</p>

<p>要在Arduino中使用该温度传感器,需要先添加对应的驱动库:</p>

<pre>
<code class="language-cpp">#include "driver/temperature_sensor.h"
</code></pre>

<p>然后启用温度传感器:</p>

<pre>
<code class="language-cpp">// 定义温度数据读取变量
temperature_sensor_handle_t temp_sensor = NULL;
temperature_sensor_config_t temp_sensor_config = TEMPERATURE_SENSOR_CONFIG_DEFAULT(10, 50);

// 启用内置温度传感器
ESP_ERROR_CHECK(temperature_sensor_install(&amp;temp_sensor_config, &amp;temp_sensor));
ESP_ERROR_CHECK(temperature_sensor_enable(temp_sensor));</code></pre>

<p>启用后,就可以实际用于测量的,对应的代码如下:</p>

<pre>
<code>    // 获取温度值
    ESP_ERROR_CHECK(temperature_sensor_get_celsius(temp_sensor, &amp;tsens_value));

</code></pre>

<p>实际的温度值,将会读取到&nbsp;tsens_value 变量中,直接为十进制的摄氏度浮点温度值。</p>

<p>&nbsp;</p>

<p>如果需要对外输出华氏温度值,可以用下面的转换函数:</p>

<pre>
<code class="language-cpp">// 转换摄氏度到华氏度的函数
float celsiusToFahrenheit(float celsius) {
return (celsius * 9.0 / 5.0) + 32.0;
}</code></pre>

<p>&nbsp;</p>

<p><strong>三、建立BLE 温度环境传感器服务</strong></p>

<p>参考之前分享的使用BLE UATT服务,建立BLE 温度环境传感器服务步骤类似:</p>

<p>首先定义对应的UUID:</p>

<pre>
<code class="language-cpp">#define SERVICE_UUID (BLEUUID((uint16_t)0x181A))
#define CHARACTERISTIC_UUID_Temperature_Measurement (BLEUUID((uint16_t)0x2A6E))
</code></pre>

<p>然后定义对应的Characteristic和Descriptor:</p>

<pre>
<code class="language-cpp">// 定义温度的Characteristic和Descriptor
BLECharacteristic temperatureCharacteristics(CHARACTERISTIC_UUID_Temperature_Measurement, BLECharacteristic::PROPERTY_NOTIFY);
BLEDescriptor temperatureDescriptor(BLEUUID((uint16_t)0x2902));</code></pre>

<p>定义好了以后,就可以依次进行:</p>

<p>创建服务端并设置回调:</p>

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

<p>创建服务:</p>

<pre>
<code class="language-cpp">// Create the BLE Service
BLEService *pService = pServer-&gt;createService(SERVICE_UUID);
</code></pre>

<p>添加Characteristic,设置Descriptor:</p>

<pre>
<code>// Create a BLE Characteristic
pService-&gt;addCharacteristic(&amp;temperatureCharacteristics);
temperatureCharacteristics.addDescriptor(&amp;temperatureDescriptor);
</code></pre>

<p>最后启动服务和广播:</p>

<pre>
<code class="language-cpp">// Start the service
pService-&gt;start();

// Start advertising
pServer-&gt;getAdvertising()-&gt;start();</code></pre>

<p>&nbsp;</p>

<p>在loop中,当有蓝牙客户端连接后,则发送温度信息:</p>

<pre>
<code>    uint16_t temperatureTemp = (uint16_t)(tsens_value * 100);
    temperatureCharacteristics.setValue(temperatureTemp);
    temperatureCharacteristics.notify();</code></pre>

<p>&nbsp;</p>

<p>最终,完整的代码如下:</p>

<pre>
<code class="language-cpp">#include &lt;BLEDevice.h&gt;
#include &lt;BLEServer.h&gt;
#include &lt;BLEUtils.h&gt;
#include &lt;BLE2902.h&gt;

#include "driver/temperature_sensor.h"

BLEServer *pServer = NULL;
BLECharacteristic *pTxCharacteristic;
bool deviceConnected = false;

// 定义UUID
#define SERVICE_UUID (BLEUUID((uint16_t)0x181A))
#define CHARACTERISTIC_UUID_Temperature_Measurement (BLEUUID((uint16_t)0x2A6E))

// 设置设备名称
#define BLE_SERVER_NAME "ESP32-C6 Temperature Sensor"

// 设置温度类型
#define UNIT_C // C - 摄氏度 F - 华氏度

// 定义温度的Characteristic和Descriptor
BLECharacteristic temperatureCharacteristics(CHARACTERISTIC_UUID_Temperature_Measurement, BLECharacteristic::PROPERTY_NOTIFY);
BLEDescriptor temperatureDescriptor(BLEUUID((uint16_t)0x2902));

// 蓝牙连接/断开处理。当有连接/断开事件发生时自动触发
class MyServerCallbacks : public BLEServerCallbacks {
void onConnect(BLEServer *pServer) {//当蓝牙连接时会执行该函数
    Serial.println("蓝牙已连接");
    deviceConnected = true;
};

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

// 定义温度数据读取变量
temperature_sensor_handle_t temp_sensor = NULL;
temperature_sensor_config_t temp_sensor_config = TEMPERATURE_SENSOR_CONFIG_DEFAULT(10, 50);

// 转换摄氏度到华氏度的函数
float celsiusToFahrenheit(float celsius) {
return (celsius * 9.0 / 5.0) + 32.0;
}

void setup() {
Serial.begin(115200);
BLEBegin();//初始化蓝牙

// 启用内置温度传感器
ESP_ERROR_CHECK(temperature_sensor_install(&amp;temp_sensor_config, &amp;temp_sensor));
ESP_ERROR_CHECK(temperature_sensor_enable(temp_sensor));
}

void loop() {
/****************数据发送部分*************/
/****************************************/
if (deviceConnected) {//如果有蓝牙连接,就发送数据
    float tsens_value;

    // 获取温度值
    ESP_ERROR_CHECK(temperature_sensor_get_celsius(temp_sensor, &amp;tsens_value));
#ifdef UNIT_C
    Serial.print("Temperature Celsius value ");
    Serial.print(tsens_value, 2);
    Serial.println(" ℃");
#else
    // 转换为华氏温度值
    tsens_value = celsiusToFahrenheit(tsens_value);
    Serial.print("Temperature Fahrenheit value ");
    Serial.print(tsens_value, 2);
    Serial.println(" °F");
#endif

    uint16_t temperatureTemp = (uint16_t)(tsens_value * 100);
    temperatureCharacteristics.setValue(temperatureTemp);
    temperatureCharacteristics.notify();

    delay(1000);
}
/****************************************/
/****************************************/
}


void BLEBegin() {
// Create the BLE Device
BLEDevice::init(/*BLE名称*/ BLE_SERVER_NAME);

// 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
pService-&gt;addCharacteristic(&amp;temperatureCharacteristics);
temperatureCharacteristics.addDescriptor(&amp;temperatureDescriptor);

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

// Start advertising
pServer-&gt;getAdvertising()-&gt;start();

Serial.print("BLE Address: ");
Serial.println(BLEDevice::getAddress().toString().c_str());
Serial.println("Waiting a client connection to notify...");
}</code></pre>

<p>&nbsp;</p>

<p>编译烧录到Beetle ESP32 C6迷你开发板后,看到串口输出:</p>

<p> &nbsp;</p>

<p>&nbsp; 此时,就可以用手机客户端工具连接了。</p>

<p>&nbsp;</p>

<p>四、手机BLE工具连接:</p>

<p>在手机上,使用ERF Connect,就能找到ESP32-C6&nbsp;BLE设备:</p>

<p> &nbsp;</p>

<p>&nbsp;</p>

<p>点进连接,然后就能查看温度信息了:</p>

<p> &nbsp;</p>

<p>&nbsp;</p>

<p>串口监控也会输出对应的信息:</p>

<p> &nbsp;</p>

<p>&nbsp;</p>

<p><strong>五、总结</strong></p>

<p>上面的分享,就实现了一个基础的BLE环境传感器功能。</p>

<p>如果感兴趣的话,还可以多多了解BLE服务的知识,把温湿度传感器、燃气传感器、环境光传感器、压力传感器等等都可以实现出来。</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>

Maker_kun 发表于 2024-5-21 08:41

<p>可玩性太强了,回头我也试一试</p><br/><p></p><br/>

HonestQiao 发表于 2024-5-21 18:49

Maker_kun 发表于 2024-5-21 08:41
可玩性太强了,回头我也试一试

<p>别回头了,今晚吧</p>
页: [1]
查看完整版本: 【Beetle ESP32 C6迷你开发板】基于ESP32-C6 BLE的温度环境传感器