温度监测系统实现案例
使用小机云自定义页面,快速实现STM32+蓝牙模块的灯光控制功能
准备工作
确保已经在小机云的项目中已经创建设备,且该小机云控制台上设备的MAC(需要带冒号)与蓝牙的MAC(不带冒号)号一致。即蓝牙MAC为1122334455即平台上需要创建11:22:33:44:55
确保小机云设备绑定的是默认控制页(创建后默认使用该页)。控制页样式如下:
硬件结构
从机:小机云蓝牙模块,型号MB026A
主机:STM32F103C8T6核心板,如下图
附件材料:
usb转串口:用于stm32串口打印日志到PC
stm32仿真器:stm32固件下载仿真
STM32引脚 | 功能 | 对应界面组件 |
---|---|---|
PA2 | 日志打印串口 TX | 无 |
PA3 | 日志打印串口 TRX | 无 |
PA9 | 指令通讯口TX | 无 |
PA10 | 指令通讯口RX | 无 |
PA6 | PWM1 | 灯光亮度滑动条 |
PA7 | PWM2 | 暂无 |
PB3 | 控制IO | 灯光选择1(红灯) |
PB4 | 控制IO | 灯光选择2(绿灯) |
PB5 | 控制IO | 灯光选择3(蓝灯) |
PB6 | 中断 | 阀门1 |
PB7 | 中断 | 阀门2 |
PB8 | 控制IO | 开关1 |
PB9 | 控制IO | 开关2 |
PC13 | 状态 | 无 |
接线
电脑使用串口工具与STM32 PA2/3连接,查看STM32运行日志
STM32引脚PA9/10与蓝牙模块 RX/TX 连接
STM32核心板的3.3V和G分别连接蓝牙模块的3.3V和GND
使用仿真器连接STM32的GND,SWCLK,SWO,3V3
仿真器插入USB线后由此给单片机和蓝牙模块供电(注意,请连接好所有的线后再上电)
配置项目信息
- 在项目卡片中,点击设置图标,查看项目ID(ProjectId)与项目密钥(ProjectSecret)
在源码中填入上面得到的ProjectId与ProjectSecret
c//xgc_cmd.c //填入小机云项目的ProjectId与ProjectSecret char project_id[] = "xxxxxxxxxxxxx"; char project_secret[] = "xxxxxxxxxxxxxxxx";
stm32的源码中默认包含KeyContent流程,需要在xgc_cmd.c的cmd_crc()函数中配置您的校验内容。如果您没有改过项目的校验方式,只需要填入ProjectId与ProjectSecret即可,蓝牙与APP连接成功后会自动进行检验
配置ProjectId和ProjectSecret后,烧录到单片机,并重启单片机。
STM32相关的日志打印 STM32上电后会日志串口会收到的日志
- 程序启动:This is a xgc ble demo
- 复位蓝牙模块:sendCmd: AT+REBOOT=1
- 查询MAC地址:sendCmd: AT+MAC?
- 收到MAC回复:get mac E2E05A707F18 E2:E0:5A:70:7F:18 APP连接蓝牙后日志串口会收到的日志
- 连接成功:is_ble_connected 1
- 查询时间:sendCmd: $X#N&11
- 收到时间回复:timesatmp 1737093438434
- 向APP发送校验:sendCmd: $X#K#xxxxxxxxxxxxxxxxxx&33
- 校验成功,核验成功后APP可以正常使用:crc ok !!!
效果测试
APP与蓝牙连接成功后
点击APP的开关1,PB8会有状态变化
点击APP的开关2,PB9会有状态变化
拖动灯光亮度条后,PA6 PWM有变化
STM32的PB6/PB7 IO高电平中断后APP指示灯组件会有变化
点击通道选择,引脚PB3,4,5状态会变化
点击方向键的OK键,日志打印串口会有ok button down日志打印
STM32会模拟温度数据,您也可以看到APP温度值的变化
源码分析
重要的两个文件,更多具体的内容请看源码,源码有详细的注释
xgc_handler.c:收到APP指令后的解析处理工作
xgc_cmd.c:小机云常用的文本协议指令
xgc_at_handler.c:蓝牙模块AT指令入处理
xgc_at_cmd.c:蓝牙模块AT指令
如何快速迁移至其他平台
如果您需要把STM32的源码迁移到其他C语言的硬件平台,如Ardurino。您可以直接使用STM32 demo项目下USER/application的源码,所有主要的小机云服务和蓝牙模块的交互逻辑都在application目录下。您只需要实现几个硬件相关的函数即可迁移成功。 必要实现的函数:
- USART1_IRQHandler: 串口接收函数,主要用来接收小机云服务协议和蓝牙模块协议,接收到的内容交给parse函数处理。
- sendCmd:向蓝牙模块串口发送数据的函数
根据项目需求实现或留空的函数:
- LED8,LED9,LEDR,LEDG,LEDB:设置LED的函数,这个几是#define
- getPB6Leve,getPB7Leve:获取LED电平的函数
- set_led_brightness:设置LED pwm亮度的函数
- key_callback:按键中断的函数
其他需要注意的事项: 该例程会在main()中调用chckBleState检查蓝牙状态,如果蓝牙已经连接,且没有拿到时间戳,会循环向蓝牙模块请求时间戳,当蓝牙与手机连接成功后,单片机即可拿到时间戳,进行下一步的与服务器检验