- /*
- @hehung
- 2023-6-30
- email: 1398660197@qq.com
- wechat: hehung95
- reproduced and please indicate the source @hehung
- */
- #include "app_hs3003.h"
- #include "app_hw_i2c.h"
- #define HS300x_I2C_SLAVE_ADDR_7BIT (0x44U)
- #define HS300X_DATA_VALID (0x00U)
- #define HS300X_DATA_STALE (0x01U)
- #define HS300X_STATUS_MASK (0xC0000000U)
- #define HS300X_STATUS_POS (30U)
- #define HS300X_DATA_MASK (0x3FFFFFFCU)
- #define HS300X_HUMI_DATA_MASK (0x3FFF0000U)
- #define HS300X_HUMI_DATA_POS (16U)
- #define HS300X_TEMP_DATA_MASK (0x0000FFFCU)
- #define HS300X_TEMP_DATA_POS (2U)
- /* calculation formula, 2^14 - 1 */
- #define HS300X_DATA_FACTOR (16383U)
- static uint8_t Hs300x_DataConvert(uint32_t read_data, s_Hs300xDataType *cal_result);
- static uint8_t Hs300x_DataConvert(uint32_t read_data, s_Hs300xDataType *cal_result)
- {
- uint32_t humi_data;
- uint32_t temp_data;
- if (((read_data & HS300X_STATUS_MASK) >> HS300X_STATUS_POS) == HS300X_DATA_VALID)
- {
- // Data is valid
- humi_data = (read_data & HS300X_HUMI_DATA_MASK) >> HS300X_HUMI_DATA_POS;
- temp_data = (read_data & HS300X_TEMP_DATA_MASK) >> HS300X_TEMP_DATA_POS;
- // Calculate the humidity: humi_data/(2^14-1) * 100
- cal_result->humi = (double)humi_data/(double)(HS300X_DATA_FACTOR) * 100.0;
- // Calculate the temperature: temp_data/(2^14-1) * 165 - 40
- cal_result->temp = (double)temp_data/(double)(HS300X_DATA_FACTOR) * 165.0 - 40;
- #ifdef HS300X_DEBUG
- printf("humidity:%f, temperature:%f\n", cal_result->humi, cal_result->temp);
- #endif
-
- return 1;
- }
- else
- {
- return 0;
- }
- }
- void Hs300x_Init(void)
- {
- // Do not settings, keep default settings in sensor device
- }
- void Hs300x_StartSample(void)
- {
- uint8_t data = 0;
- // Only send the address to start HS300X convert
- I2C_MasterTransmitPoll(I2C0, HS300x_I2C_SLAVE_ADDR_7BIT, &data, 0, ENABLE);
- }
- s_Hs300xDataType Hs300x_ReadData(void)
- {
- uint8_t data[4]; // one address + 4bytes data
- uint32_t data_u32;
- s_Hs300xDataType humi_temp;
- // Read measurement from sensor HS300X
- I2C_MasterReceivePoll(I2C0, HS300x_I2C_SLAVE_ADDR_7BIT, data, 4);
- // Convert the data to 32bit
- data_u32 = (uint32_t)((data[0] << 24U) |
- (data[1] << 16U) |
- (data[2] << 8U) |
- (data[3]));
- // Read the temperature and hunidity
- (void)Hs300x_DataConvert(data_u32, &humi_temp);
- //#ifdef HS300X_DEBUG
- printf ("HS300X origin data1:%x%x%x%x\r\n", data[0],data[1],data[2],data[3]);
- // printf("HS300X origin data2:%x\n", data_u32);
- printf ("Temp:%f--Humi:%f\r\n", humi_temp.temp, humi_temp.humi);
- //#endif
- return humi_temp;
- }
app_hs3003.h
- /*
- @hehung
- 2023-6-30
- email: 1398660197@qq.com
- wechat: hehung95
- reproduced and please indicate the source @hehung
- */
- #ifndef APP_HS3003_H__
- #define APP_HS3003_H__
- typedef struct
- {
- double humi;
- double temp;
- } s_Hs300xDataType;
- extern void Hs300x_Init(void);
- extern s_Hs300xDataType Hs300x_ReadData(void);
- extern void Hs300x_StartSample(void);
- #endif
主函数实现如下,其中40ms的延时是必须的。
- Hs300x_StartSample();
- mdelay(40);
- Hs300x_ReadData();
- mdelay(1000);
3 实验结果如下
如下,将手放到传感器上,影响传感器采集数据,温湿度都有所增加。