100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > SHT30温湿度传感器驱动设计分析及代码实现

SHT30温湿度传感器驱动设计分析及代码实现

时间:2022-09-20 02:07:38

相关推荐

SHT30温湿度传感器驱动设计分析及代码实现

文章目录

1 SHT30温湿度传感器简单测试1.1 SHT30硬件设计事需要注意的地方1.2 SHT30相关知识1.3 SHT30读取温度的简单测试2 SHT30完善的驱动设计2.1 设计思路2.2 代码实现

首先来看一下SHT34驱动实现的思路:

1 SHT30温湿度传感器简单测试

1.1 SHT30硬件设计事需要注意的地方

一般i2c引脚的上拉电阻设计为4.7K,SHT30建议上拉电阻为10K,需要注意。

上图中板子上的两个4.7K的电阻应取下。

1.2 SHT30相关知识

SHT30的设备地址:

SHT30支持的模式:

SHT30读取温湿度:

1.3 SHT30读取温度的简单测试

测试代码比较简单,如下:

#include "main.h"#include "i2c.h"#include "app_debug.h"#define SHT30_ADD (0X44<<1)#define CMD_MEAS_CLOCKSTR_H 0x2C06 // measurement: clock stretching, high repeatability#define CMD_MEAS_CLOCKSTR_M 0x2C0D // measurement: clock stretching, medium repeatability#define CMD_MEAS_CLOCKSTR_L 0x2C10 // measurement: clock stretching, low repeatability#define CMD_SOFT_RESET 0X30A2 // software resetvoid sht30_read(){uint8_t buf[6];uint16_t temp_s;float temp;HAL_I2C_Mem_Read(&hi2c1,SHT30_ADD,CMD_MEAS_CLOCKSTR_H,I2C_MEMADD_SIZE_16BIT, buf, 6, 0xffffffff);temp_s=(buf[0]<<8)+buf[1];temp=(float)175*temp_s/65535-45;DEBUG("temp is %f",temp); }

2 SHT30完善的驱动设计

2.1 设计思路

上面我们使用的是阻塞性读取方式,这在实际工程中显然是不太能够接受的:

下面我们看下通过中断的方式如何读取温湿度的数据:

2.2 代码实现

drv_sht30.h:

#ifndef __DRV_SHT30_H#define __DRV_SHT30_H#include <stdbool.h>bool sht30_init(void);bool sht30_get_temp_humi(float *p_temp,float *p_humi);void sht30_i2c_handler(void);#endif

drv_sht30.c:

#include <stdbool.h>#include "main.h"#include "i2c.h"#include "app_debug.h"#include "FreeRTOS.h"#include "semphr.h"#define SHT30_ADD (0X44<<1)#define CMD_MEAS_CLOCKSTR_H 0x2C06 // measurement: clock stretching, high repeatability#define CMD_MEAS_CLOCKSTR_M 0x2C0D // measurement: clock stretching, medium repeatability#define CMD_MEAS_CLOCKSTR_L 0x2C10 // measurement: clock stretching, low repeatability#define CMD_SOFT_RESET 0X30A2 // software resetSemaphoreHandle_t sem_sht30;bool is_inited=false;void sht30_read(){uint8_t buf[6];uint16_t temp_s;float temp;HAL_I2C_Mem_Read(&hi2c1,SHT30_ADD,CMD_MEAS_CLOCKSTR_H,I2C_MEMADD_SIZE_16BIT, buf, 6, 0xffffffff);temp_s=(buf[0]<<8)+buf[1];temp=(float)175*temp_s/65535-45;DEBUG("temp is %f",temp); }static bool sht30_reset(){uint8_t cmd[2];cmd[0]=CMD_SOFT_RESET>>8;cmd[1]=CMD_SOFT_RESET&0xff;if(HAL_I2C_Master_Transmit(&hi2c1,SHT30_ADD,cmd,2,0xFFFFFFFF)!=HAL_OK){return false;}return true;}bool sht30_init(void){sem_sht30=xSemaphoreCreateBinary();xSemaphoreTake(sem_sht30,0);if(sht30_reset()==false)return false;vTaskDelay(10);is_inited=true;return true;}bool sht30_get_temp_humi(float *p_temp,float *p_humi){uint8_t buf[6];uint16_t temp_s,humi_s;float temp,humi;if(is_inited==false)return false;if(HAL_I2C_Mem_Read_IT(&hi2c1,SHT30_ADD,CMD_MEAS_CLOCKSTR_H,I2C_MEMADD_SIZE_16BIT, buf, 6)!=HAL_OK){return false;}if(xSemaphoreTake(sem_sht30,1000)==pdFALSE)return false;temp_s=(buf[0]<<8)+buf[1];temp=(float)175*temp_s/65535-45;*p_temp=temp;humi_s=(buf[3]<<8)+buf[4];humi=(float)humi_s*100/65535;*p_humi=humi;return true;}void sht30_i2c_handler(void){BaseType_t xHigherPriorityTaskWoken = pdFALSE;if(is_inited==false)return ;xSemaphoreGiveFromISR( sem_sht30, &xHigherPriorityTaskWoken );portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); }

stm32l0xx_it.c中需要加入如下函数:

void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c){if(hi2c==&hi2c1){extern void sht30_i2c_handler(void);sht30_i2c_handler();}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。