:本文将教你如何使用它STM32HAL图书馆快速开发和涂鸦WIFI模块通信,接入涂鸦云。
实现功能:通过APP实时监测温湿度数据
程序下载路径:demo程序。
demo程序(定期收集数据)。
一.使用STM32CubeMX创建新项目
1.在下图中创建新项目:
2.如下图所示,选择您现有的。STM32开发板:
配置时钟源
如果选择使用外部高速时钟(HSE),则需要在System Core中配置RCC;
如果使用默认内部时钟(HSI),这一步可以省略;
我在下面的项目中使用内部时钟,所以不需要这一步。
4、配置串口
NUCLEO-L476RG板载ST-Link原理图如下:
使PC的串口与USART2之间连接。(USART2是打印日志口,也是程序下载口)
接下来,开始下图配置USART2:
使用串口1和涂鸦模块WB3S通信(单片机和WB3S串口通信,采用透传模式),串口1配置如下图所示:
5、配置IIC口
采集温湿度数据(SHT30)单片机采用IIC通信协议和温湿度模块I2C2.配置如下图所示:
配置时钟树
STM32L最高主频为80M,所以配置PLL,最后使HCLK=80Mhz即可:
7.生产工程设置
8、代码生成设置
最后,生成独立的初始化文件:
9、生成代码
点击GENERATE CODE即可生成MDK-V5工程如下:
10.用KEIL打开生成的代码,开始添加要实现的功能函数。
二.SHT30驱动程序设计
我们选择涂鸦进行温湿度检测SHT30模块实现。涂鸦三明治温湿度传感功能板是三明治开发板的应用部分,方便开发者快速实现温湿度硬件产品原型。功能板主要包括一个 SENSIRION 温湿度传感器 SHT30-DIS,通过 I2C 协议通信,I2C最高时钟频率支持1MHz。
器件 | 说明 |
---|---|
U1(SHT30-DIS) | SENSIRION 温湿度传感器,工作电压 2.4~5.5V,湿度精度 ±2%RH,温度精度 ±0.3℃,封装 8 脚 DFN |
I/O | 说明 |
---|---|
VCC | 电源供电脚 |
GND | 电源参考地 |
SCL | I2C时钟信号 |
SDA | I2C数据信号 |
INT | 预留报警信号 |
-
电源电压参照传感器工作电压范围.4~5.5V
-
典型的非测量电流:0.2uA
-
典型的低功耗连续测量模式电流:800uA
涂鸦三明治温湿度传感功能板的原理图如下:
涂鸦三明治温湿度传感功能板 PCB 如下图所示:
-
作为应用部分,功能板需要配合控制板和电源板。
-
不要触摸电源接口 I/O 管脚应避免击穿模块 I/O 口。
-
灰尘和油污附着在传感器本体上,会降低测量精度。
-
传感器本体不能接触洗涤剂,如洗板水。
-
不得使用会释放化学分子的材料包装,否则会造成数据偏移或完全损坏。
(2)软件设计
为了测量温度和湿度,选择涂鸦SHT实现30温湿度模块。STM32通过硬件I2C与之通信。
/** * @brief 复位SHT30 * @param none * @retval none */ void SHT3x_Reset(void) { SHT3x_Send_Cmd(SOFT_RESET_CMD); HAL_Delay(20); }
/* 描述:SHT3x将初始函数设置为周期测量模式 * 参数:无 * 返回值:初始化成功返回0,初始化失败返回1 */ uint8_t SHT3x_Init(void) { uint8_t ret; ret = SHT3x_Send_Cmd(MEDIUM_2_CMD); return ret; }
/* 描述:需要提前设置温湿度数据获取函数和周期读取。 * 参数Tem_val:存储温度数据的指针, 温度单位为°C * 参数Hum_val:存储湿度数据的指针, 温度单位为% * 返回值:0-读取成功,1-读取失败 ********************************************************************/ uint8_t SHT3x_Get_Humiture_periodic(double *Tem_val,double *Hum_val) { uint8_t ret=0; uint8_t buff[6]={0}; uint16_t tem,hum; double Temperature=0; double Humidity=0; ret=SHT3x_Send_Cmd(READOUT_FOR_PERIODIC_MODE); Delay_us(4); ret=HAL_I2C_Master_Receive(&hi2c2, SHT3x_ADDR_READ, buff, 6, 0xFFFF); /* 检查温度数据和湿度数据是否正确接收 */ if(CheckCrc8(buff, 0xFF) != buff[2] || CheckCrc8(&buff[3], 0xFF) != buff[5]) { printf("CRC_ERROR,ret = 0x%x\r\n",ret); return 1; } /* 转换温度数据 */ tem = (((uint16_t)buff[0]<<8) | buff[1] Temperature= (175.0*(double)tem/65535.0-45.0) ; // T = -45 175 * tem / (2^16-1) /* 转换湿度数据 */ hum = (((uint16_t)buff[3]<<8) | buff[4] Humidity= (100.0*(double)hum/65535.0); // RH= hum*100 / (2^16-1) /* 过滤错误数据 */ if((Temperature>=-20)&&(Temperature<=125)&&(Humidity>=0)&&(Humidity<=100)) { *Tem_val = Temperature; *Hum_val = Humidity; return 0; } else return 1; }
三.平台产品创建
进入,点击创建产品。这里不用纠结产品品类的选择,重点是为了拿到MCU-SDK文件,实际使用时可以根据具体的产品修改sdk内部的pid即可适配自己的产品。
例如:点击创建产品,选择标准类目->电工->开关。(当时为了测试用,所以选择一个标准类目,也可以在平台上选择其它品类去创建也是可以的)
-
选择自定义方案,输入产品名称,选择通讯协议为WIFI+蓝牙,点击创建产品。
-
根据要实现的设备功能,创建好DP功能点。
-
创建好DP点之后,点击设备面板,选择自由配置面板,方便开发调试,也可以选择其它的面板。
-
面板创建好之后,点击硬件开发,对接方式选择“涂鸦标准模组MCU SDK开发”,模组选择WB3S Wi-Fi&Bluetooth模组(在实际开发过程中可选择手上已有的涂鸦模组即可),固件选择通用固件。
四.MCU SDK移植
平台产品创建完之后,我们会获取到一个MCU SDK包,之后就可以快速移植到MCU了。
在解压后的文件夹中找到mcu_sdk相关源文件和头文件,全部拷贝到我们创建好的工程模板里的MCU_SDK文件夹里;打开上面创建好的工程,将mcu_sdk的源文件添加进对应组里,同时添加include paths:
点击编译,会崩出几个error,接下来就需要按照出error的地方注释提示一步步修改代码。
uart_receive_input()为串口接收数据处理接口,只需将它放进串口中断即可,这里我们以串口1作为与模组通讯串口,调试中把串口2作为日志口,首先在main函数中添加串口1和串口2初始化代码,并使能接收中断(接收使能中断已在串口初始化函数中体现):
-
然后在stm32l4xx_it.c文件中添加中断处理函数,然后包含 mcu_api.h文件并将
uart_receive_input()
接口添加进去,添加完成后,删除error注释即可:
再来看下一个errror,由于我们上一步已经通过中断接收的形式实现了串口数据接收处理了,这个多字节处理我们可以不用,直接把error注释删除即可。
下一个errror:
按照提示将该接口放在main函数的while循环内即可,别忘了在 中包含 头文件。
再来看下一个error:
同样的,按照提示将该函数放到main函数开头部分即可。
然后是串口发送相关:
这里只需实现串口1的数据发送函数然后放进去即可。使用STM32 HAL库里面的串口单字节发送函数,以阻塞方式发送数据量,添加代码如下:
然后是DP数据点上报相关的:
这里我们可以直接注释掉error提示,在实际开发过程中再实现该功能即可。
以下在主函数里面,添加温度和湿度上报的数据。这里可以改成自己想要上报传感器的数据。
最后是产测相关的:
一般开发者不涉及生产测试的话直接删除注释不用管就行。
下图这个红色标出的函数是进行配网的,通过NUCLEO-L476开发板上的用户按键进行配网连接。
修改完上述几处地方后,再次编译,显示error全部消除,至此涂鸦MCU SDK就已移植完毕,后续可使用涂鸦模组调试助手进行测试。涂鸦模组调试助手的使用方法可参考调试助手文档。
五.实验样机测试展示
通过之前配置好的面板,通过涂鸦智能APP进行配网实时采集温湿度传感器的数据。