STM32F407-驱动SHT41采集温湿度

STM32F407-驱动SHT41采集温湿度

SHT41

SHT41通过I2C方式进行驱动

从机地址: 0x44

获取数据方式
1)先发送I2C写,写入特定指令
2)延时一段时间,等待SHT41处理
3)再进行I2C读,读数据即可

一些指令如下:
在这里插入图片描述demo
在这里插入图片描述

STM32F407驱动

I2C初始化

void my_sht41_init()
{
	GPIO_InitTypeDef GPIO_InitStructure;
	I2C_InitTypeDef  I2C_InitStructure;
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);  
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE); 
	
	GPIO_PinAFConfig(GPIOB,GPIO_PinSource8,GPIO_AF_I2C1);
	GPIO_PinAFConfig(GPIOB,GPIO_PinSource9,GPIO_AF_I2C1); 
	
	  
  GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;  
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 ;  
  GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
	I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
	I2C_InitStructure.I2C_ClockSpeed = 300000;
	I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
	I2C_InitStructure.I2C_OwnAddress1 = STM32_I2C_OWN_ADDR;	
	I2C_Init(I2C1, &I2C_InitStructure); 
	
	I2C_Cmd(I2C1, ENABLE);
	
}

读SHT41 芯片ID

void my_sht41_read_id(void)
{
	uint8_t data[6] = {0};
	uint8_t ret = 0;
	uint16_t time = 0xFFF;
	my_sht41_send_cmd(0x89);
	
	printf("开始延迟\n");
	while(time)
	{
		time--;
	}
	printf("延时结束\n");
	ret = my_SHT41_buffer_read(data,6);
	
	if(ret == 0)
	{
		printf("data[0] = 0x%x\n",data[0]);
		printf("data[1] = 0x%x\n",data[1]);
		printf("data[3] = 0x%x\n",data[3]);
		printf("data[4] = 0x%x\n",data[4]);
	}
	else
	{
		printf("读取ID错误!\n");
	}
	
}


读温度湿度数据

void my_sht41_read_data(void)
{
	uint8_t data[6] = {0};
	uint8_t ret = 0;
	uint32_t time = 0xFFFFFF;
	my_sht41_send_cmd(0xFD);
	
	uint16_t recovery_temper = 0u;
	uint16_t recovery_hum = 0u;
	float temp = 0.f;
	float hum = 0.f;
	
	
	printf("开始延迟\n");
	while(time)
	{
		time--;
	}
	printf("延时结束\n");
	ret = my_SHT41_buffer_read(data,6);
	
	if(ret == 0)
	{
		printf("data[0] = 0x%x\n",data[0]);
		printf("data[1] = 0x%x\n",data[1]);
		printf("data[3] = 0x%x\n",data[3]);
		printf("data[4] = 0x%x\n",data[4]);
	}
	else
	{
		printf("读取ID错误!\n");
	}
	
	recovery_temper = ((uint16_t)data[0]<<8)|data[1];
    temp = -45 + 175*((float)recovery_temper/65535);
 
    /* 转换湿度数据 */
    recovery_hum = ((uint16_t)data[3]<<8)|data[4];
    hum = -6 + 125 * ((float)recovery_hum / 65535);
		if(hum>=100)   //根据数据手册编写
				hum=100;
		else if(hum<=0)
				hum=0;
		
		printf("温度为:%.2f",temp);
		printf("湿度为:%.1f%%",hum);

	
}

I2C读写接口

static uint8_t my_sht41_send_cmd(uint8_t data)
{
	uint32_t count_wait;
	I2C_GenerateSTART(I2C1,ENABLE); 
	
	
	count_wait = TIME_OUT;
	while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT) != SUCCESS)
	{
		count_wait--;
		if(count_wait == 0) {
			return Error_CallBack(1);
		}
	}
	
	I2C_Send7bitAddress(I2C1, SHT41_I2C_ADDR, I2C_Direction_Transmitter); 
	

	
	count_wait = TIME_OUT;
	
	while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) != SUCCESS)
	{
		count_wait--;
		if(count_wait == 0) {
			return Error_CallBack(2);
		}
	}
	
	

	//发送数据
	I2C_SendData(I2C1,data); 
	
	count_wait = TIME_OUT;
	while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED) != SUCCESS)
	{
		count_wait--;
		if(count_wait == 0) {
			return Error_CallBack(4);
		}
	}	
	
	
	I2C_GenerateSTOP(I2C1, ENABLE);
	
	
	return 0;
	
}


/*读六个字节数据 */
static uint8_t my_SHT41_buffer_read(uint8_t *data,uint16_t size)
{
	uint32_t count_wait;
	//开始进行I2C通讯
	I2C_GenerateSTART(I2C1, ENABLE);
	
	if(size > 6)
	{
		return 1;
	}
	
	count_wait = TIME_OUT;	//等待拉低
	while(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT) != SUCCESS)
	{
		count_wait--;
		if(count_wait == 0 )
		{
			return Error_CallBack(16);
		}
	}	
	
	//读模式
	I2C_Send7bitAddress(I2C1, SHT41_I2C_ADDR, I2C_Direction_Receiver);
	
	
	count_wait = TIME_OUT;
	while(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED) != SUCCESS)
	{
		count_wait--;
		if(count_wait == 0 )
		{
			return Error_CallBack(20);
		}
	}
	
	while(size--)
	{
		if(size == 0)
		{
			I2C_AcknowledgeConfig(I2C1, DISABLE);
		}else {
			I2C_AcknowledgeConfig(I2C1,ENABLE);
		}

		count_wait = TIME_OUT;		
		while(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED) != SUCCESS)
		{
			count_wait--;
			if(count_wait == 0 )
			{
				return Error_CallBack(21);
			}
		}
			
		
		*data = I2C_ReceiveData(I2C1);
		data++;
	}
	
		
	
	I2C_GenerateSTOP(I2C1, ENABLE);
	
	return 0;

}
  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
