1. 背景

工作中,需要使用到SHT21温湿度传感器。相关手册:SHT21

由于焊接的问题,部分芯片存在通信异常初始化失败的问题。因而在代码中采用了极端的异常处理。(不断复位初始化)

1.1 芯片简易资料

SHT21
    湿度和温度传感器IC
    包含:
    (1)电容式相对湿度传感器
    (2)带隙温度传感器
    -------------------------
    包括,一个放大器,AD转换器,OTP存储器和一个数字处理单元
    
    解析度,12位 0.04
                   8位  0.7

传感器建议在正常范围内工作,长期暴露在正常条件之外,尤其是在湿度大于80%RH的环境中,可能会暂时抵消RH信号,且加速老化。
    
    对光不敏感,但长期暴露在阳光或者强烈的紫外线辐射下可能会使传感器老化。
    
    注意:
    如果SCL和SDA并行走线,且超过10cm以上,可能会导致串扰和通信中断。
    可以通过在信号之间路由VDD 和/或 VSS 和/或 使用屏蔽电缆线来解决。
    此外 降低SCL频率可能会改善信号。
    电源引脚(VDD和VSS)必须使用100nf的去耦电容。
    
    为了避免信号竞争,MCU需要仅将SDA、SCL驱动为低电平。需要外部上拉电阻(10K)。

1.2 关于使用

第一步,将传感器上电至 VDD(2.1V~3.6V)
    上电后,传感器在SCL为高电平时,最多需要15ms才能进入空闲状态,即准备好接收来自主机MCU的命令

1.3 IIC通信

(1)每次的通信传输 需要以 起始条件 开始,以 结束条件 结束。
    (2)在发送一个起始条件之后,需要发送 设备地址(0x81/0x80 读写)
    (3)发出测量命令,温度为 1110 0011 相对湿度为 1110 0101 。
    (4)等待测量完成
    
基本命令:
    触发温度测量(hold master)            1110 0011 0xe3
    触发相对湿度测量(hold master)     1110 0101 0xe5
    
    触发温度测量(no hold master)      1111 0011 0xf3
    触发相对湿度测量(no hold master)  1111 0101 0xf5
    
    写用户寄存器                        
    读用户寄存器
    软件复位

1.4 关于保持主机模式和不保持主机模式

保持:
    不保持:

1.5 注意事项

转换时间:
    测量持续时间 为ms级  (默认)
    12位的相对湿度,22~29ms
    14位的温度测量,66~85ms

2. 代码实现

2.1 初始化和测量的函数

测量时,启动测量,等待转换完成,读出数据,停止测量。

SHT21_Measurement函数,每10ms进一次。第9次进入(经过90ms),第12次经过(120-90=30ms)

