资讯详情

STM32CubeIDE之SHT3X温湿度传感器移植HAL库

有了前面的OLED这个学习也很快。

分以下几步走

1.你必须有温度传感器,SHT3X这个型号,因为我想谈谈这个

2.你要有个STM32开发板(我用的是)STM32L431RCT)

3.顺便找个电脑下载一个STM32CubeIDE

4.简单找一个SHT3X驱动,我去某宝嫖,一般卖这个,这个驱动分为两个文件,是的.c和.h是的,我直接把这两个放在下面

读过我最后一篇文章的人应该熟悉这一点。同样的套路和学习方法是一样的。你可以复制它

下面是sht3x.c里面有一个原文档CRC验证的函数我没读懂,可能是因为我没学过CRC验证

#include "sht3x.h" #include "stm32l4xx.h"        #include "stm32l4xx_hal.h" //链接HAL库 /* ADDR Pin Conect to VSS */  #define    SHT30_ADDR_WRITE    0x44<<1         //10001000,根据用户手册的说明,这是SHT30的写入地址 #define    SHT30_ADDR_READ        (0x44<<1) 1        根据用户手册的说明,//10001011,这个就是SHT30的读取地址 extern I2C_HandleTypeDef hi2c3;//开启I2C3接口,你用哪个就换哪个  typedef enum    //定义命令 {     /* 软件复位命令 */      SOFT_RESET_CMD = 0x30A2,     /*     单次测量模式     命名格式:Repeatability_CS_CMD     CS: Clock stretching     */     HIGH_ENABLED_CMD    = 0x2C06,     MEDIUM_ENABLED_CMD  = 0x2C0D,     LOW_ENABLED_CMD     = 0x2C10,     HIGH_DISABLED_CMD   = 0x2400,     MEDIUM_DISABLED_CMD = 0x240B,     LOW_DISABLED_CMD    = 0x2416,      /*     周期测量模式     命名格式:Repeatability_MPS_CMD     MPS:measurement per second     */     HIGH_0_5_CMD   = 0x2032,     MEDIUM_0_5_CMD = 0x2024,     LOW_0_5_CMD    = 0x202F,     HIGH_1_CMD     = 0x2130,     MEDIUM_1_CMD   = 0x2126,     LOW_1_CMD      = 0x212D,     HIGH_2_CMD     = 0x2236,     MEDIUM_2_CMD   = 0x2220,     LOW_2_CMD      = 0x222B,     HIGH_4_CMD     = 0x2334,     MEDIUM_4_CMD   = 0x2322,     LOW_4_CMD      = 0x2329,     HIGH_10_CMD    = 0x2737,     MEDIUM_10_CMD  = 0x2721,     LOW_10_CMD     = 0x272A,     /* 读取周期测量模式的数据命令 */     READOUT_FOR_PERIODIC_MODE = 0xE000, } SHT30_CMD;  /**  * @brief    向SHT30发送指令(16)bit)  * @param    cmd —— SHT30指令(在SHT30_MODE中枚举定义)  * @retval    成功返回HAL_OK */ static uint8_t    SHT30_Send_Cmd(SHT30_CMD cmd) {     uint8_t cmd_buffer[2];     cmd_buffer[0] = cmd >> 8;     cmd_buffer[1] = cmd;     return HAL_I2C_Master_Transmit(&hi2c3, SHT30_ADDR_WRITE, (uint8_t*)cmd_buffer, 2, 0xFFFF); }  /**  * @brief    复位SHT30  * @param    none  * @retval    none */ void SHT30_Reset(void)    {     SHT30_Send_Cmd(SOFT_RESET_CMD);     HAL_Delay(20); }  /**  * @brief    初始化SHT30  * @param    none  * @retval    成功返回HAL_OK  * @note    周期测量模式 */ uint8_t SHT30_Init(void) {     return SHT30_Send_Cmd(MEDIUM_2_CMD); }  /**  * @brief    从SHT读取一次数据  * @param    dat —— 存储读取数据的地址(6字节数组)  * @retval    成功 —— 返回HAL_OK */ uint8_t SHT30_Read_Dat(uint8_t* dat) {     SHT30_Send_Cmd(READOUT_FOR_PERIODIC_MODE);     return HAL_I2C_Master_Receive(&hi2c3, SHT30_ADDR_READ, dat, 6, 0xFFFF); } /*************************************************  * 本驱动最大的难点,CRC验证;不懂,说懂行  * 不管用不用  */  #define CRC8_POLYNOMIAL 0x31  uint8_t CheckCrc8(uint8_t* const message, uint8_t initial_value) {     uint8_t  remainder;        //余数     uint8_t  i = 0, j = 0;  //循环变量      /* 初始化 */     remainder = initial_value;      for(j = 0; j < 2;j  )     {         remainder ^= message[j];          /* 从最高位依次计算  */         for (i = 0; i < 8; i  )         {             if (remainder & 0x80)             {                 remainder = (remainder << 1)^CRC8_POLYNOMIAL;             }             else             {                 remainder = (remainder << 1);             }         }     }      /* 返回计算的CRC码 */     return remainder; } /**  * @brief    将SHT30接收6个字节数据CRC校验,并转换为温度值和湿度值  * @param    dat  —— 存储接收数据的地址(6字节数组)  * @retval    校验成功  —— 返回0  *             校验失败  —— 返回1,温度值和湿度值为0 */ uint8_t SHT30_Dat_To_Float(uint8_t* const dat, float *temperature,float *humidity) {     uint16_t recv_temperature = 0;     uint16_t recv_humidity = 0;      /* 检查温度数据和湿度数据是否正确接收 */     if(CheckCrc8(dat, 0xFF) != dat[2] || CheckCrc8(&dat[3], 0xFF) != dat[5])         return 1;      /* 转换温度数据 */     recv_temperature = ((uint16_t)dat[0]<<8)|dat[1];     *temperature = -45   175*((float)recv_temperature/65535);      /* 转换湿度数据 */     recv_humidity = ((uint16_t)dat[3]<<8)|dat[4];     *humidity = 100 * ((float)recv_humidity / 65535);      return 0; } 

