stm32

这篇博客详细介绍了如何使用STM32HAL库配合CubeMX配置SHT30温湿度传感器,包括复位、初始化、数据读取和CRC校验的步骤。博主提供了完整的C代码实现,包括SHT30的复位函数、初始化函数、读取数据函数和数据转换函数。在测试部分,博主展示了如何周期性读取并打印温湿度值,同时注意到了VScode中%f格式化输出的问题。
摘要由CSDN通过智能技术生成

STM32 HAL库 读取SHT30

CubeMX


这里代码就配置完成了
CubuMx就配置完成了

接下来进入代码

从机地址

在这里插入图片描述

模块的命令

在这里插入图片描述

发送命令

在这里插入图片描述

复位

/**
 * @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);
}

uint8_t SHT30_Read_Dat(uint8_t* dat)
{
	SHT30_Send_Cmd(READOUT_FOR_PERIODIC_MODE);
	return HAL_I2C_Master_Receive(&hi2c1, SHT30_ADDR_READ, dat, 6, 0xFFFF);
}
### 校验CRC

```c
#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);
	printf("%f",*humidity);
	return 0;
}

CHT30.H

#ifndef __SHT30_H_
#define __SHT30_H_

#include "stm32f4xx.h"                  // Device header
#include "i2c.h"
 
 void SHT30_reset(void);
 extern uint8_t SHT30_Init(void);
 extern uint8_t SHT30_Read_Dat(uint8_t* dat);
 extern uint8_t CheckCrc8(uint8_t* const message, uint8_t initial_value);
 extern uint8_t SHT30_Dat_To_Float(uint8_t* const dat, float* temperature, float* humidity);
 

 #endif

测试

    SHT30_reset();
    if(SHT30_Init() == HAL_OK)
        printf("sht30 init ok.\n");
    else
        printf("sht30 init fail.\n");

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */ 
    HAL_Delay(1000);
		if(SHT30_Read_Dat(recv_dat) == HAL_OK)
		{
			if(SHT30_Dat_To_Float(recv_dat, &temperature, &humidity)==0)
			{
				printf("temperature = %d, humidity = %d\n", (uint8_t)temperature, (uint8_t)humidity);
			}
			else
			{
				printf("crc check fail.\n");
			}
		}
		else
		{
			printf("read data from sht30 fail.\n");
		}
    HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
	}

    printf("Strat!!\n");
    HAL_Delay(200);
  
  /* USER CODE END 3 */
}

效果

在这里插入图片描述

注意VScode 不能打印%f,不知道为啥

在这谢谢大佬的指导

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值