[Funpack3-1]基于XG24-EK2703A的蓝牙环境温湿度传感器
这是囧大王的Funpack第三季第一期作业,使用XG24-EK2703A开发板和AHT10实现了基于蓝牙通信的远程温湿度传感器。
主要功能为:读取MCU内置温度传感器或通过I2C读取AHT10的数据,将数据通过蓝牙进行传输,使用配套的上位机代码可实现对环境温湿度或MCU温度的实时监控。
项目背景
Funpack第三季第一期活动的具体任务内容如下:
任务一:使用芯片内部的温度检测外设,测量温度并通过蓝牙发送至上位机,在上位机中以“绘图”的形式对温度数据进行可视化。
任务二:对蓝牙功能进行开发,实现一个蓝牙鼠标+键盘复合设备。板子上有两个按键,分别短按后模拟滚轮上下翻页一行,两个同时按下2s后时依次发送字符EETREE.CN。
任务三:此题为开放题。板卡预留了扩展管脚,如若自己有传感器或各种执行器,可以自行连接并进行开发,其中固定要求为:至少使用一种无线连接方式,至少使用芯片内部的两个外设,若连接传感器,请将采集的数据,用对应的解析格式展示出来。
任务四:若您针对这个板卡有更好的创意,可自命题完成(难度不能低于以上任务)。
总体要求:开发环境中提供了丰富案例,禁止直接提交原始案例或原始代码占比过大,在项目文档中大篇幅翻译代码或注释也会被认定为无创新。 以上题目为基础要求,鼓励参加者在项目中突出自己特色,并在题目的基础上扩展创新功能。
这次活动我开始选择完成的是任务一,但是任务有点太简单了,通过demo代码创建工程之后几乎就不需要改动,而任务要求里有提到“禁止直接提交原始案例或原始代码占比过大”,直接提交恐怕过不了审核那关,而且如此完成任务学习不到知识呀。于是我决定给自己增加难度,在任务一的实现温度检测的基础上使用I2C读取外置的温度传感器数据,这样一来就等于也完成了任务三,同时也能真正的体验到基于Silicon Labs的SoC的程序开发过程。
硬件介绍
XG24-EK2703A
XG24-EK2703A是一款基于EFR32MG24片上系统的开发套件,具备超低成本、低功耗和小巧的特点。该套件支持2.4GHz无线通信,兼容蓝牙LE、蓝牙mesh、Zigbee、Thread和Matter协议,为无线物联网产品的开发和原型制作提供了极大的便利。
整个评估套件最核心部分是EFR32MG24B210F1536IM48无线SoC芯片,是使用蓝牙低功耗和蓝牙网状网络实现物联网无线连接的理想选择,适用于智能家居、照明和便携式医疗设备产品。该芯片是EFR32MG24无线SoC芯片家族系列中的中高端型号,以ARM Cortex-M3为核心、主频为78MHz且支持2.4GHz无线通信,带有1536KB闪存和256KBRAM,并且还搭载了AI/ML硬件加速功能,能够满足在嵌入式系统中部署轻量级AI应用。
该板卡套件所有的例程和相应的板卡资料都集成在了SDK开发包中,辅以配套的Simplicity Studio Version 5工具,只需要将SDK下载进Simplicity Studio Version 5中就可以进行例程的演示,操作方便简单。
AHT10温湿度传感器
AHT10是奥松电子推出的新一代温湿度传感器,传感器输出经过标定的数字信号,通过IIC通讯方式输出。其配有一个全新设计的 ASIC专用芯片、一个经过改进的MEMS半导体电容式湿度传感元件和一个标准的片上温度传感元件,大大提升了传感器的可靠性,在恶劣环境下稳定工作。
温度范围为: 测量范围为 -40 ℃ ~+ 85 ℃ 精度±0.5℃
项目介绍
本次项目分为上位机和下位机两个部分,下位机基于Simplicity Studio 和 Gecko SDK 进行开发,使用C语言进行程序编写。上位机使用HTML+JavaScript基于Web Bluetooth API进行实现了一个可视化的实时监控图表界面。
下位机代码基于Simplicity Studio中的“Bluetooth - SoC Thermometer (Mock)”创建。该Demo代码中已实现采集MCU内部温度的逻辑,并以温度计设备的形式提供蓝牙Service。在此Demo的基础上我增加了AHT10的驱动代码并增加了一个自定义的Service和相应的Characteristic以同时提供环境温度与湿度信息并保留原有的MCU温度监测功能。
功能演示
首先需要先连接AHT10温湿度传感器。
XG24-EK2703A提供了mikroBUS和qwiic接口都可以用于连接I2C设备,同时板子的两侧还预留有2.54mm的排针焊接盘。
我是因为懒得焊排针,手上也没有mikroBUS扩展板和qwiic接头,就干脆用公-母头杜邦线直接把AHT10连到了mikroBUS排母上的。
给开发板Type-C接口供电之后下位机程序就自动开始工作了。
开发板上电之后,通过浏览器打开我们的上位机界面。
这里需要注意,因为Web Bluetooth API标准还未正式定稿,所以请使用最新的浏览器进行访问,我这里使用的Microsoft Edge 122.0.2365.52版本。另外由于浏览器安全方面的限制,Web Bluetooth API需要在HTTPS环境下才能使用,因而本地测试会比较麻烦,如需测试可以访问我已经部署到线上的地址:https://hessian.cn/html/funpack3-1/
在上位机界面点击“开始监控”浏览器会自动弹出蓝牙设备配对窗口,选择JIONG RH Sensor点击配对。
这里的上位机程序对蓝牙设备列表进行了过滤我的项目UUID,列表里只会显示我的下位机对应的蓝牙设备,如果列表没有显示可能是下位机程序异常或未能正常启动。可以刷新页面或重启开发板再进行重试。
配对成功后下位机会自动上报温度信息,页面上的图表会实时进行更新,更新时间间隔为1秒。
通过“开始监控”按钮左侧的选择框可以选择监测“环境温湿度”或“MCU温度”,下面两张图片分别是监控环境温湿度和MCU温度的效果。
程序编码
一、搭建开发环境
1. 安装Simplicity Studio
官方网址:https://www.silabs.com/developers/simplicity-studio
2. 安装用USB数据线连接开发板
3. 连接到开发板后,在Simplicity Studio中选择开发板并点击Start,根据提示下载安装Gecko SDK
正在安装SDK
安装完SDK即可创建项目开始开发了。
二、程序设计与实现
本项目分为上下位机两个部分,因本项目主要关注的是基于XG24-EK2703A的开发内容,因此关于上位机程序的开发在碑文不再赘述,欲了解详细实现请下载附件查看上位机部分代码。
功能框图
该项目基于Bluetooth - SoC Thermometer(Mock)样例工程创建。
工程目录结构
引脚配置
软件组件选择
这里要安装Health Thermometer API、Relative Humidity and Temperature sensor (Mock)
Platform部分要安装I2CSPM并命名新增的实例为sensor,同时为了支持读取MCU内部温度还需要安装TEMPDRV。
I2CSPM配置
蓝牙GATT配置
下面是编码部分
温湿度传感器部分的程序代码实现主要是参考Thermometer的实现,单独增加了一个service和characteristic,使用定时器每1秒通过indicate将温湿度信息进行上报。
这里略过aht驱动和gatt service的具体实现部分,主要说明一下开发过程中的一些关键点。
首先修改app.c,增加aht传感器初始化代码,i2cspm的实例已经由IDE自动生成的代码创建,这里只需要用extern引入即可。
extern sl_i2cspm_t *sl_i2cspm_sensor;
aht_t aht_dev = {0};
/**************************************************************************//**
* Application Init.
*****************************************************************************/
SL_WEAK void app_init(void)
{
sl_status_t sc;
app_log_info("health thermometer initialised\n");
// Init temperature sensor.
sc = sl_sensor_rht_init();
if (sc != SL_STATUS_OK) {
app_log_warning("Relative Humidity and Temperature sensor initialization failed.");
app_log_nl();
}
aht_dev.i2cspm = sl_i2cspm_sensor;
aht_dev.addr = AHT_I2C_ADDRESS_GND;
sc = aht_init(&aht_dev);
if (sc != SL_STATUS_OK) {
app_log_warning("AHT sensor initialization failed.");
app_log_nl();
}
app_log_info("APP INIT finished.");
app_log_nl();
}
然后在app.c的sl_bt_on_event函数开头增加调用gatt_service_rht_on_event(evt)以使我们的service能够处理蓝牙事件。
/**************************************************************************//**
* Bluetooth stack event handler.
* This overrides the dummy weak implementation.
*
* @param[in] evt Event coming from the Bluetooth stack.
*****************************************************************************/
void sl_bt_on_event(sl_bt_msg_t *evt)
{
sl_status_t sc;
bd_addr address;
uint8_t address_type;
gatt_service_rht_on_event(evt);
// Handle stack events
switch (SL_BT_MSG_ID(evt->header)) {
三、固件烧录(下载)、串口跟踪
注意:蓝牙应用要先创建一个基于“Bootloader - SoC Bluetooth AppLoader OTA DFU”的工程,然后下载到开发板上才能正常进行应用开发。
在Simplicity Stuidio里,用鼠标右键在Project Explorer中点击项目选择Run As就可以编译、下载、运行一条龙自动完成,如果需要跟踪调试也可以使用Debug As进入调试模式。调试模式支持断点、单步、查看内存等诸多调试功能。
在Simplicity Studio中我没有找到如何查看设备的标准输出,样例代码中应该是有配置usart的,在配置文件中我们可以找到他的波特率。
我这里使用putty进行连接,可以正常看到程序app_log所打印的输出。
参考资料
- 开发套件资料:https://cn.silabs.com/development-tools/wireless/efr32xg24-explorer-kit?tab=overview
- SoC资料:https://cn.silabs.com/wireless/zigbee/efr32mg24-series-2-socs/device.efr32mg24b210f1536im48?tab=specs
- 开发文档:https://docs.silabs.com/
- Bootloader说明:https://www.silabs.com/documents/public/application-notes/an1086-gecko-bootloader-bluetooth.pdf
- EFR Connect APP下载:https://www.silabs.com/developers/efr-connect-mobile-app?tab=downloads
- Web Bluetooth API:https://developer.chrome.com/docs/capabilities/bluetooth?hl=zh-cn#read
- 关于Android的BluetoothGattCharacteristic的getFloatValue结构的问题参考(主要看bytesToFloat方法):https://android.googlesource.com/platform/frameworks/base/+/db29556/core/java/android/bluetooth/BluetoothGattCharacteristic.java