简介:本文将教大家如何使用STM32HAL库快速开发和涂鸦WIFI模组通信,接入涂鸦云。

实现功能:通过APP实时监测温湿度数据

程序下载路径:demo程序

demo(定时采集数据)程序

一.使用STM32CubeMX创建一个新工程

1、如下图创建一个新工程:

Android 涂鸦对接 涂鸦接入hass_SHT3X

2、如下图选择自己现有的STM32开发板进行开发:

Android 涂鸦对接 涂鸦接入hass_SHT3X_02

3、配置时钟源

如果选择使用外部高速时钟(HSE),则需要在System Core中配置RCC;

如果使用默认内部时钟(HSI),这一步可以略过;

下面工程我使用的是内部时钟,因此这一步是不需要的。

Android 涂鸦对接 涂鸦接入hass_Android 涂鸦对接_03

4、配置串口

NUCLEO-L476RG板载ST-Link并且虚拟了一个串口,原理图如下:

Android 涂鸦对接 涂鸦接入hass_Android 涂鸦对接_04

使PC的串口与USART2之间连接。(USART2为打印日志口,同时也作为程序下载口)

接下来开始如下图配置USART2:

Android 涂鸦对接 涂鸦接入hass_Android 涂鸦对接_05

使用串口1和涂鸦模组WB3S通信(单片机和WB3S串口通信,采用透传的模式),串口1配置如下图所示:

Android 涂鸦对接 涂鸦接入hass_SHT3X_06

Android 涂鸦对接 涂鸦接入hass_物联网_07

5、配置IIC口

为了采集温湿度的数据(SHT30),单片机采用IIC协议和温湿度模块进行通信,采用I2C2,配置如下图所示:

Android 涂鸦对接 涂鸦接入hass_物联网_08

6、配置时钟树

STM32L4的最高主频到80M,所以配置PLL,最后使HCLK=80Mhz即可:

Android 涂鸦对接 涂鸦接入hass_STM32_09

7、生产工程设置

Android 涂鸦对接 涂鸦接入hass_SHT3X_10

8、代码生成设置

最后设置生成独立的初始化文件:

Android 涂鸦对接 涂鸦接入hass_SHT3X_11

9、生成代码

点击GENERATE CODE即可生成MDK-V5工程如下:

Android 涂鸦对接 涂鸦接入hass_嵌入式_12

10.用KEIL5打开生成的代码,然后开始添加自己要实现的功能函数。

二.SHT30驱动程序设计

(1)硬件设计

温湿度检测我们选取涂鸦的SHT30模块来实现。涂鸦三明治温湿度传感功能板为三明治开发板的应用部分,方便开发者快速实现温湿度硬件产品原型的一款开发板。功能板主要包含一颗 SENSIRION 温湿度传感器 SHT30-DIS,通过 I2C 协议进行通信,I2C时钟频率最高支持1MHz。

Android 涂鸦对接 涂鸦接入hass_Android 涂鸦对接_13

关键器件介绍

器件

说明

U1(SHT30-DIS)

SENSIRION 温湿度传感器,工作电压 2.4~5.5V,湿度精度 ±2%RH,温度精度 ±0.3℃,封装 8 脚 DFN

涂鸦三明治温湿度传感功能板需要用到的管脚介绍

I/O

说明

VCC

电源供电脚

GND

电源参考地

SCL

I2C时钟信号

SDA

I2C数据信号

INT

告警信号,预留

电源技术要求

  • 电源供电电压参照传感器工作电压范围:2.4~5.5V
  • 非测量状态典型电流:0.2uA
  • 低功耗连续测量模式典型电流:800uA
    (1)原理图
    涂鸦三明治温湿度传感功能板的原理图如下所示:

Android 涂鸦对接 涂鸦接入hass_物联网_14

(2)PCB图

涂鸦三明治温湿度传感功能板的 PCB 如下图所示:

Android 涂鸦对接 涂鸦接入hass_物联网_15

注意事项

  • 功能板为应用部分,需配合控制板与电源板使用。
  • 电源接口不要触碰 I/O 管脚,避免击穿模块对应 I/O 口。
  • 传感器本体附着灰尘与油污等会导致测量精度下降。
  • 传感器本体不能与清洁剂接触,例如洗板水。
  • 不能使用会释放化学分子的材料包装,否则可能受污染导致数据偏移或完全损坏。
    (2)软件设计
    为了测量温湿度,选取涂鸦的SHT30温湿度模块来实现。STM32通过硬件I2C与之通信。
    调用SHT3x_reset复位模块:
/**
 * @brief   复位SHT30
 * @param   none
 * @retval  none
*/
void SHT3x_Reset(void)
{
    SHT3x_Send_Cmd(SOFT_RESET_CMD);
    HAL_Delay(20);
}

调用SHT3x_Init初始化模块:

/* 描述:SHT3x初始化函数,并将其设置为周期测量模式
 * 参数:无
 * 返回值:初始化成功返回0,初始化失败返回1 */
uint8_t SHT3x_Init(void)
{
    uint8_t ret;
    ret = SHT3x_Send_Cmd(MEDIUM_2_CMD);
    return ret;
}

