[活动专区] 【杰发科技AC7802x测评】11.硬件IIC读取HS3003温湿度传感器数据

[复制链接]
 楼主| hehung 发表于 2023-7-1 10:31 | 显示全部楼层 |阅读模式
<
1 HS3003介绍

HS3003是瑞萨的一款温湿度传感器,基于IIC通信,采用7为地址,地址为0x44。

1.1 原理图

1688177645429.png

可见,只能使用IIC通信,因为AC7802X只有一路IIC,之前用来驱动OLED,所以将HS3003X也接到了这路IIC上,因为OLED和HS3003的地址不一样,所以可以同时驱动。

硬件连接如下:

- SCL - PB7
- SDA - PB8

1.2 HS3003操作方式

虽然知道了HS300X是IIC接口,但是我们还不知道该如何操作,需要了解HS300X的操作方式,寄存器,IIC地址等,查看官方提供的手册《REN_HS300x-Datasheet_DST_20210809.pdf》。

1.2.1 测量请求

直接通过IIC总线写HS300X地址就可以唤醒传感器自动采集数据,说明见下:

> 从下图中可以看到IIC地址为0x44,然后加一个低位1表示写。

1688177870924.png

1.2.2 数据获取

从下图可以看出,发送HS300X地址+低位读就可以获取采集的数据。
**注:重点说明,默认采样精度为14bit,可以通过配置修改,精度越高,采样时间越长,下图中有说明,默认精度下的采样时间为33ms左右,所以在测量请求发出之后,需要等待33毫秒之后在读取。**

1688177901011.png

采集数据分析,从图中可以清楚看出,默认温度和湿度数据都为14bit数据,都占用了两个字节。

其中湿度的高两位为状态为状态位,表示采集数据状态是否有效,见下图:

- 0表示数据采集完成
- 1表示没有完成有效采集。
- 温度的低两位没有任何用处。

1688177994979.png

1.2.3 采样精度修改

采样精度可以修改,精度越低,采样时间越快。可以通过下述寄存器进行修改,该部分本文不会实现,只作为功能描述其有这个功能。
修改方式也很简单,IIC地址+低位写0+修改精度寄存器地址+精度即可完成修改,详情参考数据手册。

1688178043435.png

1.2.4 采样数据处理

采集到的数据为原始数据,需要进行计算得出真实的温湿度数据,计算公式如下:

1688178075645.png

即:
湿度值(%):采样值/(16383) * 100
温度值(摄氏度):采样值/(16383) * 165 - 40


2 软件编写

知道了硬件设置以及原理,现在可以看是编写软件了,如下:
app_hs3003.c

  1. /*
  2. @hehung
  3. 2023-6-30
  4. email: 1398660197@qq.com
  5. wechat: hehung95
  6. reproduced and please indicate the source @hehung
  7. */


  8. #include "app_hs3003.h"
  9. #include "app_hw_i2c.h"



  10. #define HS300x_I2C_SLAVE_ADDR_7BIT           (0x44U)

  11. #define HS300X_DATA_VALID                    (0x00U)
  12. #define HS300X_DATA_STALE                    (0x01U)
  13. #define HS300X_STATUS_MASK                   (0xC0000000U)
  14. #define HS300X_STATUS_POS                    (30U)

  15. #define HS300X_DATA_MASK                     (0x3FFFFFFCU)
  16. #define HS300X_HUMI_DATA_MASK                (0x3FFF0000U)
  17. #define HS300X_HUMI_DATA_POS                 (16U)
  18. #define HS300X_TEMP_DATA_MASK                (0x0000FFFCU)
  19. #define HS300X_TEMP_DATA_POS                 (2U)

  20. /* calculation formula, 2^14 - 1 */
  21. #define HS300X_DATA_FACTOR                   (16383U)



  22. static uint8_t Hs300x_DataConvert(uint32_t read_data, s_Hs300xDataType *cal_result);



  23. static uint8_t Hs300x_DataConvert(uint32_t read_data, s_Hs300xDataType *cal_result)
  24. {
  25.     uint32_t humi_data;
  26.     uint32_t temp_data;

  27.     if (((read_data & HS300X_STATUS_MASK) >> HS300X_STATUS_POS) == HS300X_DATA_VALID)
  28.     {
  29.         // Data is valid
  30.         humi_data = (read_data & HS300X_HUMI_DATA_MASK) >> HS300X_HUMI_DATA_POS;
  31.         temp_data = (read_data & HS300X_TEMP_DATA_MASK) >> HS300X_TEMP_DATA_POS;

  32.         // Calculate the humidity: humi_data/(2^14-1) * 100
  33.         cal_result->humi = (double)humi_data/(double)(HS300X_DATA_FACTOR) * 100.0;
  34.         // Calculate the temperature: temp_data/(2^14-1) * 165 - 40
  35.         cal_result->temp = (double)temp_data/(double)(HS300X_DATA_FACTOR) * 165.0 - 40;
  36. #ifdef HS300X_DEBUG
  37.         printf("humidity:%f, temperature:%f\n", cal_result->humi, cal_result->temp);
  38. #endif
  39.    
  40.         return 1;
  41.     }
  42.     else
  43.     {
  44.         return 0;
  45.     }
  46. }

  47. void Hs300x_Init(void)
  48. {
  49.     // Do not settings, keep default settings in sensor device
  50. }

  51. void Hs300x_StartSample(void)
  52. {
  53.     uint8_t data = 0;

  54.     // Only send the address to start HS300X convert
  55.     I2C_MasterTransmitPoll(I2C0, HS300x_I2C_SLAVE_ADDR_7BIT, &data, 0, ENABLE);
  56. }

  57. s_Hs300xDataType Hs300x_ReadData(void)
  58. {
  59.     uint8_t data[4];  // one address + 4bytes data
  60.     uint32_t data_u32;
  61.     s_Hs300xDataType humi_temp;

  62. //  Read measurement from sensor HS300X
  63.     I2C_MasterReceivePoll(I2C0, HS300x_I2C_SLAVE_ADDR_7BIT, data, 4);
  64.     // Convert the data to 32bit
  65.     data_u32 = (uint32_t)((data[0] << 24U) |
  66.                           (data[1] << 16U) |
  67.                           (data[2] << 8U) |
  68.                           (data[3]));
  69.     // Read the temperature and hunidity
  70.     (void)Hs300x_DataConvert(data_u32, &humi_temp);

  71. //#ifdef HS300X_DEBUG
  72.     printf ("HS300X origin data1:%x%x%x%x\r\n", data[0],data[1],data[2],data[3]);
  73.     // printf("HS300X origin data2:%x\n", data_u32);
  74.     printf ("Temp:%f--Humi:%f\r\n", humi_temp.temp, humi_temp.humi);
  75. //#endif

  76.     return humi_temp;
  77. }