下面是关于CRC我不明白验证手册的介绍。

下面是sht3x.h原文档,看到这个量,你觉得很简单吗?是的,他很简单

#ifndef __SHT30_H_ #define __SHT30_H_  #include "stm32l4xx.h"                  // Device header #include "stm32l4xx_hal.h" //链接HAL库   void SHT30_Reset(void);  uint8_t SHT30_Init(void);  uint8_t SHT30_Read_Dat(uint8_t* dat);  uint8_t CheckCrc8(uint8_t* const message, uint8_t initial_value);  uint8_t SHT30_Dat_To_Float(uint8_t* const dat, float* temperature, float* humidity);    #endif

对了,差点忘了,HAL库记得换自己的,不知道怎么换。你一定没看我的文章

http://t.csdn.cn/b1ttu

假如不知道驱动放哪,参考上面的文章

最后讲一下怎么用这些函数,我们用四个就好了

首先是初始化传感器函数SHT30_Init();和复位函数SHT30_Reset(); 就是你在使用传感器之前要提前初始化一下,就一下就好了,所以我们可以放在主循环之前,(注意他俩的先后顺序)如下图

 然后就可以去读传感器里的温度了,因为你每次的读的时候,它会去测量温湿度的,驱动里面写了,我知道你不会去看,没关系,不用看。

所以我们要调用函数SHT30_Read_Dat(uint8_t* dat); 

dat是什么呢?它是uint8_t dat[6]={0}能看懂吧;用来存放温湿度数据的,注意是6个。

读出来了,也放到dat里了,但是这个数据不是我们平常说的那个,要给他转换一下,要用到最后一个函数SHT30_Dat_To_Float(uint8_t* const dat, float* temperature, float* humidity);

然后我们就得到了温度temperature和湿度humidity;但是他们是浮点数,男人谁在乎小数点后面那几位啊,直接  hum = (int)humidity   加  tem = (int)temperature  转换

最后注意啊dat,temperature,humidity这些是自己定义的

 

标签: hal880传感器240f传感器sht3x传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台