4824|2

9717

帖子

24

TA的资源

版主

楼主
 

HTS221和其它几款数字温湿度传感器数据对比 [复制链接]

 
HTS221是ST公司的一款数字温湿度传感器,手册上标称的湿度精度是±3.5%RH(在20%~80%范围内)温度精度是±0.5℃(在15℃~40℃范围内),今天我拿HTS221分别和TI的HDC1080、SILABS的SI7051、SI7021、sensirion的SHT21这几款数字温湿度传感器做了对比
传感器合照
因为条件有限,测试的方法是将HTS221分别和其它传感器两两装进一个纸盒,传感器尽量接近,高度尽量相同
HTS221的Outputdata设置为1Hz, 温度AVGT设置成256
每8秒钟采集一次HTS221和其它传感器数据,然后通过串口发送给PC
下面是HTS221和其它传感器的温湿度数据对比
1.HTS221SI7051温度对比
2.HTS221和SI7021的温度数据
3.HTS221和SHT21温度对比
4.HTS221和SHT21湿度对比
5.HTS221和SHT21湿度对比 (另一片SHT21)
6.HTS221和HDC1080温度对比
7.HTS221和HDC1080湿度对比
8.HTS221和SI7021湿度对比
上图中蓝色为其它传感器的温湿度数据,橙色为HTS221的温湿度数据
从数据中可以看出HTS221数据的波动比较大,和SI7051对比时温度最大时相差0.184摄氏度
SI7051的标称精度是±0.1摄氏度,单从这个数据来看这颗HTS221的温度精度还是不错的
湿度方面HTS221比2片SHT21湿度最大SHT21高出8.5%rH
比HDC1080最大高出3%rH,比SI7021低2.53%Rh
因为相对湿度和温度的精度有关
湿度方面从这些数据也不好判断谁准谁不准

