![f3df0cf167e319efe885ce99fa6f8183.gif](https://i-blog.csdnimg.cn/blog_migrate/cf3c3d8cd42e7909e3c6b579cbb975fa.gif)
硬件资源如下:
本方案基于MM32 BLE_Test Board进行测试验证,搭配上温湿度传感器DHT11作为采集环境中温湿度数据,再加上一款小型的OLED屏幕作为本地式数据输出显示窗口,另外可以通过手机APP获取温湿度变化情况。在硬件原理上,本方案的DHT11模块的单线数据传输引脚连接到MCU的PA7,为了解析模块的数据时序,该引脚复用为TIM3_CH2输入捕获功能;使用硬件IIC接口连接到OLED屏上去,引脚为PB6(SCL)、PB7(SDA),可以将温湿度数据显示在OLED;蓝牙相关的功能引脚与前面介绍的方案一致,此处不做过多展开。软件资源如下:
结合上述使用到的硬件资源,下面我们着重介绍软件实现流程以及相关配置代码。使用MCU的引脚复用为TIM3_CH2输入捕获功能DHT11模块,在开启捕获时将PA7配置为浮空输入模式,复用功能选择AF1配置为TIM3的CH2输入捕获通道,并且将TIM3开启;在停止捕获时将PA7配置为推挽输出模式,并且将TIM3关闭。由于DHT11模块限制,温湿度采样周期间隔必须大于1S,本方案采样和显示周期为2S。 在使用OLED屏幕需要用到硬件IIC外设接口,需要将对应的PB6 PB7配置为复用开漏输出模式,初始化时还需要根据不同的OLED模块在函数IIC_Init()中修改slave设备地址,使能IIC接口后即可以开始传输工作了。由于数据采集和定时显示需要,本方案的低功耗模式采用STOP模式。 以下为主函数初始化配置内容,主要将所有的外设资源和蓝牙协议栈初始化,并且以中断服务程序的方式运行蓝牙,代码如下:下面简单介绍一下OLED操作相关的几个函数:
//初始化IIC
void IIC_Init(I2C_TypeDef* I2Cx);
//发送命令函数
static void Write_Command(unsigned char Command);
//发送数据显示在屏幕
static void Write_DataBuff(unsigned char *Data, unsigned char Len);
//OLED屏初始化
void OLED_Init(void);
//设置坐标
void OLED_SetPos(unsigned char x, unsigned char y);
//字符串显示
void OLED_DispStr(unsigned char x, unsigned char y, char *ch);
//显示logo
void OLED_DispLogo(void);
//清屏操作
void OLED_Clear(void);
下面简单介绍一下DHT11模块操作相关的几个函数:
// TIM3_CH2输入捕获初始化
void CaptureInit(void); //用TIM3_CH2 PB5 AF3
//启动捕获
void CaptureStart(void);
//停止捕获
void CaptureStop(void);
在TIM3_IRQHandler()中针对捕获的数据进行解析和处理。 我们在gatt_user_send_notify_data_callback函数中给手机发送数据,该函数属于回调函数,协议栈会在系统允许的时候(异步)回调本函数,该函数可用于蓝牙模块端主动发送数据之用,函数内部不得增加阻塞代码。该应用中我们在此函数中实现将采集转换好的温湿度数据传输给手机APP。详细实现代码如下://蓝牙连接成功后协议在空闲的时候会调用本回调函数
void gatt_user_send_notify_data_callback(void){
static u8 notiCnt = 0;//回调次数计数器
u16 humiBat ,tempBpm = 0;
unsigned char DHTData[3]={0x00,0x00,0x01};
notiCnt++; //每进一次该函数回调次数计数器+1
if(CaptureDataMon(&humiBat, &tempBpm) == 0) return;//未成功采集到温湿度数据立即返回
tempBpm %= 512;//初步判断温度数据大小
humiBat /= 10;//初步判断湿度数据大小
if (notiCnt >= 20) {//每进入该回调函数20次才发送一次温度数据
notiCnt = 0;
cur_notifyhandle = 0x12;//温度数据回复句柄值
if (tempBpm < 0x100){
DHTData[0] = 0; //1Byte
DHTData[1] = tempBpm;
sconn_notifydata(DHTData,2);//换算处理好温度数据后通过蓝牙发出
}
else {
DHTData[0] = 1; //2Byte
DHTData[1] = tempBpm;
DHTData[2] = tempBpm>>8;
sconn_notifydata(DHTData,3);//换算处理好温度数据后通过蓝牙发出
}
}
else if (10 == notiCnt) {//每进入该回调函数10次才发送一次湿度数据
SimBatt = humiBat; //0~100
cur_notifyhandle = 0x18;//湿度数据回复句柄值
sconn_notifydata(&SimBatt,1);//换算处理好湿度数据后通过蓝牙发出
}
}
除了上述关键的蓝牙数据发送函数外,下面再简单介绍一些与蓝牙相关的特征值定义:手机操作流程如下:
打开手机蓝牙并打开App,选择HRM进入,点击Connect按钮开始搜索温湿度蓝牙设备。 选择对应名称(MM32W0_DHT)的蓝牙设备并进行配对,等待连接成功。连接成功后会有相应提示,按钮Connect名字会变成Disconnect。 连接成功后,在App界面上电池图标会显示从DHT11传感器获取的湿度信息(百分比)Finger和图表会显示从DHT11传感器获取的温度信息(原始数据,温度值x10)。图2 手机APP图
往期精彩:
MM32W无线MCU系列产品应用笔记 —— 蓝牙自拍杆方案
MM32W无线MCU系列产品应用笔记 —— 智能炫彩遥控灯方案
MM32W无线MCU系列产品应用笔记 —— 自定义AT指令
MM32W无线MCU系列产品应用笔记 —— 自定义服务和特征值
MM32W无线MCU系列产品应用笔记 —— 接口函数调用
MM32W无线MCU系列产品应用笔记 —— 低功耗BLE蓝牙应用
MM32W无线MCU系列产品应用笔记 —— 阻塞式例程
MM32W无线MCU系列产品应用笔记 —— 中断式例程
MM32W无线MCU系列产品应用笔记 —— 蓝牙开发套件介绍
MM32W无线MCU系列产品应用手册 —— 模组与AT指令
基于MM32SPIN电机/电源专用芯片的有刷电机驱动应用方案——机器人舵机
基于MM32SPIN电机/电源专用芯片的无传感弦波驱动应用方案——手持式吸尘器
基于MM32SPIN电机/电源专用芯片的无感方波驱动应用方案——中小功率水泵
更多信息请访问:www.mm32mcu.com,微信公众号请搜索“灵动MM32MCU”,QQ技术讨论群:294016370。
![f52f2f4a670c7d4ea4babcf09e960a4e.png](https://i-blog.csdnimg.cn/blog_migrate/1b186a0a626d2a883a2309da3313aa52.jpeg)