蓝澍黁 - 检测温度,利用蓝牙控制LED灯
通过树莓派编程来实现检测温度,如果温度异常超过一定范围之后再通过蓝牙来控制LED灯
标签
显示
理工男
更新2021-02-08
777

硬件介绍

EFR32BG22板卡(后文简称BG22)是由Silicon Labs开发的一款IOT产品平台,BG22板卡在一众蓝牙板卡中很有优势。

首先,板载的核心蓝牙芯片,EFR32BG22芯片,5.2蓝牙版本,非常新带有76.8Mhz主频,512K闪存、32K RAM 的ARM Cortex-M33架构芯片。

M33架构在性能、功耗、安全与生产力间达到了极佳的平衡,作为首款采用 TrustZone 安全技术和数字信号处理技术的 ARMv8-M 全功能实现处理器,该核心的大部分指令可以在2个阶段完成,仅部分复杂指令需3阶段,并且支持作为协处理器工作。

其次,板卡上集成了双声道麦克风、6轴传感器、紫外线模块、霍尔磁感应模块、温度测量模块,基本集总了传感器应用下最为常见的感应模块,值得一提的是,这些MEMS-IC(微机械芯片)基本都是Silicon Labs自家的产品,想必该板独立工作的各方面兼容性能是能够保证的。

第三点,板载调试器,USB Micro-B型连接器可以直连调试、烧录。

第四点,提供大量的例程,低功耗工作,各传感器的电源都可控,可以采用3V CR2032电池供电。

 

开箱上电

Digikey购买的芯片到手是一个小盒子,打开里面是静电防护袋中的小开发板,板子很精致,全板正面最突出为1.27间距的2*5公排针座,连接调试器,背面是cr2032的电池座,直接焊接固定在PCB上。

板上除3个大电容外均为0201的封装,板子的集成度非常之高,不下于手机PCB,PCB布线可能是6或8层板。

板上的芯片封装都很小,绝大部分是QFN封装。

电源可以通过两种方式提供,microB连接5V电源(比如电脑USB),或者板载的电池座。

两种方式都尝试过,电池座用了DIY的优联键盘用废的cr2032电池,电压已经降到2.8V,在该电池供电下,芯片也可以正常工作,APP连接显示电量为40%。

 

板卡用途分析

工程应用中经常会测试一些环境温度,是否密封,震动强度等信息,单独实现这些功能非常麻烦,要集成不少东西并且设计专门界面,往往还要占用一些信号传输的线路。

但采用BG22板卡,将其作为模块嵌入到电路板上,只需要额外提供一个电源,就可以通过外部的client低功耗的获取环境信息,并且不占用多余的线路,蓝牙的射频信号功率不大,也不会对电路造成太大的干扰。

 

软件上手

Simplicity Studio是官方的IDE,里面自建了很多例程,IDE的缺点是有BUG,启动慢。我就碰到过启动不出现软件例程界面的现象。

安装完IDE ,连接官方的BG22,会自动安装驱动识别,并提示升级固件版本,自动更新完固件后,就可以正式使用了。

因为在单片机方面的编程功底不行,在简单编译测试了自带固件后,没有深入使用。

 

设计思路

1. BLE(Bluetooth low energy)协议

这部分学习基于硬禾学堂公众号的《蓝牙BLE详解》文章

BLE协议是低能耗、短距离、低成本、可互操作的无线技术,利用许多只能手段最大限度降低功耗。

BLE技术适用于无线传感器,每半秒传输一次数据的应用场景。

BLE技术的架构如图所示,其中物理层的radio就是2.4G的射频接口,是实际的元件层面的东西。

在最上层是基于GATT与GAP的应用层,一般来说,对于蓝牙BLE应用,从机广播地址,主机扫描地址并建立连接。

GAP **层****(Generic access profile)。GAP 是对 LL 层 payload(有效数据包)如何进行解析的两种方式中的一种,而且是最简单的那一种。GAP 简单的对 LL payload 进行一些规范和定义,因此 GAP 能实现的功能极其有限。GAP 目前主要用来进行广播,扫描和发起连接等。

GATT(Generic attribute profile )。GATT 用来规范 attribute 中的数据内容,并运用group(分组)的概念对 attribute 进行分类管理。没有 GATT,BLE 协议栈也能跑,但互联互通就会出问题,也正是因为有了 GATT 和各种各样的应用 profile,BLE 摆脱了 ZigBee 等无线协议的兼容性困境,成了出货量最大的 2.4G 无线通信产品。