调用 SHT3x_Get_Humiture_periodic获取温湿度值:

/* 描述:温湿度数据获取函数,周期读取,注意,需要提前设置周期模式   
 * 参数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;
}

三.平台产品创建

  进入涂鸦智能IoT平台,点击创建产品。这里不用纠结产品品类的选择,重点是为了拿到MCU-SDK文件,实际使用时可以根据具体的产品修改sdk内部的pid即可适配自己的产品。

例如:点击创建产品,选择标准类目->电工->开关。(当时为了测试用,所以选择一个标准类目,也可以在平台上选择其它品类去创建也是可以的)

Android 涂鸦对接 涂鸦接入hass_嵌入式_16

  • 选择自定义方案,输入产品名称,选择通讯协议为WIFI+蓝牙,点击创建产品。
  • 根据要实现的设备功能,创建好DP功能点。
  • 创建好DP点之后,点击设备面板,选择自由配置面板,方便开发调试,也可以选择其它的面板。

Android 涂鸦对接 涂鸦接入hass_物联网_17

  • 面板创建好之后,点击硬件开发,对接方式选择“涂鸦标准模组MCU SDK开发”,模组选择WB3S Wi-Fi&Bluetooth模组(在实际开发过程中可选择手上已有的涂鸦模组即可),固件选择通用固件。

Android 涂鸦对接 涂鸦接入hass_Android 涂鸦对接_18

四.MCU SDK移植

平台产品创建完之后,我们会获取到一个MCU SDK包,之后就可以快速移植到MCU了。

在解压后的文件夹中找到mcu_sdk相关源文件和头文件,全部拷贝到我们创建好的工程模板里的MCU_SDK文件夹里;打开上面创建好的工程,将mcu_sdk的源文件添加进对应组里,同时添加include paths:

Android 涂鸦对接 涂鸦接入hass_嵌入式_19

点击编译,会崩出几个error,接下来就需要按照出error的地方注释提示一步步修改代码。

Android 涂鸦对接 涂鸦接入hass_SHT3X_20

uart_receive_input()为串口接收数据处理接口,只需将它放进串口中断即可,这里我们以串口1作为与模组通讯串口,调试中把串口2作为日志口,首先在main函数中添加串口1和串口2初始化代码,并使能接收中断(接收使能中断已在串口初始化函数中体现):

Android 涂鸦对接 涂鸦接入hass_嵌入式_21

Android 涂鸦对接 涂鸦接入hass_嵌入式_22

  • 然后在stm32l4xx_it.c文件中添加中断处理函数,然后包含 mcu_api.h文件并将uart_receive_input()接口添加进去,添加完成后,删除error注释即可:

Android 涂鸦对接 涂鸦接入hass_SHT3X_23

再来看下一个errror,由于我们上一步已经通过中断接收的形式实现了串口数据接收处理了,这个多字节处理我们可以不用,直接把error注释删除即可。

Android 涂鸦对接 涂鸦接入hass_嵌入式_24

下一个errror:

Android 涂鸦对接 涂鸦接入hass_嵌入式_25

按照提示将该接口放在main函数的while循环内即可,别忘了在 main.c 中包含 wifi.h 头文件。

Android 涂鸦对接 涂鸦接入hass_嵌入式_26

再来看下一个error:

Android 涂鸦对接 涂鸦接入hass_STM32_27

同样的,按照提示将该函数放到main函数开头部分即可。

Android 涂鸦对接 涂鸦接入hass_SHT3X_28

然后是串口发送相关:

Android 涂鸦对接 涂鸦接入hass_STM32_29

这里只需实现串口1的数据发送函数然后放进去即可。使用STM32 HAL库里面的串口单字节发送函数,以阻塞方式发送数据量,添加代码如下:

Android 涂鸦对接 涂鸦接入hass_STM32_30

Android 涂鸦对接 涂鸦接入hass_Android 涂鸦对接_31

然后是DP数据点上报相关的:

这里我们可以直接注释掉error提示,在实际开发过程中再实现该功能即可。

Android 涂鸦对接 涂鸦接入hass_STM32_32

以下在主函数里面,添加温度和湿度上报的数据。这里可以改成自己想要上报传感器的数据。

Android 涂鸦对接 涂鸦接入hass_STM32_33

最后是产测相关的:

Android 涂鸦对接 涂鸦接入hass_SHT3X_34

一般开发者不涉及生产测试的话直接删除注释不用管就行。

下图这个红色标出的函数是进行配网的,通过NUCLEO-L476开发板上的用户按键进行配网连接。

Android 涂鸦对接 涂鸦接入hass_STM32_35

修改完上述几处地方后,再次编译,显示error全部消除,至此涂鸦MCU SDK就已移植完毕,后续可使用涂鸦模组调试助手进行测试。涂鸦模组调试助手的使用方法可参考调试助手文档

五.实验样机测试展示

Android 涂鸦对接 涂鸦接入hass_物联网_36

通过之前配置好的面板,通过涂鸦智能APP进行配网实时采集温湿度传感器的数据。

Android 涂鸦对接 涂鸦接入hass_Android 涂鸦对接_37