app_hs3003.h

  1. /*
  2. @hehung
  3. 2023-6-30
  4. email: 1398660197@qq.com
  5. wechat: hehung95
  6. reproduced and please indicate the source @hehung
  7. */

  8. #ifndef APP_HS3003_H__
  9. #define APP_HS3003_H__



  10. typedef struct
  11. {
  12.     double humi;
  13.     double temp;
  14. } s_Hs300xDataType;

  15. extern void Hs300x_Init(void);
  16. extern s_Hs300xDataType Hs300x_ReadData(void);
  17. extern void Hs300x_StartSample(void);


  18. #endif



主函数实现如下,其中40ms的延时是必须的。

  1.         Hs300x_StartSample();
  2.         mdelay(40);
  3.         Hs300x_ReadData();
  4.         mdelay(1000);



3 实验结果如下

如下,将手放到传感器上,影响传感器采集数据,温湿度都有所增加。

1688178359745.png



louliana 发表于 2023-7-6 12:10 | 显示全部楼层
学习I2C总线通信协议              
sesefadou 发表于 2023-7-6 15:11 | 显示全部楼层
使用单片机中的IIC接口读取温湿度传感器的数据,可以通过读取IIC总线上的数据来实现
minzisc 发表于 2023-7-6 15:17 | 显示全部楼层
I2C硬件的操作函数在哪查找的              

评论

官方提供的i2c库里就可以找到  发表于 2023-7-8 19:20
rosemoore 发表于 2023-7-6 15:37 | 显示全部楼层
硬件I2C 到底怎么样?               

评论

AC7802X的硬件I2C还是很好用的,使用简单方便,通信速度可以打打400K  发表于 2023-7-8 19:21
vivilyly 发表于 2023-7-6 15:47 | 显示全部楼层
模拟的iic时序读取数据的时候错误,有什么办法防止

评论

可能是时间延时不太对,硬件IIC很好用,用硬件就可以  发表于 2023-7-8 19:22
minzisc 发表于 2023-7-6 16:00 | 显示全部楼层
硬件IIC怎么接收不同字节的长度的数据

评论

I2C_MasterReceivePoll(I2C0, HS300x_I2C_SLAVE_ADDR_7BIT, data, 4); 这个函数的最后一个参数就是长度  发表于 2023-7-8 19:23
10299823 发表于 2023-7-6 16:45 | 显示全部楼层
为啥硬件实现时读数据0xFF               

评论

可能是通信不对,查一下从机地址是不是对的  发表于 2023-7-8 19:24
adolphcocker 发表于 2023-7-6 16:54 | 显示全部楼层
为什么不使用DS18B20呢              

评论

手头有什么用什么,哈哈哈,没有DS18B20  发表于 2023-7-8 19:24
uptown 发表于 2023-7-6 17:05 | 显示全部楼层
硬件i2c读取一次HS3003数据大概多长时间

评论

没具体测试过,和I2c通信速度有关,也和从机的响应速度有关我设置的400K,还是很快的。但是HS3003发送了启动信号之后,需要等待33ms之后再读取数据,转换是需要时间的  发表于 2023-7-8 19:26
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

66

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部