驱动SHT20温湿度传感器并在STM32上显示温湿度值,你需要先确定SHT20传感器的接口类型。通常情况下,SHT20传感器使用I2C接口进行通信。 以下是基于I2C接口的SHT20温湿度传感器驱动和显示的步骤: 1. 确定I2C总线和设备地址 在STM32上,你需要确定使用哪个I2C总线以及SHT20的设备地址。假设我们使用I2C1总线,并且SHT20的地址为0x40。 2. 初始化I2C总线 在STM32上,你需要初始化I2C总线,包括设置时钟和数据线的GPIO引脚、设置总线速率等。以下是使用HAL库初始化I2C1总线的示例代码: ```c I2C_HandleTypeDef hi2c1; void MX_I2C1_Init(void) { hi2c1.Instance = I2C1; hi2c1.Init.ClockSpeed = 100000; hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; hi2c1.Init.OwnAddress1 = 0; hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; hi2c1.Init.OwnAddress2 = 0; hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; if (HAL_I2C_Init(&hi2c1) != HAL_OK) { Error_Handler(); } } ``` 3. 初始化SHT20传感器 在STM32上,你需要初始化SHT20传感器,包括设置传感器的精度、启用温度和湿度测量等。以下是使用HAL库初始化SHT20传感器的示例代码: ```c #define SHT20_ADDRESS 0x40 void SHT20_Init(void) { uint8_t buf[] = {0xF3}; HAL_I2C_Master_Transmit(&hi2c1, SHT20_ADDRESS << 1, buf, sizeof(buf), HAL_MAX_DELAY); } float SHT20_ReadTemperature(void) { uint8_t buf[] = {0xE3}; uint8_t data[2]; HAL_I2C_Master_Transmit(&hi2c1, SHT20_ADDRESS << 1, buf, sizeof(buf), HAL_MAX_DELAY); HAL_I2C_Master_Receive(&hi2c1, SHT20_ADDRESS << 1, data, sizeof(data), HAL_MAX_DELAY); uint16_t raw = (data[0] << 8) | data[1]; float temperature = -46.85 + 175.72 * (float)raw / 65536.0; return temperature; } float SHT20_ReadHumidity(void) { uint8_t buf[] = {0xE5}; uint8_t data[2]; HAL_I2C_Master_Transmit(&hi2c1, SHT20_ADDRESS << 1, buf, sizeof(buf), HAL_MAX_DELAY); HAL_I2C_Master_Receive(&hi2c1, SHT20_ADDRESS << 1, data, sizeof(data), HAL_MAX_DELAY); uint16_t raw = (data[0] << 8) | data[1]; float humidity = -6.0 + 125.0 * (float)raw / 65536.0; return humidity; } ``` 在上面的示例代码中,我们使用了HAL库的I2C函数来向SHT20传感器发送命令并读取温湿度值。注意,SHT20传感器的温度和湿度值都是16位无符号整数,需要进行转换才能得到实际的温湿度值。 4. 显示温湿度值 最后,你需要将SHT20传感器读取到的温湿度值显示在STM32上,可以使用OLED屏幕或LCD屏幕等显示设备。以下是使用HAL库显示温湿度值的示例代码: ```c #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 void OLED_Init(void) { // 初始化OLED屏幕 } void OLED_WriteString(char *str, uint8_t x, uint8_t y) { // 在指定位置显示字符串 } int main(void) { // 初始化I2C总线和SHT20传感器 MX_I2C1_Init(); SHT20_Init(); // 初始化OLED屏幕 OLED_Init(); while (1) { // 读取温湿度值 float temperature = SHT20_ReadTemperature(); float humidity = SHT20_ReadHumidity(); // 将温湿度值转换为字符串 char temp_str[10], humi_str[10]; sprintf(temp_str, "%.1f", temperature); sprintf(humi_str, "%.1f", humidity); // 在OLED屏幕上显示温湿度值 OLED_WriteString("Temperature:", 0, 0); OLED_WriteString(temp_str, 0, 16); OLED_WriteString("Humidity:", 0, 32); OLED_WriteString(humi_str, 0, 48); // 等待一段时间后再次读取温湿度值 HAL_Delay(1000); } } ``` 在上面的示例代码中,我们使用了OLED屏幕来显示温湿度值。在每次读取到温湿度值后,将其转换为字符串后显示在OLED屏幕上。可以根据需要修改显示位置、字体大小等参数。同时,我们使用了HAL库的Delay函数来等待一段时间后再次读取温湿度值,从而实现实时更新温湿度值的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值