FnhRZqv18ENJePc6G92vGublDTPP

2. 通过树莓派hack BG22的蓝牙界面

由于BLE低功耗设备基于GATT进行的通信,并且采用的是未加密的数据,而BG22自带的固件恰好是可以通过手机APP建立连接的从机,因此,尝试采用树莓派的gattool工具来对BG22的蓝牙进行hack访问。

拿出了荒废已久的树莓派3,重新烧写了最新的ubuntu系统,开启VNC服务,升级系统,安装Python3,安装bluetooth环境。

sudo apt install pi-bluetooth

sudo apt isntall bluetooth bluez blueman

FpoNdxsL0Shk2WoBbwcOCKd588Ag

查看BG22的蓝牙地址

sudo hcitool lescan

84:2E:14:31:C3:F2

 

连接BG22并进入交互模式

sudo gatttool -b 84:2E:14:31:C3:F2 -I

 

查看设备提供的传感器服务

primary

attr handle: 0x0001, end grp handle: 0x0008 uuid: 00001801-0000-1000-8000-

00805f9b34fb

attr handle: 0x0009, end grp handle: 0x000d uuid: 00001800-0000-1000-8000-

00805f9b34fb

attr handle: 0x000e, end grp handle: 0x001a uuid: 0000180a-0000-1000-8000-

00805f9b34fb

attr handle: 0x001b, end grp handle: 0x001e uuid: 0000180f-0000-1000-8000-

00805f9b34fb

attr handle: 0x001f, end grp handle: 0x002a uuid: 0000181a-0000-1000-8000-

00805f9b34fb

attr handle: 0x002b, end grp handle: 0x002d uuid: ec61a454-ed00-a5e8-b8f9-

de9ec026ec51

attr handle: 0x002e, end grp handle: 0x0037 uuid: 00001815-0000-1000-8000-

00805f9b34fb

attr handle: 0x0038, end grp handle: 0x0041 uuid: a4e649f4-4be5-11e5-885d-

feff819cdc9f

attr handle: 0x0042, end grp handle: 0xffff uuid: f598dbc5-2f00-4ec5-9936-

b3d1aa4f957f

 

经过查询相关手册,确定0x0025是温度传感器对应的句柄,进行测试,可以看到随着手指按在传感器上,温度在上升。数据是16进制获取的,要替换下前后顺序就是实际得到的温度值。

[84:2E:14:31:C3:F2][LE]> char-read-hnd 0025

Characteristic value/descriptor: 9e 04

[84:2E:14:31:C3:F2][LE]> char-read-hnd 0025

Characteristic value/descriptor: 9e 04

[84:2E:14:31:C3:F2][LE]> char-read-hnd 0025

Characteristic value/descriptor: 9e 04

[84:2E:14:31:C3:F2][LE]> char-read-hnd 0025

Characteristic value/descriptor: 9e 04

[84:2E:14:31:C3:F2][LE]> char-read-hnd 0025

Characteristic value/descriptor: 63 06

[84:2E:14:31:C3:F2][LE]> char-read-hnd 0025

Characteristic value/descriptor: 63 06

[84:2E:14:31:C3:F2][LE]> char-read-hnd 0025

Characteristic value/descriptor: aa 08

[84:2E:14:31:C3:F2][LE]> char-read-hnd 0025

Characteristic value/descriptor: aa 08

 

修改APP实现功能

水平有限,最终实现是通过修改官方的APP实现的。

通过树莓派中对应句柄,可以查找到temperature界面调用传感器数据的位置

在util/Gattmanager中找到相应内容,下图中为修改部分,在APP获取温度数据的同时,加入了一条判断,当该数值大于28时(对应界面28度,则点亮LED灯)。

FuC7p783dhZiWY6EJD2GFFI74wxt

 

主要代码片段

Timber.d("temperature: %d",temperature);

//this part for LED

BleUtils.writeCharacteristics(

gatt,

ThunderBoardUuids.UUID_SERVICE_AUTOMATION_IO,

ThunderBoardUuids.UUID_CHARACTERISTIC_DIGITAL,

01,

BluetoothGattCharacteristic.FORMAT_UINT8,

0

);

 

致谢

感谢硬禾的funpack提供的支持,也感谢群里面的大神们的方案头脑风暴,虽然最终实现的比较low,但学到了很多知识,祝硬禾学堂及funpack活动越办越好。

 

团队介绍
蓝澍黁
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号