SHT30温湿度传感器驱动设计分析及代码实现
生活随笔
收集整理的這篇文章主要介紹了
SHT30温湿度传感器驱动设计分析及代码实现
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
文章目錄
- 1 SHT30溫濕度傳感器簡單測試
- 1.1 SHT30硬件設計事需要注意的地方
- 1.2 SHT30相關知識
- 1.3 SHT30讀取溫度的簡單測試
- 2 SHT30完善的驅(qū)動設計
- 2.1 設計思路
- 2.2 代碼實現(xiàn)
首先來看一下SHT34驅(qū)動實現(xiàn)的思路:
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完善的驅(qū)動設計
2.1 設計思路
上面我們使用的是阻塞性讀取方式,這在實際工程中顯然是不太能夠接受的:
下面我們看下通過中斷的方式如何讀取溫濕度的數(shù)據(jù):
2.2 代碼實現(xiàn)
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);#endifdrv_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中需要加入如下函數(shù):
void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c) {if(hi2c==&hi2c1){extern void sht30_i2c_handler(void);sht30_i2c_handler();} }總結(jié)
以上是生活随笔為你收集整理的SHT30温湿度传感器驱动设计分析及代码实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 按键驱动的思路分析和代码实现
- 下一篇: 铁投集团是做什么的