附上测试代码:
  1. /*

  2.               MSP430FR5969
  3.             -----------------
  4.            |     P2.0/UCA0TXD|----> PC
  5.            |                 |
  6.            |                 |
  7.            |     P2.1/UCA0RXD|<---- PC
  8.            |                 |
  9.   SCL --o--|P3.5             |
  10.            |                 |
  11.   SDA --o--|P3.6             |

  12. */
  13. /*******************************************************************************
  14. *  * INCLUDES
  15. *  */

  16. #include "msp430.h"
  17. #include <stdio.h>
  18. #include <math.h>
  19. #include <stdint.h>
  20. #include "uart.h"
  21. #include "soft_i2c.h"
  22. #include "timer.h"
  23. #include "si7021.h"
  24. /*******************************************************************************
  25. *  * MACROS
  26. *  */

  27. /*******************************************************************************
  28. *  * CONSTANTS
  29. *  */
  30. #define HTS221_WHO_AM_I_REG          (uint8_t)0x0F

  31. #define HTS221_CTRL_REG1      (uint8_t)0x20
  32. #define HTS221_CTRL_REG2      (uint8_t)0x21
  33. #define HTS221_CTRL_REG3      (uint8_t)0x22

  34. #define HTS221_AV_CONF_REG        (uint8_t)0x10

  35. #define HTS221_STATUS_REG            (uint8_t)0x27

  36. #define HTS221_HR_OUT_L_REG          (uint8_t)0x28

  37. #define HTS221_TEMP_OUT_L_REG        (uint8_t)0x2A



  38. #define HTS221_H0_RH_X2        (uint8_t)0x30
  39. #define HTS221_H1_RH_X2        (uint8_t)0x31
  40. #define HTS221_T0_DEGC_X8      (uint8_t)0x32
  41. #define HTS221_T1_DEGC_X8      (uint8_t)0x33
  42. #define HTS221_T0_T1_DEGC_H2   (uint8_t)0x35
  43. #define HTS221_H0_T0_OUT_L     (uint8_t)0x36
  44. #define HTS221_H0_T0_OUT_H     (uint8_t)0x37
  45. #define HTS221_H1_T0_OUT_L     (uint8_t)0x3A
  46. #define HTS221_H1_T0_OUT_H     (uint8_t)0x3B
  47. #define HTS221_T0_OUT_L        (uint8_t)0x3C
  48. #define HTS221_T0_OUT_H        (uint8_t)0x3D
  49. #define HTS221_T1_OUT_L        (uint8_t)0x3E
  50. #define HTS221_T1_OUT_H        (uint8_t)0x3F
  51.    
  52.    
  53. #define HTS221_SLV_ADDRESS (0xbe)
  54. /*******************************************************************************
  55. *  * TYPEDEFS
  56. *  */

  57. /*******************************************************************************
  58. *  * GLOBAL VARIABLES
  59. *  */

  60. /*******************************************************************************
  61. *  * EXTERNAL VARIABLES
  62. *  */

  63. /*******************************************************************************
  64. *  * EXTERNAL FUNCTIONS
  65. *  */

  66. /*******************************************************************************
  67. *  * LOCAL VARIABLES
  68. *  */
  69.   

  70. uint8_t buf[12];
  71. float t[2],h[2];
  72. /*******************************************************************************
  73. *  * PROFILE CALLBACKS
  74. *  */

  75. /*******************************************************************************
  76. *  * LOCAL FUNCTIONS
  77. *  */
  78. void dco_init(void);
  79. /*******************************************************************************
  80. *  * PUBLIC FUNCTIONS
  81. *  */

  82. void delay(int32_t d)
  83. {
  84.   while(d--)
  85.   {
  86.     __delay_cycles(1000);
  87.   }
  88. }


  89. float HTS221_Get_Humidity(void)
  90. {
  91.   int16_t H0_T0_out, H1_T0_out, H_T_out;
  92.   int16_t H0_rh, H1_rh;
  93.   uint8_t buffer[2];
  94.   float   tmp_f;

  95.   i2c_read_n_byte(HTS221_SLV_ADDRESS, HTS221_H0_RH_X2 | BIT7, buffer , 2);
  96.   H0_rh = buffer[0] >> 1;
  97.   H1_rh = buffer[1] >> 1;

  98.   i2c_read_n_byte(HTS221_SLV_ADDRESS, HTS221_H0_T0_OUT_L | BIT7, buffer , 2);
  99.   H0_T0_out = (((uint16_t)buffer[1]) << 8) | (uint16_t)buffer[0];

  100.   i2c_read_n_byte(HTS221_SLV_ADDRESS, HTS221_H1_T0_OUT_L | BIT7, buffer , 2);
  101.   H1_T0_out = (((uint16_t)buffer[1]) << 8) | (uint16_t)buffer[0];

  102.   i2c_read_n_byte(HTS221_SLV_ADDRESS, HTS221_HR_OUT_L_REG | BIT7, buffer , 2);
  103.   H_T_out = (((uint16_t)buffer[1]) << 8) | (uint16_t)buffer[0];

  104.   tmp_f = (float)(H_T_out - H0_T0_out) * (float)(H1_rh - H0_rh) / (float)(H1_T0_out - H0_T0_out)  +  H0_rh;

  105.   return tmp_f;
  106. }
  107. float HTS221_Get_Temperature(void)
  108. {
  109.   int16_t T0_out, T1_out, T_out, T0_degC_x8_u16, T1_degC_x8_u16;
  110.   int16_t T0_degC, T1_degC;
  111.   uint8_t buffer[4], tmp;
  112.   float   tmp_f;

  113.   i2c_read_n_byte(HTS221_SLV_ADDRESS, HTS221_T0_DEGC_X8 | BIT7,buffer, 2);
  114.   i2c_read_n_byte(HTS221_SLV_ADDRESS, HTS221_T0_T1_DEGC_H2 | BIT7, &tmp,1);

  115.   T0_degC_x8_u16 = (((uint16_t)(tmp & 0x03)) << 8) | ((uint16_t)buffer[0]);
  116.   T1_degC_x8_u16 = (((uint16_t)(tmp & 0x0C)) << 6) | ((uint16_t)buffer[1]);
  117.   T0_degC = T0_degC_x8_u16 >> 3;
  118.   T1_degC = T1_degC_x8_u16 >> 3;

  119.   i2c_read_n_byte(HTS221_SLV_ADDRESS, HTS221_T0_OUT_L | BIT7, buffer,4);

  120.   T0_out = (((uint16_t)buffer[1]) << 8) | (uint16_t)buffer[0];
  121.   T1_out = (((uint16_t)buffer[3]) << 8) | (uint16_t)buffer[2];

  122.   i2c_read_n_byte(HTS221_SLV_ADDRESS, HTS221_TEMP_OUT_L_REG | BIT7, buffer ,2);

  123.   T_out = (((uint16_t)buffer[1]) << 8) | (uint16_t)buffer[0];

  124.   tmp_f = (float)(T_out - T0_out) * (float)(T1_degC - T0_degC) / (float)(T1_out - T0_out)  +  T0_degC;
  125.   return tmp_f;
  126. }
  127. void HTS221_Init(void)
  128. {
  129.   i2c_read_n_byte(HTS221_SLV_ADDRESS,HTS221_WHO_AM_I_REG,buf,1);
  130.   buf[0] = BIT7 | BIT0;
  131.   i2c_write_n_byte(HTS221_SLV_ADDRESS,HTS221_CTRL_REG1, buf,1);
  132.   buf[0] = 0x3f; //0b00111111 tAvg=256 hAvg=512
  133.   i2c_write_n_byte(HTS221_SLV_ADDRESS,HTS221_AV_CONF_REG, buf,1);
  134. }
  135. void test() {
  136.   i2c_read_n_byte(HTS221_SLV_ADDRESS,HTS221_WHO_AM_I_REG,buf,1);
  137.   buf[0] = BIT7 | BIT0;
  138.   i2c_write_n_byte(HTS221_SLV_ADDRESS,HTS221_CTRL_REG1, buf,1);
  139.   i2c_read_n_byte(HTS221_SLV_ADDRESS,HTS221_STATUS_REG,buf,1);
  140.   if(buf[0] == 0x03)
  141.   {
  142.       t[0] = HTS221_Get_Temperature();
  143.       h[0] = HTS221_Get_Humidity();
  144.   }
  145.   i2c_read_n_byte(HTS221_SLV_ADDRESS,HTS221_CTRL_REG2,buf,1);
  146.   i2c_read_n_byte(HTS221_SLV_ADDRESS,HTS221_STATUS_REG,buf,1);
  147.   if(buf[0] == 0x03)
  148.   {
  149.       t[0] = HTS221_Get_Temperature();
  150.       h[0] = HTS221_Get_Humidity();
  151.   }
  152.   buf[0] = BIT0 ;
  153.   i2c_write_n_byte(HTS221_SLV_ADDRESS,HTS221_CTRL_REG2, buf,1);
  154.   i2c_read_n_byte(HTS221_SLV_ADDRESS,HTS221_CTRL_REG2,buf,1);
  155.   i2c_read_n_byte(HTS221_SLV_ADDRESS,HTS221_STATUS_REG,buf,1);
  156.   if(buf[0] == 0x03)
  157.   {
  158.       t[0] = HTS221_Get_Temperature();
  159.       h[0] = HTS221_Get_Humidity();
  160.   }
  161.   
  162.   _NOP();
  163. //  i2c_write_n_byte(address,VL53L0X_REG_SYSRANGE_START, buf,1);

  164. }
  165. void HDC1080_Init(void)
  166. {  
  167.   uint8_t data[4];
  168.   data[0] = BIT7;//RESET
  169.   data[1] = 0x00;
  170.   i2c_write_n_byte((0x40 << 1),0x02,data,2);
  171. }
  172. float HDC1080_GetHumidity()
  173. {  
  174.   uint8_t data[4];
  175.   uint16_t temp;
  176.   float humidity;
  177.   hdc1080_i2c_read_n_byte((0x40 << 1),0x01,data,2);
  178.   temp   = ((((uint16_t)data[0]) << 8) & 0xff00) + (((uint16_t)data[1]) & 0x00ff);
  179.   
  180.   humidity    = ((float)temp)*100/65536;
  181.   return humidity;
  182. }
  183. float HDC1080_GetTemperature()
  184. {  
  185.   uint8_t data[4];
  186.   uint16_t temp;
  187.   float temperature;
  188.   hdc1080_i2c_read_n_byte((0x40 << 1),0x00,data,2);
  189.   temp   = ((((uint16_t)data[0]) << 8) & 0xff00) + (((uint16_t)data[1]) & 0x00ff);
  190.   
  191.   temperature = (((float)(((uint32_t)temp) * 165))/65536) - 40;
  192.   return temperature;
  193. }
  194. int main( void )
  195. {
  196.   char outBuf[64];//base64缓存
  197.   WDTCTL = WDTPW + WDTHOLD;//停止看门狗
  198.   PM5CTL0 &= ~LOCKLPM5;//这个是一定要加的,不然GPIO不能使用
  199.   dco_init();
  200.   i2c_init();//初始化I2C
  201.   SI7021_Init();
  202.   HTS221_Init();
  203.   HDC1080_Init();
  204.   uart_init();
  205.   //对比HTS221和HDC1080的湿度
  206.   while(0)
  207.   {
  208.     //test();
  209.     h[0] = HDC1080_GetHumidity();
  210.     delay(10000);
  211.     h[1] = HTS221_Get_Humidity();
  212.     sprintf(outBuf,"%f\t%f",h[0],h[1]);
  213.     uart_tx_string(outBuf);//输出到PC
  214.     uart_tx_string("\r\n");//换行
  215.     delay(100000);
  216.   }
  217.   //对比HTS221和HDC1080的温度
  218.   while(0)
  219.   {
  220.     //test();
  221.     t[0] = HDC1080_GetTemperature();
  222.     delay(10000);
  223.     t[1] = HTS221_Get_Temperature();
  224.     sprintf(outBuf,"%f\t%f",t[0],t[1]);
  225.     uart_tx_string(outBuf);//输出到PC
  226.     uart_tx_string("\r\n");//换行
  227.     delay(100000);
  228.   }
  229.   //对比HTS221和SHT21、SI7021的湿度
  230.   while(0)
  231.   {
  232.     h[0] = SI7021_GetHumidityRH();
  233.     delay(10000);
  234.     h[1] = HTS221_Get_Humidity();
  235.     sprintf(outBuf,"%f\t%f",h[0],h[1]);
  236.     uart_tx_string(outBuf);//输出到PC
  237.     uart_tx_string("\r\n");//换行
  238.     delay(100000);
  239.    
  240.   }
  241.   //对比HTS221和SI7051、SHT21的温度
  242.   while(1)
  243.   {
  244.     //test();
  245.     t[0] = SI7021_GetTemperature();
  246.     delay(10000);
  247.     t[1] = HTS221_Get_Temperature();
  248.     sprintf(outBuf,"%f\t%f",t[0],t[1]);
  249.     uart_tx_string(outBuf);//输出到PC
  250.     uart_tx_string("\r\n");//换行
  251.     delay(100000);
  252.   }
  253. }
  254. void dco_init(void)
  255. {  
  256.   // Configure one FRAM waitstate as required by the device datasheet for MCLK
  257.   // operation beyond 8MHz _before_ configuring the clock system.
  258.   FRCTL0 = FRCTLPW | NWAITS_1;

  259.   // Clock System Setup
  260.   CSCTL0_H = CSKEY >> 8;                    // Unlock CS registers
  261.   CSCTL1 = DCORSEL | DCOFSEL_4;             // Set DCO to 16MHz
  262.   CSCTL2 = SELA__VLOCLK | SELS__DCOCLK | SELM__DCOCLK; // Set SMCLK = MCLK = DCO,
  263.                                             // ACLK = VLOCLK
  264.   CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1;     // Set all dividers
  265.   CSCTL0_H = 0;                             // Lock CS registers
  266. }
复制代码
代码包含HTS221、SI7051、SI7021、SHT21、HDC1080驱动
2.msp430fr5969 soft i2c HTS221 si7051 si7021 sht21 hdc1080.rar (28.4 KB, 下载次数: 53)

最新回复

谢谢共享  详情 回复 发表于 2017-11-11 00:43
点赞 关注
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 

回复
举报

578

帖子

0

TA的资源

纯净的硅(初级)

沙发
 
这种得和校准过的标准温度计一起测试,不然都不知道哪个精度好不好。不过这样的对比测试也能反应出各个传感器输出数据的稳定性,还有有重大意义,对以后选型有个参考,版主V5
个人签名刻苦学习,共同进步
 
 
 

回复

21

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
谢谢共享
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表