Funpack3-1_基于XG24-EK2703A实现的蓝牙温度计
本次设计中实现的是基于XG24-EK2703A实现的蓝牙温度计,通过芯片内置的温度传感器获取温度,并通过BLE传递给PC,PC对温度信息进行解析并绘制波形图展示
标签
BLE
Funpack活动
CircuitPython
XG24-EK2703A
vic
更新2024-03-06
418

项目介绍

本次设计中实现的是基于XG24-EK2703A实现的蓝牙温度计。通过EFR32MG24芯片内部的温度传感器作为数据来源,通过蓝牙将温度数据通知给连接上来的客户端。在接收器方面,由于电脑硬件不具备BLE的适配器,因此采用的是一个片ESP32C3的开发板,其通过蓝牙连接到XG24-EK2703A开发板,获取其发布的CPU温度信息,同时通过串口将温度信息发送给PC机,PC机上通过Python编写一个程序将获取的温度信息绘制成曲线图展示出来。

实现方案

硬件连接

如下图所示,为本次设备的连接图。

最上边的是本次活动的目标板卡:XG24-EK2703A评估版,其搭载的主芯片是Silicon Labs公司的EFR32MG24,该芯片支持2.4GHz无线通信,兼容蓝牙LE、蓝牙mesh、Zigbee、Thread和Matter协议。该评估版上运行的程序会以100ms的周期将芯片温度发布给连接上来的终端,实现芯片温度的自动上报。


下边的是用来为PC机增加BLE连接支持的Luat ESP32C3开发板,其上搭载的主芯片是乐鑫公司的ESP32C3,该芯片搭载 RISC-V 32 位单核处理器,支持 2.4 GHz Wi-Fi 和 Bluetooth 5 (LE)。该板卡会自动通过BLE连接XG24-EK2703A评估版,然后将XG24-EK2703A发布的温度信息进行解析,然后通过串口发送给连接的电脑

XG24-EK2703A

Silicon Labs公司与开源社区进行进行合作针对于XG24-EK2703A评估版进行Circuitpython适配。

Circuitpython是一个运行在微控制器上的精简版的Python代码解释器,通过该解释器可以实现在微控制器上使用Python代码进行编程,不需要频繁的进行固件烧录,且可以使用大量的库进行各种功能实现,大大提高了开发速度。

针对于XG24-EK2703A评估板的Circuitpython最新版本为9.0 Beta-2,本次设计中使用的就是该固件。

固件烧录

在Simplicity Studio IDE中连接目标板卡,选择COMPATIBLE TOOLS -> Simplicity Commander


在Simolicity Commander中选择Flash,点击Browse浏览要写入的固件,点击Flash等待写入完成即可

代码实现

如下代码为实现CPU温度采集并通过BLE通知连接终端的程序实现。

1. 首先依照官方API文档的相关描述,导入需要使用的模块;

2. 进行模块的对象实例化的同时完成初始化配置;

3. 循环中检查是否有设备接入,如果存在设备连接,则获取芯片温度信息,让后通知给该设备


获取芯片温度信息代码如下:

import microcontroller
import time

while True:
print('temp: %d' % microcontroller.cpu.temperature)
time.sleep(5)


完整代码如下所示:

import time
import board
import analogio
import microcontroller
from adafruit_ble import BLERadio
from adafruit_ble.advertising.standard import ProvideServicesAdvertisement
from adafruit_ble.services.nordic import UARTService

ble = BLERadio()
uart_server = UARTService()
advertisement = ProvideServicesAdvertisement(uart_server)

while True:
ble.start_advertising(advertisement)
while not ble.connected:
pass
ble.stop_advertising()

while ble.connected:
# 当客户端链接的时候,每隔100ms发送一次CPU温度信息
uart_server.write("{}\n".format(microcontroller.cpu.temperature).encode("utf-8"))
time.sleep(0.1)

ESP32C3

ESP32C3是乐鑫公司生产的一块面向物联网领域的无线芯片,具备2.4G WIFI连接以及BLE5的能力,本次使用的就是将其作为BLE客户端连接XG24-EK2703A评估板进行温度信息获取。

ESP32C3支持ESP-IDF、Arduino、Micropython、lua等多种开发方式,目前在电子爱好者领域使用最广泛的就是基于Arduino进行开发,这种开发方式资料多,因此本次使用该方式进行功能开发。

代码实现