#include "main.h"#define CNT_NUM 50
/*----------------------------------------------------------------------------*/extern void SHT2x_SoftReset(void);
extern void SHT2x_SetResolution(SHT2x_Resolution res);extern uint8_t SHT2x_ReadUserReg(void);extern uint16_t SHT2x_GetRaw_Rx(void);
extern void     SHT2x_GetRaw_Tx(uint8_t cmd);extern uint16_t config_read(uint16_t readAddr);
extern void config_write(uint16_t writeAddr,uint16_t writeData);
extern int modbus_ReportResetCnt(void);
void init_SHT21(void)
{SHT2x_SoftReset();HAL_Delay(20);//SHT2x_SetResolution(RES_14_12);SHT2x_GetRaw_Tx(SHT2x_READ_TEMP_NOHOLD);//读取已复位次数g_RebootCnt = config_read(REG_ADDR_REBOOT_CNT);if(g_RebootCnt>CNT_NUM){uint16_t data = SHT2x_GetRaw_Rx();if(data!=0||g_RebootCnt==0xFFFF)//读取成功或者首次运行,需要清零计数标志{g_RebootCnt = 0;config_write(REG_ADDR_REBOOT_CNT,g_RebootCnt);SHT2x_GetRaw_Tx(SHT2x_READ_TEMP_NOHOLD);}}//读取主动复位总数g_RebootCntTotal = config_read(REG_ADDR_REBOOT_CNT_TOTAL);if(g_RebootCntTotal==0xFFFF)//首次运行,未清零{g_RebootCntTotal=0;config_write(REG_ADDR_REBOOT_CNT_TOTAL,g_RebootCntTotal);}//上报复位数到PLCmodbus_ReportResetCnt();
}//相对湿度 每30ms 读一次
//温度     每90ms 读一次
void SHT21_Measurement(void)
{static uint8_t cnt=0;if(g_RebootCnt>CNT_NUM)return;cnt++;if(cnt==9) //读取温度{uint16_t data=0;data= SHT2x_GetRaw_Rx();if(data==0)//读取失败{g_RebootCnt++;//记录复位次数到eeprom中config_write(REG_ADDR_REBOOT_CNT,g_RebootCnt);//通过自动复位来自救RX1_LED_GPIO_Port->BSRR = (uint32_t)RX1_LED_Pin << 16u;RX2_LED_GPIO_Port->BSRR = (uint32_t)RX2_LED_Pin << 16u;RX3_LED_GPIO_Port->BSRR = (uint32_t)RX3_LED_Pin << 16u;TX1_LED_GPIO_Port->BSRR = (uint32_t)TX1_LED_Pin << 16u;TX2_LED_GPIO_Port->BSRR = (uint32_t)TX2_LED_Pin << 16u;TX3_LED_GPIO_Port->BSRR = (uint32_t)TX3_LED_Pin << 16u;while(1);}shtValue.T = -4685 + 17572 * (data/ 65536.0);SHT2x_GetRaw_Tx(SHT2x_READ_RH_NOHOLD);}if(cnt>=12)//读取湿度{uint16_t data=0;data= SHT2x_GetRaw_Rx()&0xfffc;if(data==0||data>55574)//读取失败 {g_RebootCnt++;//记录复位次数到eeprom中config_write(REG_ADDR_REBOOT_CNT,g_RebootCnt);HAL_Delay(3);//记录总复位次数g_RebootCntTotal++;config_write(REG_ADDR_REBOOT_CNT_TOTAL,g_RebootCntTotal);//通过自动复位来自救RX1_LED_GPIO_Port->BSRR = (uint32_t)RX1_LED_Pin << 16u;RX2_LED_GPIO_Port->BSRR = (uint32_t)RX2_LED_Pin << 16u;RX3_LED_GPIO_Port->BSRR = (uint32_t)RX3_LED_Pin << 16u;TX1_LED_GPIO_Port->BSRR = (uint32_t)TX1_LED_Pin << 16u;TX2_LED_GPIO_Port->BSRR = (uint32_t)TX2_LED_Pin << 16u;TX3_LED_GPIO_Port->BSRR = (uint32_t)TX3_LED_Pin << 16u;while(1);}shtValue.RH = -600 + 12500 * (data /65536.0);SHT2x_GetRaw_Tx(SHT2x_READ_TEMP_NOHOLD);cnt=0;}
}    

2.2 IIC通信相关的函数

/* SHT21湿度温度传感器 设备地址默认0x80*/
#include "Define.h"
#include "TypeDef.h"/***  @brief Performs a soft reset.*/
void SHT2x_SoftReset(void){uint8_t cmd = SHT2x_SOFT_RESET;HAL_I2C_Master_Transmit(&hi2c2, SHT2x_I2C_ADDR << 1, &cmd, 1, SHT2x_TIMEOUT);
}/*** @brief Gets the value stored in user register.* @return 8-bit value stored in user register, 0 to 255.*/
uint8_t SHT2x_ReadUserReg(void) {uint8_t val;uint8_t cmd = SHT2x_READ_REG;HAL_I2C_Master_Transmit(&hi2c2, SHT2x_I2C_ADDR << 1, &cmd, 1, SHT2x_TIMEOUT);HAL_I2C_Master_Receive(&hi2c2, SHT2x_I2C_ADDR << 1, &val, 1, SHT2x_TIMEOUT);return val;
}void     SHT2x_GetRaw_Tx(uint8_t cmd) {HAL_I2C_Master_Transmit(&hi2c2, SHT2x_I2C_ADDR << 1, &cmd, 1, SHT2x_TIMEOUT);
}uint16_t SHT2x_GetRaw_Rx(void) {uint8_t val[3] = { 0 };HAL_I2C_Master_Receive(&hi2c2, SHT2x_I2C_ADDR << 1, val, 3, SHT2x_TIMEOUT);return (val[0] << 8 | val[1]);
}/*** @brief Sets the measurement resolution.* @param res Enum resolution.* @note Available resolutions: RES_14_12, RES_12_8, RES_13_10, RES_11_11.* @note RES_14_12 = 14-bit temperature and 12-bit RH resolution, etc.*/
void SHT2x_SetResolution(SHT2x_Resolution res) {uint8_t val = SHT2x_ReadUserReg();val = (val & 0x7e) | res;uint8_t temp[2] = { SHT2x_WRITE_REG, val };HAL_I2C_Master_Transmit(&hi2c2, SHT2x_I2C_ADDR << 1, temp, 2, SHT2x_TIMEOUT);
}

