完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
` 本帖最后由 MMCU5721167 于 2020-1-15 13:17 编辑 在前面两个章节中我们详细介绍过的基于MM32W系列芯片开发的智能灯控方案和蓝牙自拍杆方案,在本章节我们将继续给大家介绍一个使用场景较为丰富的蓝牙应用方案——基于MM32W系列开发的温湿度监测仪。 图1 方案应用图 温度、湿度与我们的生活息息相关,科研实验室、农业大棚、食品储存室、疫苗存储及配送、贮藏室等对环境的温度、湿度有着严格的控制标准,温度、湿度的异常变化都可能会给其造成严重的影响。传统的人工巡查和记录环境温湿度变化并非易事,随着时代的发展,可实现智能化监测环境温湿度的温湿度传感器出现了。如今,科研、农业、暖通、机房、航天航空、电力等工业部门都开始采用智能化的温湿度传感器监测环境的温湿度。利用温湿度传感器对环境的温湿度进行实时监测,不仅能够及时发现环境温湿度的异常,进而做出应对措施,避免或减少损失,还能够减少员工工作量,降低人力成本。 硬件资源如下: 本方案基于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模式。 以下为主函数初始化配置内容,主要将所有的外设资源和蓝牙协议栈初始化,并且以中断服务程序的方式运行蓝牙,代码如下: 主函数的循环中主要实现的功能为定时采集和显示当前环境的温湿度数据,而该数据也将在蓝牙服务中发送到APP端显示,代码如下: 下面简单介绍一下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);//换算处理好湿度数据后通过蓝牙发出 } } 除了上述关键的蓝牙数据发送函数外,下面再简单介绍一些与蓝牙相关的特征值定义: |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
2256个成员聚集在这个小组
加入小组灵动微电子MM32全系列MCU产品应用手册,库函数和例程和选型表
11926 浏览 3 评论
【MM32 eMiniBoard试用连载】+基于OLED12864的GUI---U8G2
6017 浏览 1 评论
【MM32 eMiniBoard试用连载】移植RT-Thread至MM32L373PS
11149 浏览 0 评论
【MM32 eMiniBoard测评报告】+ 开箱 + 初探
4617 浏览 1 评论
灵动微课堂(第106讲) | MM32 USB功能学习笔记 —— WinUSB设备
4351 浏览 1 评论
[MM32软件] MM32F002使用内部flash存储数据怎么操作?
1588浏览 1评论
893浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-14 05:37 , Processed in 0.574211 second(s), Total 36, Slave 29 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号