.
前言:
本期给大家带来一款精致炫酷的蓝牙土壤温湿度传感器,用于做盆栽呵护类产品.
.
1. 成品展示
淘宝上卖得比较多的主要是下面这种模块,其主要作用是测量土壤电阻(越潮湿,电阻越小;越干燥,电阻越大),同时卖家会提供一个adc电路,该电路有电压比较器,可以根据可调电阻设置比较阈值,从而实现土壤湿度到达某一阈值后,直接输出开关信号,如果后面再接一个继电器电路,则可以做一个简易的自动浇花系统。
我们本次给出的也是采用相同的原理,来实现土壤湿度检测。此外,还加了DHT11温湿度传感器,光敏电阻。综合实现盆栽呵护:
.
2. 原理图解析
如下图,整个系统有蓝牙模块(既做通信,也做MCU),纽扣电池电路,按键和指示灯电路,dht11温湿度传感电路,基于ad采样的土壤湿度监测电路,基于ad采样的光敏电阻电路,以及为了实现低功耗的电源控制电路:
.
3. pcb设计
pcb设计中比较重要的部分是: 土壤湿度检测部分。该部分需要尽可能增大与土壤的接触面积。如下图设计:
此外,采用纽扣电池电路,让整个系统轻量级; 将蓝牙模块的引脚全部引出来,方便做二次开发和调试; 按键用来重置设备; 指示灯用来指示工作状态。
.
4. 嵌入式对外提供接口
4.1 蓝牙广播
1)基本属性:
- Advertising interval: 200 ms
- Advertising interval low-power: 1000 ms
- Advertising broadcast: always on
- Connection interval: 30 ms
2)广播包 (Advertising Data) 分为:
- 广播包 (Advertising Data)
- 响应包 (Scan Response)
注:主机主动扫描的情况下, 发送扫描请求给从机, 从机返回扫描响应数据:
3)广播包数据格式:
每个包都是 31 字节,数据包中分为有效数据(significant)和无效数据(non-significant)两部分。
有效数据部分 包含若干个广播数据单元,称为 AD Structure 。如图所示,AD Structure 的组成是:
- 长度 Len ,表示这个 AD Structure 的长度(除去 len本身 1)
- 类型 AD Type 标记这段广播数据代表什么, 比如设备名, uuid 等。
- 数据 AD data
无效数据部分 广播包的长度必须是 31 个 byte,如果有效数据部分不到 31 自己,剩下的就用 0 补全。这部分的数据是无效的。
对于该设备,我们约定其广播数据格式为:
02 | 01 | 05 | - |
06 | 09 | 35:31:69:6f:74 | name:51iot |
10 | ff | 00:00 | 保留1 |
85:81:D7:9D:FF:FF | MAC 6 字节地址,大端(顺序-看着舒服的放法) | ||
01 | 类型-用于标志不同的ble广播格式 | ||
pid (6bytes) | 产品ID,每个产品一个ID |
注:根据name过滤出属于51iot的产品;kind=0xFF的数据放广播响应包,其他放广播包;
.
4.2 蓝牙服务和属性
这里暂时只有一个服务,服务中包含:APP->DEVICE 的具备write能力的数据下行特征;和DEVICE->APP的具备notify能力的数据主动上报特征.其UUID定义如下:
service | 000102030405060708090a0b0c0d1990 | |
PhoneToBle | 000102030405060708090a0b0c0d1993 | write |
BleToPhone | 000102030405060708090a0b0c0d1994 | notify |
.
4.3 数据包格式
5.4.2节主要规范了数据上行和下行的通道,本节主要规范数据应该以怎样的格式在上述通道中传输.首先我们要知道蓝牙上行/下行传输单次不能太长(专业术语叫最小传输单元MTU),一般20字节,我们这里规定是20字节,多了要采用分包机制发送.
1)最小帧长度:
MTU=20 bytes
2)格式:
55 AA | 头 |
00 | 版本 |
cmd | 命令(1byte) |
data_len | 数据长度(1byte) |
data | 数据 |
check_sum | 校验和(除了check_sum求和对0xff取余) |
3)dp:
我们仿照主流物联云平台(涂鸦\阿里\小米等)对一个产品进行的数字化描述方法来对各种物联网产品进行数字化建模.
首先所有数据被划分为以下类型:
注:约定数组最长不超过256字节
这样我们就能够通过下面的方法来定义一个产品(本期的智能盆栽系统):
1 | 环境温湿度检测开关 | on_off_th | 可下发可上报 | 布尔型 | |||
2 | 土壤湿度检测开关 | on_off_soil | 可下发可上报 | 布尔型 | |||
3 | 亮度检测开关 | on_off_light | 可下发可上报 | 布尔型 | |||
4 | 实时温度 | temperature | 只上报 | 数值型 | 数值范围:0-100, 间距:1, 倍数:0, 单位:摄氏度 | ||
5 | 实时湿度 | humidity | 只上报 | 数值型 | 数值范围:0-100, 间距:1, 倍数:0, 单位:% | ||
6 | 实时突然湿度 | soil_humidity | 只上报 | 枚举型 | 枚举值: very_dry/dry/moist/very_moist | ||
7 | 实时亮度采集 | light | 只上报 | 数值型 | 数值范围:0-100, 间距:1, 倍数:0, 单位:光强百分比% | ||
7 | 历史数据上报 | history | 可下发可上报 | RAW型 | 时间戳4bytes+1字节的温度+1字节的湿度+1字节的土壤湿度+1字节的光强 |
.
4.4 数据通信模型
4.1~4.3对蓝牙的广播和服务对外提供的接口进行了规范和说明,此时使用常见的蓝牙调试工具(nrf connect/light blue...)都可以来验证我们的硬件设备是否是按照所规范的那样:
.
看上图第1页面,可以看到其广播数据和我们规定的一模一样;看上图第2页面,可以看到其服务和特征也和我们定义的一模一样,图3是我们向智能盆栽设备发送一个dp=1,值为false的数据(表示关闭环境温湿度采集).因此一个APP/微信小程序开发者,可以根据4.1~4.3的规范来开发应用程序,通过广播信息,找到指定蓝牙设备,通过notify和write两个通道,实现与指定蓝牙设备通信.这里我就不多说了,开发者可以根据该款开源硬件开放的接口,自己做各种炫酷的APP~
重要
- : 如果对该智能盆栽开源硬件感兴趣,可以微信扫码购买样机,自己调试哈
- 里面还有其它好玩有趣方案,都会以开源的PCB+标准化功能描述接口提供,开发者可以根据自己的技术栈,选择开发不同的上位机程序,做出各种有趣的小智能硬件~