#芯片# SHT21温湿度传感器的使用相关推荐

  1. ESP32-C3入门教程 基础篇(四、I2C总线 — 与SHT21温湿度传感器通讯)

    测试第四课,了解ESP32-C3的 I2C 总线使用,与SHT21 温湿度传感器通讯 这一课把基础介绍放在前面,先看基本流程,再去修改代码 目录 前言 1. ESP32-C3 I2C基础介绍 1.1 ...

  2. sht20中写用户寄存器_数字输出温湿度传感器HTU21D和SHT21对比评测(图文)

    超小体积的温湿度一体数字输出模块由于体积小,精度高的特点,广泛应用于手机.通讯.HVAC.医疗.环境监测.家用电器.控制板等,近日从深圳市工采网(ISweek)拿到市面上最常用的HTU21D和SHT2 ...

  3. 可编程 USB 转串口适配器开发板 SHT3x-DIS 温湿度传感器芯片

    可编程 USB 转串口适配器开发板  SHT3x-DIS 温湿度传感器芯片 可编程USB转 UART/I2C /SMBusS/SPI/CAN/1 -Wire适配器USB2S  的温湿传感器 1.2   ...

  4. [单片机芯片]CH32V307驱动单总线温湿度传感器DHT22

    手头有一个DHT22温湿度传感器和CH32V307开发板,可玩性极强.DHT22是已校准的数字温湿度传感器,用于检测环境温湿度,采用DHT22(AM2302),标准单总线接口.拥有比常见的DHT11更 ...

  5. sht20温湿度传感器原理图_温湿度传感器在孵化行业怎么应用

    随着近年来环保力度的加大,畜牧养殖行业逐渐认识到节能减排.环境控制对于畜禽养殖具有重要意义,并且节能环保控制已开始出现在孵化行业. 以前,一些家禽孵化场没有恒温恒湿的概念,他们认为孵化是一个带有孵化设 ...

  6. Arduino初初教程10——温湿度传感器

    2019独角兽企业重金招聘Python工程师标准>>> 这里使用的温湿度传感器是 SHT1X温湿度传感器 如图   SHT1x温湿度传感器是瑞士Sensirion公司推出的单片数字温 ...

  7. vb6编写dll读取dat文件_【STM32Cube_15】使用硬件I2C读取温湿度传感器数据(SHT30)...

    寻求更好的阅读体验,请移步Mculover666的个人博客: [STM32Cube_15]使用硬件I2C读取温湿度传感器数据(SHT30)​www.mculover666.cn 本篇详细的记录了如何使 ...

  8. sht-11c语言程序,温湿度传感器SHT11数据手册(中文)版.pdf

    温湿度传感器SHT11数据手册(中文)版 数字温湿度传感器 SHT 1x / SHT 7x SHT7x (请以英文为准,译文仅供参考) SHT1x _ 相对湿度和温度测量 _ 兼有露点 _ 全部校准, ...

  9. AHT20温湿度传感器STM32-I2C驱动,替代DHT11/DHT12/AM2320/SHT20/SHT30,IIC代码兼容AHT10/15-MEMS温湿度传感器

    AHT20是国内奥松生成的I2C接口的MEMS温湿度传感器,ADC位数为20Bit,具有体积小.精度高.成本低等优点.相较于AHT10,最显著的变化是体积由 5*4*1.6mm,缩小到 3*3*1.0 ...

最新文章

  1. C# 特性(Attribute)学习。
  2. 【javamatlab】以一个简单的例子实现java和matlab混编
  3. go 指针变量和普通变量的转化_C语言 | 指向结构体变量的指针变量
  4. java myeclipse The type java.lang.CharSequence cannot be resolved. It is indirectly referen
  5. SublimeText如何让代码的关键字高亮显示
  6. Linux C 错误 invalid application of 'sizeof' to incomplete type 解决方案
  7. C++面试题-指针-指针数组与数组指针
  8. 编译原理:CH3 语法分析
  9. 三维向量的一些运算技巧,如何计算坐标
  10. 20145322何志威 《Java程序设计》第8周学习总结
  11. android 渐变动画,Android-实现背景渐变动画
  12. maya中英文对比_[转载]maya中英文对照
  13. 基于微服务架构的云平台总体设计
  14. tkinter-canvas详解
  15. 抖音创作者信用分:如何提升信用等级,获取更多机会
  16. android守护进程详解
  17. 修改MacOS下的输入法切换键为shift键
  18. 2019 NIPS | Variational graph recurrent neural network
  19. php 中文拼音模糊查询,PHP-输入字母 模糊查询汉字
  20. 阿里巴巴与微软、苹果、亚马逊的实力对比

热门文章

  1. 组合计算机,计算机组合步骤是什么
  2. python命令行无法使用退格键、方向键
  3. 电商网站搭建——多环境部署、如何打War包
  4. Unity场景中导出模型插件
  5. 项目七 网络打印的配置与管理
  6. Extra semicolon
  7. scribe 架构及其store
  8. Linux生态之深度学习环境
  9. Ciso 静态路由配置
  10. 如何调用api接口获取其中的数据