文章目录

  • 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();}
}

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

  1. STM32之SHT30温湿度传感器驱动代码(程序稳定,清晰明了)

    第一部分:SHT30温湿度模块代码头文件(SHT30.h) #ifndef SHT30_H #define SHT30_H #include "delay.h" #include ...

  2. CRC校验——以SHT30温湿度传感器为例(内附SHT30的驱动代码)

    文章目录 1. 基本原理 2. 计算方法 3. c语言代码实现 4. SHT30代码 4.1 drv.c 4.2 test.c 4.3 Makefile 1. 基本原理  循环冗余校验码(CRC)的基 ...

  3. 传感器:SHT30温湿度传感器检测环境温湿度实验(底部附代码)

    一.导言 SHT30温湿度传感器模块是通过IIC驱动,所以大家使用该模块时,需要具备IIC的基本知识,这篇文章带领大家一起使用SHT30模块进行温湿度的测量,当然DHT10/DHT10原理都一样,好了 ...

  4. 跟着小哈一起读AHT20温湿度传感器驱动源码

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 人工智能编程入门博客 AHT20简介 2020年上市,奥松生产: 3mmx3mmx1mm 超小体积: ...

  5. SHT30温湿度模块使用

    SHT30温湿度模块使用 本次我们使用STM32F103C8T6最小系统板和STM32cubeMX来教学 流程我全部写在下面了(下载不需要C币): 1.配置我们的下载方式,并使用外部晶振: 2.我们再 ...

  6. IIC协议之SHT30温湿度采样

    IIC协议之SHT30温湿度采样 1.IIC协议介绍 1.1 协议简介 1.2 SHT30设备地址 2.协议时序 2.1 IIC通信时序图 2.2 起始信号 2.3 结束信号 2.4 应答信号 2.5 ...

  7. 模拟IIC读取SHT30温湿度传感器数据

    文章目录 1 i2c.c 2 i2c.h 3 crc.c 4 crc.h 1 i2c.c /*** @brief SHT30温湿度传感器相关,使用模拟IIC进行数据的读取*/#include < ...

  8. I2C协议介绍以及HAL库实现I2C对SHT30温湿度采样

    文章目录 1- I2C协议介绍 (1)I2C协议简介 (2)I2C从设备地址 2- I2C通信时序 (1)起始位 (2)读写地址 (3)I2C应答信号 (4)数据位发送与接收 3- I2C协议主机收发 ...

  9. nRF52笔记(8) IIC读取sht30温湿度传感器

    1.平台的条件 1.1 软件平台:sdk14.2 1.2 硬件平台: nrf52832 2 说明: 只是介绍代码怎么使用,直接点 QQ: 1297311998 ,如果有什么问题,请高手不吝赐教 2.n ...

最新文章

  1. CCF-IFAA基金海外参展 全球安全盛会迎来中国声音
  2. Eclipse 工作空间(Workspace)---Eclipse教程第07课
  3. 【struts2+hibernate+spring项目实战】数据报表jxl及生成excel(ssh项目实战)
  4. VTK:绘图之ParallelCoordinates
  5. 串口服务器接入232显示乱码,串口服务器出现乱码时如何处理,解决方案
  6. 知己知彼 防范攻击:网络攻击步骤与黑客攻击原理
  7. html表单提交后怎么发送邮箱,Dreamweaver中用表单制作了留言板,如何将内容提交后发到指定邮箱?...
  8. 如何在Apache环境下配置Rewrite规则
  9. FHS(Filesystem Hierarchy Standard 文件系统层次化标准)
  10. Hibernate初探之单表映射——jar包的导入
  11. CTC 解码算法之 prefix beam search
  12. python 连续等于
  13. IntelliJ Idea学习笔记008---Idea左侧栏不显示目录结构_或者只显示一个Project不显示其他东西
  14. 泛型学习第一天:List与IList的区别 (二)
  15. qt三维曲线_Qt 的许可类型、主要版本以及安装步骤
  16. 预测模型构建利器——基于logistic的列线图(R语言)
  17. 电机控制基础之坐标变换(Clark变换及反变换 + Park变换及反变换 + 推导 + 仿真)
  18. 当孙子兵法遇上词云,会有怎样的碰撞?
  19. 中企海外周报 | 传祺GM6将亮相北美车展,锦江都城发力布局全球
  20. HTML的相关标记和属性

热门文章

  1. android扑克发牌动画,JS实现纸牌发牌动画
  2. 怎么调节电机启动值_发电机组的几个使用规范技巧
  3. 5.1 代价函数-机器学习笔记-斯坦福吴恩达教授
  4. Ardino基础教程 8_模拟值
  5. 16.matlab中各种文件的I/O操作1——load/save
  6. 台积电和三星成半导体代工厂恶战主角 受谁影响?
  7. Scala学习第五天数组
  8. 在阿里云主机上基于CentOS用vsftpd搭建FTP服务器
  9. iOS app 切图
  10. 购物车Demo,前端使用AngularJS,后端使用ASP.NET Web API(2)--前端,以及前后端Session