779|0

172

帖子

3

TA的资源

一粒金砂(高级)

楼主
 

【瑞萨FPB_RA6E2】测评——温湿度传感器HS3003数据读取 [复制链接]

本帖最后由 EPTmachine 于 2023-10-29 16:53 编辑

温湿度传感器HS3003数据读取

HS3003是瑞萨推出的一款高精度、全标定的温湿度传感器,依靠其集成的标定模块和温度补偿逻辑,用户无需对输出的数据进行标定。传感器的接口为I2C。本文使用fpb-ra6e2的I2C接口驱动HS3003读取环境中温湿度数据。

RA6E2的I2C配置

产看数据手册可知,RA6E2的P410和P411引脚为I2C0的SCL和SDA引脚。

创建工程后,在FSP配置界面的Stack中添加I2C连接。

通过查看HS3003的数据手册可知,其地址为0x44。

I2C接口的具体配置如下图所示

驱动I2C的函数主要有以下几个:

R_SCI_I2C_Open:打开I2C设备;

/* Initialize the I2C module */
    err = R_SCI_I2C_Open(&g_i2c0_ctrl, &g_i2c0_cfg);

R_SCI_I2C_Write:向I2C设备写入数据;

err = R_SCI_I2C_Write(&g_i2c0_ctrl, buffer, len, false);

R_SCI_I2C_Read:从I2C设备读取数据;

err = R_SCI_I2C_Read(&g_i2c0_ctrl, &data, 0x04, false);

sci_i2c_master_callback:中断回调函数,获取触发中断的事件,用于处理得到的数据。

/* Callback function */
i2c_master_event_t i2c_event = I2C_MASTER_EVENT_ABORTED;
void sci_i2c_master_callback(i2c_master_callback_args_t *p_args)
{
    i2c_event = I2C_MASTER_EVENT_ABORTED;
    if (NULL != p_args)
    {
        /* capture callback event for validating the i2c transfer event*/
        i2c_event = p_args->event;
    }
}

HS3003数据读写

查看数据手册可知,读取温湿度数据前,需要发出至少一次测量请求,测量请求的格式为发送从站地址和写标志。与该操作相关的代码如下:

//写入数据
void Humiture_HS3003_writeRegister( uint8_t reg_address, uint8_t *buffer, uint8_t len)
{
    err = R_SCI_I2C_Write(&g_i2c0_ctrl, buffer, len, false);
           assert(FSP_SUCCESS == err);
           /* Since there is nothing else to do, block until Callback triggers*/
           //while ((I2C_MASTER_EVENT_TX_COMPLETE != i2c_event) && timeout_ms)
           while ((I2C_MASTER_EVENT_TX_COMPLETE != i2c_event) && timeout_ms1>0)
           {
               R_BSP_SoftwareDelay(1U, BSP_DELAY_UNITS_MICROSECONDS);
               timeout_ms1--;
           }
           if (I2C_MASTER_EVENT_ABORTED == i2c_event)
           {
               __BKPT(0);
           }
           /* Read data back from the I2C slave */
           i2c_event = I2C_MASTER_EVENT_ABORTED;
           timeout_ms1           = 100000;


}
//请求一次测量
void Humiture_HS3003_init(void)
{
    Humiture_HS3003_writeRegister(HS300X_ADR,NULL,0);

}

产看数据手册中的数据抓取一节,可以知道在发出测量请求后,需要等待一段时间才能读取数据,读取数据的指令和返回数据的格式如下图所示。

相关的代码如下:

uint32_t Humiture_HS3003_readRegister32(uint8_t reg_address) {

    uint32_t value;
    uint8_t data[4];
    timeout_ms1           = 100000;

    /* Read data from I2C slave */
    err = R_SCI_I2C_Read(&g_i2c0_ctrl, &data, 0x04, false);
    assert(FSP_SUCCESS == err);
    while ((I2C_MASTER_EVENT_RX_COMPLETE != i2c_event) && timeout_ms1)
    {
        R_BSP_SoftwareDelay(1U, BSP_DELAY_UNITS_MILLISECONDS);
        timeout_ms1--;
    }
    if (I2C_MASTER_EVENT_ABORTED == i2c_event)
    {
        __BKPT(0);
    }

    i2c_event = I2C_MASTER_EVENT_ABORTED;
    timeout_ms1           = 100000;


    value=data[0];
    value<<=8;
    value|=data[1];
    value<<=8;
    value|=data[2];
    value<<=8;
    value|=data[3];
    return value;
}
//读取原始的数据
uint32_t Humiture_HS3003_ReadData_Raw(uint8_t resolution )
{
    uint8_t rx_buf[ 4 ];
    uint32_t data=0;
    Humiture_HS3003_init();//唤醒
    //8bit->1.2ms
    //10bit->2.72ms
    //12bit->9.10ms
    //14bit->33.90ms
    if(resolution==8)
    R_BSP_SoftwareDelay(1200U, BSP_DELAY_UNITS_MICROSECONDS);
    else if(resolution==10)
    R_BSP_SoftwareDelay(2720U, BSP_DELAY_UNITS_MICROSECONDS);
    else if(resolution==12)
    R_BSP_SoftwareDelay(9100U, BSP_DELAY_UNITS_MICROSECONDS);
    else
    R_BSP_SoftwareDelay(34U, BSP_DELAY_UNITS_MILLISECONDS);
    data=Humiture_HS3003_readRegister32(HS300X_ADR);
    return data;
}

得到传感器的数据后,需要将其转换为湿度和温度单位对应的值、

查看数据手册可知转换公式,在程序中添加相应的转换系数,用于单位的换算。相关代码如下:

#define HS300X_HUMD_MULTY           0.00006163516
#define HS300X_TEMP_MULTY           0.00006163516

在主函数中添加以下代码,实现HS3003读取温湿度的简单Demo

void hal_entry(void)
{
    /* TODO: add your own code here */
    /* Initialize the I2C module */
    err = R_SCI_I2C_Open(&g_i2c0_ctrl, &g_i2c0_cfg);
    /* Handle any errors. This function should be defined by the user. */
    assert(FSP_SUCCESS == err);

    Humiture_HS3003_init();

    while(1)
    {

        Data=Humiture_HS3003_ReadData_Raw(14);
        Temp = (float)( (Data & 0xFFFF) >> 2);//只要低十六位
        Temp = Temp*HS300X_TEMP_MULTY*165-40;//HS300X_TEMP_MULTY->0.00006163516(1/(2^14-1) )

        Humidity = (float)( (Data >> 16) &0x3FFF );//只要高十六位,且最高2位不要
        Humidity = Humidity*HS300X_HUMD_MULTY*100;//HS300X_HUMD_MULTY->0.00006163516(1/(2^14-1) )

        R_BSP_SoftwareDelay(1000U, BSP_DELAY_UNITS_MILLISECONDS);
    }


#if BSP_TZ_SECURE_BUILD
    /* Enter non-secure code */
    R_BSP_NonSecureEnter();
#endif
}

实际效果

连接开发板和HS3003模块,运行程序后,在调试窗口中添加对Humidity湿度变量和Temp温度变量的监控。

 

可以看到当前采集到的适度和温度值,数值还是准确的。

总结

配合FSP配置工具,开发RA6E2的I2C应用程序是十分方便的,可以帮助开发者快速编写应用程序。

工程文件 sci_i2c_hs3003_fpb_ra6e2.7z (487.89 KB, 下载次数: 3)
点赞 关注

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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