如下为ESP32C3的代码,主要用于自动连接XG24-EK2703A评估板,在获取到温度信息后将其通过串口输出到PC机。

1. 进行BLE相关的初始化,同时开启BLE扫描;

2. 在BLE扫描的结果回调函数中,检查该设备的服务UUID中是否包含XG24-EK2703A评估板的UUID,如果是则执行连接操作;

3. 在连接上XG24-EK2703A评估板,在收到通知消息时,将温度信息解析输出,并按照特定的格式从串口输出


如下代码为初始化代码,主要时蓝牙搜索相关参数进行配置

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

BLEScan* pBLEScan = BLEDevice::getScan();
pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
pBLEScan->setInterval(1349);
pBLEScan->setWindow(449);
pBLEScan->setActiveScan(true);
pBLEScan->start(60, false);
}


如下代码主要用于在接收到XG24-EK2703A评估板的温度信息的回调处理,通过串口发送出去

static void notifyCallback(
BLERemoteCharacteristic* pBLERemoteCharacteristic,
uint8_t* pData,
size_t length,
bool isNotify) {
Serial.print("temperature=");
Serial.write(pData, length);
}


如下代码主要用于在搜索到BLE设备时的回调函数,在其中进行UUID的检查

class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
void onResult(BLEAdvertisedDevice advertisedDevice) {
if (advertisedDevice.haveServiceUUID() && advertisedDevice.isAdvertisingService(serviceUUID)) {
BLEDevice::getScan()->stop();
myDevice = new BLEAdvertisedDevice(advertisedDevice);
doConnect = true;
doScan = true;
}
}
};

PC

PC机主要通过USB线连接ESP32C3开发板,通过串口从ESP32C3上获取XG24-EK2703A评估板发布的芯片温度值,并将其进行解析,然后将数据收集起来绘制成曲线图

代码实现

1. 采用波特率115200打开与ESP32C3连接的COM口

2. 检测COM口获取数据是否为温度信息

3. 将温度信息存储到Y轴数据数组中

4. 进行绘图


Python打开ESP32C3的串口代码如下

import serial
import matplotlib.pyplot as plt

com = serial.Serial("COM20", 115200) # 打开COM17,将波特率配置为115200,其余参数使用默认值
if com.isOpen(): # 判断串口是否成功打开
print("打开串口成功。")
print(com.name) # 输出串口号
else:
print("打开串口失败。")


Python读取温度信息并更新到波形图中代码如下

# 设置绘图窗口
plt.grid(True)
plt.xlabel("time")
plt.ylabel("temp")
plt.title("EFR32MG24 CPU TEMP")
plt.ion()

# 循环读取串口数据并绘制曲线图
while True:
try:
# 读取串口数据
try:
msg = com.readline().decode('utf-8').strip()
except UnicodeDecodeError:
msg = None

if msg is not None and "temperature" in msg:
temperature = float(msg.split("=")[1])
print(temperature)

# 将数据添加到列表中
y_data.append(temperature)
x_data.append(x_count)
x_count = x_count + 1
except KeyboardInterrupt:
break

# 更新曲线图
plt.clf()
plt.plot(x_data, y_data)
plt.pause(0.01)
#plt.ioff()

结果展示

如下图为采集的目标设备以及用来作为BLE数据接收的ESP32C3开发板

如下图为PC上使用XG24-EK2703A评估板传递过来的芯片温度信息绘制出来的曲线图,其中温度变高是进行一些轻微加热导致,温度降低是停止加热;左下角的console中显示的温度实时采集到的温度数据。

小结

通过本次活动的XG24-EK2703A评估板开发板,了解了BLE相关开发知识以及概念。同时,再一次见识到不需要重复造轮子的好处,可以快速的搭建功能原型,进行功能验证。

也希望电子森林后续越办越好,能够提供更多的机会去了解到不同的方案以及轮子。

附件下载
efr32mg24.py
获取芯片温度传感器的数据,并通过BLE发布给客户端的程序,基于Circuitpython V9.0 Beta 2开发
esp32c3.ino
ESP32C3运行程序,通过BLE连接评估版,获取温度数据并通过串口输出,基于ESP32 Arduino框架开发
temp_show.py
PC机运行程序,通过串口连接ESP32C3开发板,将串口获取温度信息进行解析,通过曲线图的方式展示出来,基于PYthon 3.10
团队介绍
一个努力不当股东的小菜鸡
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号