蓝牙读取数值,超过一定值则亮LED
通过蓝牙读取开发板上的温度传感器数值,超过一定门槛后,再通过蓝牙控制开发板上的LED灯点亮以作报警
标签
嵌入式系统
BLE
显示
Funpack
蓝牙
理工男
更新2021-02-06
1118

硬件介绍

user guide 官方(https://www.silabs.com/support/getting-started/thunderboard/thunderboard-bg22)

 

主芯片

Fi5K2LqkiY6_WSc5bWFebX74pzZI

- 型号:EFR32BG22C224F512IM40
- RAM: 32kB 0x20000000 ~ 0x20008000
- FLASH: 512kB 0x00000000 ~ 0x00080000
- 32bit ARM cortex-M33内核 ,最高76.8 MHz
- 2个I2C
- 2个USART
- EUART
- ADC
- TrustZone 技术

 

芯片参考手册:

芯片BG22系列datasheet: [EFR32BG22 Wireless Gecko SoC Family Data Sheet ](https://www.silabs.com/documents/public/data-sheets/efr32bg22-datasheet.pdf)

芯片BG22系列参考手册:[efr32xg22-reference Manual](https://www.silabs.com/documents/public/reference-manuals/efr32xg22-rm.pdf)

这块板子上的芯片:

Fs69abRuZvzdwgeR4q7RUI2m4kKf

GPIO 有26个, QFN40封装

FqRzYLSCaE7M5xvpPnGZmFWC4oM9

PA00~PA08 9个

PB00~PB04 5个

PC00~PC07 8个

PD00~PD03 4个

一共有这26个GPIO脚

 

开发板情况

这个开发板虽然小,但是负载的传感器有很多,该开发板型号是4184A-A01 开发板原理图:[Schematic for BRD4184A-A01](https://www.silabs.com/documents/public/schematic-files/BRD4184A-A01-schematic.pdf)

官方开发板USER GUIDE[UG415: Thunderboard EFR32BG22 User's Guide](https://www.silabs.com/documents/public/user-guides/ug415-sltb010a-user-guide.pdf)

板载晶振是38.4MHz,低功耗晶振32.768(接PD0 PD1)

FrcooKaZMQdjglgsX-NNjl2R9scB

GPIO(LED, BUTTON)

FkRBQDIk6ljllmMfdsL71Zj-3MA9

LED有一个,接PB0, GPIO脚拉高是点亮,拉低是灭
- BUTTON 有一个,接PB1,button按下GPIO脚是低电平,button未按是高电平

外部FLASH

FkZRGQMQcHc_-TVe_l2ud5SX635I

板载一颗外部SPI flash, 大小是8Mbit,(1MKB FLASH),接的引脚是PC00~PC03

 

霍尔开关传感器Si7210

FnnvCNZCtAzLpXnBNt89VNjfVr7x

霍尔开关传感器接口使用的是I2C,13bit模数转换器。传感器由GPIO开关PA04来控制电源,PD02 PD03是I2C接口

FsEHldhD95htphve2rAQT6hvas2O

这边I2C还接了Si7021 相对温湿度传感器,Si1133 UV 光敏传感器

 

6轴传感器

FmW49NqZQSd2sXNG4J2OvIpHh7NE

六轴用的是ICM-20648用的是SPI接口和SPI FLASH在同一个总线上,不同是CS脚不一样也用了一个开关

FknAy4j4TxHBLOgqccmUdGRDsAsc

 

 

MIC phone

FodzA1BwRph05NgjkeZ6u1ZzEAJE麦克风有两个分别是左右声道,使用的是I2C接口

PC6 - I2C_CLK

PC7- I2C_DATA

 

调试系统

板载J-LINK,非常mini的调试口,板子上反面最大的一颗IC就是DEBUG IC, 型号是:EFM32GG12B410F1024GL120-A

这颗IC也外置了一颗SPIflash和主芯片一样MX25R,非常小的一颗IC.

FjRQeHpgKZCaQZ5CbqlIgyvXDWNb

PA3-SWO

PA2-SWDIO

PA1-SWCLK

PA5-UART_RX

PA6-UART_TX

 

也可以跳过调试器直接调试板子:

Fo-JCOYIBrBNz7GsXdjga1kVYN4N

两侧connect引脚

Ft7CbLeQ1HIfT4pszliUpht5xVUB

IIC的引脚和SPI引脚已经引出来了

 

GPIO引脚选择

那silicon的引脚如何选择对应的功能呢?

我们依靠两张表格

第一张表格这张表格代表GPIO脚复用的不可控的情况比如PA02 PA01只能用SWCLK和SWDIO debug调试接口

FpkTckQP2fmz6d4kpH2GbdAqbXtG

Fgn-FITOee5FjPEn7R_hrUQADLWG

这张图也就是说ADC所有脚都可以用

剩下的就参考下面这张图

FrlMSMRDERnatygEMoxf7yeGEtPA

这张图大概意思就是比如I2C0.SCL I2C0.SDA 两个脚PA PB PC PD脚都可以用,只有脚没有其他的地方影响。

 

蓝牙

官方参考API主页:[General Overview - v2.13 - Bluetooth API Documentation Silicon Labs](https://docs.silabs.com/bluetooth/latest/)

官方蓝牙API文档:[Bluetooth Software API Reference Manual](https://www.silabs.com/documents/public/reference-manuals/bluetooth-api-reference.pdf)

蓝牙profile 开发user guide: [UG118: Bluetooth® Profile Toolkit Developer's Guide](https://www.silabs.com/documents/public/user-guides/ug118-bluegecko-bt-profile-toolkit.pdf)

 

蓝牙sample

整理了一下BG22开发板的蓝牙的sample:

分为以下几个:

Fih2FpGGI2jYX_dsi5KdkyUtiO4w

- Thermometer Client 和Server(默认没有后缀的都是server,因为通常手机作为client)

这个sample遵循的是SIG规定的GATT profile,[Health Thermometer](https://www.bluetooth.org/docman/handlers/downloaddoc.ashx?doc_id=238688)(0x1809)

这个sample可以用两个板子,一个跑client,一个跑server,也可以用一个板子跑server,手机用app

FiSgvPUZE-UKgK9LAHruGO43x1BI

连上之后,通过client端UART口打印,可以看到图中所示,指示出对应的地址的温度,该client端可以自动连接N个client。

用手机测试可以用官方的EFR Connect apk,来连接,连上之后,打开CCCD就可以看到对应的温度实时发送过来。

FrvOzroAwpKyBqHAjEHdhZ3EJHpX

- Thunderboard

这个sample中是一个综合的演示例程,可以使用一个叫`Thunderboard` 的app来演示对应的server的值,基本上把板子上的霍尔感应,温湿度传感器,LED灯,BUTTON都在APP中提供了演示,

参考的SIG 的GATT PROFILE 有:

- [Environmental Sensing Service 0x181A ](https://www.bluetooth.org/docman/handlers/downloaddoc.ashx?doc_id=294797)
- [Automation IO Service 0x1815](https://www.bluetooth.org/DocMan/handlers/DownloadDoc.ashx?doc_id=304972)

 

设计思路

对于蓝牙BLE来说,这次任务主要是在client端和server端进行操作。

- client -----这个就是设备发起命令和请求server数据和接收notify
- server----- 这个是设备响应命令和请求,并且可以发数据给client端。

也就是通常用手机连接某个蓝牙传感器的时候,手机就是client端,传感器就是server端。

通常手机都是作为client端来操作server端的数据的。

通过了解蓝牙协议栈之后,我们知道只需要实现client端控制我们的BG22开发板即可,这边有很多种方式,大致上有两个方向:

- 手机作为client端:可以用微信小程序来实现操作开发板,也可以直接修改官方的[Thunderboard](https://github.com/SiliconLabs/thunderboard-android) apk来实现,这个在github上是有源码的

- 电脑作为client端:可以使用PC上的蓝牙来作为client端,来控制server,linux下面可以用bluez,windows下面可以net windorm变成
- MCU作为client端:这个可以找一个其他的蓝牙板子,作为client端,检测到温度达到某一个阈值之后,直接操作GATT来点亮小灯,像WB55, NRF52840这些设备都可以,也可以用silicon lab来作为client端。

大体上就这些方向,

 

流程图:

```sequence
Title: 标题:FUNPACK 第四期
client-->>server: scan adv
client-->>server: if adv have uuid 0x181A
client -> server: connect
client -> server: discovery all service
client -> client: save the led handle and Temperature handle
client -> server: read the Temperature handle
client -> client: check the Temperture if > 25°C
client -> server: control the led handle
```

 

主要代码片段

主要修改代码在Project\client\soc_thermometer_client\app.c中,

首先根据server端打出的广播UUID我们来筛选设备

```
static uint8_t find_service_in_advertisement(uint8_t *data, uint8_t len)
{
uint8_t ad_field_length;
uint8_t ad_field_type;
uint8_t i = 0;
// Parse advertisement packet
while (i < len) {
ad_field_length = data[i];
ad_field_type = data[i + 1];
// Partial ($02) or complete ($03) list of 16-bit UUIDs
if (ad_field_type == 0x02 || ad_field_type == 0x03) {
// compare UUID to Health Thermometer service UUID
if (memcmp(&data[i + 2], thermo_service, 2) == 0) {
return 1;
}
}
// advance to the next AD struct
i = i + ad_field_length + 1;
}
return 0;
}

// Health Thermometer service UUID defined by Bluetooth SIG
static const uint8_t thermo_service[2] = { 0x1A, 0x18 };
```

thermo_service这个就是对应的uuid 0X181A

之后连接设备,连上之后就开始查找服务

```
sc = sl_bt_gatt_discover_primary_services(evt->data.evt_connection_opened.connection);
```

查找到对应的服务保存对应的handle

```
if(evt->data.evt_gatt_service.uuid.len == 2)
{
if(!memcmp(evt->data.evt_gatt_service.uuid.data, thermo_service,2))
{
sl_app_log("We have environment temperate servcie\r\n");
conn_properties[table_index].thermometer_service_handle = evt->data.evt_gatt_service.service;

}
else if(!memcmp(evt->data.evt_gatt_service.uuid.data, led_service,2))
{
sl_app_log("We have led_service \r\n");
conn_properties[table_index].aiot_service_handle = evt->data.evt_gatt_service.service;
}

}

```

之后一直查询对应的温度值:

```
sl_bt_gatt_read_characteristic_value(conn_properties[table_index].connection_handle,conn_properties[table_index].thermometer_characteristic_handle);
```

最后可以根据温度阈值做对应的处理,来点亮LED灯的handle

```
if((rht_temperature > 2500) && (led_status == 0))
{
sl_app_log("the rht_temperature has up to 30 C, OPEN LED\r\n");
led_status = 1;
sl_bt_gatt_write_characteristic_value(conn_properties[table_index].connection_handle,conn_properties[table_index].aiot_service_led_handle, 1,&led_status);
}
else if((led_status ==1) && (rht_temperature <= 2500))
{
led_status = 0;
sl_app_log("the rht_temperature has up to 30 C, CLOSE LED");
sl_bt_gatt_write_characteristic_value(conn_properties[table_index].connection_handle,conn_properties[table_index].aiot_service_led_handle, 1,&led_status);
}
```

 

心得体会

这次活动非常好,任务也不是特别难,对于普及蓝牙基本知识能够起到很大的作用。大家通过这个能学到蓝牙的基本知识和使用。并且可以了解世界顶级MCU巨头silicon lab的产品,从产品中也可以学到很多传感器相关的知识。

建议:

一个月的时间,有些仓促,任务比较简单,大家都是入门,如果能够拉动大家后续继续学习跟进,就能持续学习下去。也可以组织大家一起来给开源提供一些PR来促进大家学习兴趣。

 

个人信息:

· 姓名 李涛

· 电话 15895566607

· 邮箱 89524862@qq.com

· 公司或学校 霍尼韦尔

· 职务或专业及年级 嵌入式软件工程师

团队介绍
李涛,是一名嵌入式软件工程师,之前有一些蓝牙经验。
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号