0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

RTT RA2L1 HS3003采集溫濕度之一

冬至子 ? 來源:Lu_盼盼 ? 作者:Lu_盼盼 ? 2023-10-12 11:02 ? 次閱讀

新建項目

1、文件->新建->RT-Thread項目

1.jpg

2、選擇基于開發(fā)板->CPK-RA2L1 填入項目名稱,點擊完成,就創(chuàng)建好了工程。

1.jpg

3、給RA Smart Configurator設(shè)置FSP3.5.0的路徑:

1.jpg

4、打開RT-Thread settings添加hs3003軟包:

1.jpg

5、打開I2c,配置P407、P408為I2C的SDA、SCL:

1.jpg

6、修改sensor_renesas_hs300x.c為如下內(nèi)容:

/*

  • Copyright (c) 2006-2018, RT-Thread Development Team
  • SPDX-License-Identifier: Apache-2.0
  • Change Logs:
  • Date Author Notes
  • 2020-11-03 flybreak the first version
    /
    #include
    #include
    #include "sensor_renesas_hs300x.h"
    #define DBG_TAG "sensor.renesas.hs300x"
    #define DBG_LVL DBG_INFO
    #include
    #define SENSOR_TEMP_RANGE_MAX (80)
    #define SENSOR_TEMP_RANGE_MIN (-10)
    #define SENSOR_HUMI_RANGE_MAX (100)
    #define SENSOR_HUMI_RANGE_MIN (0)
    /
    Definitions of Mask Data for A/D data /
    #define RM_HS300X_MASK_HUMIDITY_UPPER_0X3F (0x3F)
    #define RM_HS300X_MASK_TEMPERATURE_LOWER_0XFC (0xFC)
    #define RM_HS300X_MASK_STATUS_0XC0 (0xC0)
    /
    Definitions for Status Bits of A/D Data /
    #define RM_HS300X_DATA_STATUS_VALID (0x00) // Status-bit: Valid data
    /
    Definitions for Calculation */
    #define RM_HS300X_CALC_STATIC_VALUE (16383.0F)
    #define RM_HS300X_CALC_HUMD_VALUE_100 (100.0F)
    #define RM_HS300X_CALC_TEMP_C_VALUE_165 (165.0F)
    #define RM_HS300X_CALC_TEMP_C_VALUE_40 (40.0F)
    #define RM_HS300X_CALC_DECIMAL_VALUE_100 (100.0F)
    struct hs300x_device
    {
    struct rt_i2c_bus_device *i2c;
    uint8_t addr;
    };
    struct hs300x_device temp_humi_dev;
    static rt_err_t _hs300x_init(struct rt_sensor_intf intf)
    {
    temp_humi_dev.i2c = rt_i2c_bus_device_find(intf->dev_name);
    temp_humi_dev.addr = (uint8_t)intf->user_data;
    if (temp_humi_dev.i2c == RT_NULL)
    {
    return -RT_ERROR;
    }
    return RT_EOK;
    }
    int hs300x_read_data(struct hs300x_device
    dev, float *humi_f, float *temp_f)
    {
    uint8_t r_buf[4] = {0};
    uint16_t humi, temp;
    float tmp_f = 0.0;
    struct rt_i2c_msg msgs;
    msgs.addr = dev->addr;
    msgs.flags = RT_I2C_WR;
    msgs.buf = 0;
    msgs.len = 0;
    if (rt_i2c_transfer(dev->i2c, &msgs, 1) != 1)
    {
    LOG_E("mr error!n");
    return -1;
    }
    msgs.addr = dev->addr;
    msgs.flags = RT_I2C_RD;
    msgs.buf = r_buf;
    msgs.len = 4;
    __retry:
    if (rt_i2c_transfer(dev->i2c, &msgs, 1) == 1)
    {
    LOG_D("%x,%x,%x,%xn", r_buf[0], r_buf[1], r_buf[2], r_buf[3]);
    LOG_D("state:%xn", r_buf[0] & RM_HS300X_MASK_STATUS_0XC0);
    if ((r_buf[0] & RM_HS300X_MASK_STATUS_0XC0) != RM_HS300X_DATA_STATUS_VALID)
    {
    rt_thread_mdelay(100);
    goto __retry;
    }
    humi = (r_buf[0] & RM_HS300X_MASK_HUMIDITY_UPPER_0X3F) << 8 | r_buf[1];
    temp = (r_buf[2] << 8 | (r_buf[3] & RM_HS300X_MASK_TEMPERATURE_LOWER_0XFC)) >> 2;
    tmp_f = (float)humi;
    tmp_f = (tmp_f * RM_HS300X_CALC_HUMD_VALUE_100) / RM_HS300X_CALC_STATIC_VALUE;
    if (humi_f)
    {
    humi_f = tmp_f;
    }
    tmp_f = (float)temp;
    tmp_f = ((tmp_f * RM_HS300X_CALC_TEMP_C_VALUE_165) / RM_HS300X_CALC_STATIC_VALUE) - RM_HS300X_CALC_TEMP_C_VALUE_40;
    if (temp_f)
    {
    temp_f = tmp_f;
    }
    return 0;
    }
    else {
    LOG_E("read error!n");
    return -1;
    }
    }
    float hs300x_read_temperature(struct hs300x_device
    dev)
    {
    float temp;
    if (hs300x_read_data(dev, NULL, &temp) == 0)
    {
    return temp;
    }
    return 0;
    }
    float hs300x_read_humidity(struct hs300x_device
    dev)
    {
    float humi;
    if (hs300x_read_data(dev, &humi, NULL) == 0)
    {
    return humi;
    }
    return 0;
    }
    static rt_size_t _hs300x_polling_get_data(rt_sensor_t sensor, struct rt_sensor_data *data)
    {
    float temperature_x10, humidity_x10;
    if (sensor->info.type == RT_SENSOR_CLASS_TEMP)
    {
    temperature_x10 = 10 * hs300x_read_temperature(&temp_humi_dev);
    data->data.temp = (rt_int32_t)temperature_x10;
    data->timestamp = rt_sensor_get_ts();
    }
    else if (sensor->info.type == RT_SENSOR_CLASS_HUMI)
    {
    humidity_x10 = 10 * hs300x_read_humidity(&temp_humi_dev);
    data->data.humi = (rt_int32_t)humidity_x10;
    data->timestamp = rt_sensor_get_ts();
    }
    return 1;
    }
    static rt_size_t hs300x_fetch_data(struct rt_sensor_device *sensor, void *buf, rt_size_t len)
    {
    RT_ASSERT(buf);
    if (sensor->config.mode == RT_SENSOR_MODE_POLLING)
    {
    return _hs300x_polling_get_data(sensor, buf);
    }
    else
    return 0;
    }
    static rt_err_t hs300x_control(struct rt_sensor_device *sensor, int cmd, void *args)
    {
    rt_err_t result = RT_EOK;
    return result;
    }
    static struct rt_sensor_ops sensor_ops =
    {
    hs300x_fetch_data,
    hs300x_control
    };
    int rt_hw_hs300x_init(const char *name, struct rt_sensor_config cfg)
    {
    rt_int8_t result;
    rt_sensor_t sensor_temp = RT_NULL, sensor_humi = RT_NULL;
    /
    temperature sensor register /
    sensor_temp = rt_calloc(1, sizeof(struct rt_sensor_device));
    if (sensor_temp == RT_NULL)
    return -1;
    sensor_temp->info.type = RT_SENSOR_CLASS_TEMP;
    sensor_temp->info.vendor = RT_SENSOR_VENDOR_UNKNOWN;
    sensor_temp->info.model = "hs300x";
    sensor_temp->info.unit = RT_SENSOR_UNIT_DCELSIUS;
    sensor_temp->info.intf_type = RT_SENSOR_INTF_I2C;
    sensor_temp->info.range_max = SENSOR_TEMP_RANGE_MAX;
    sensor_temp->info.range_min = SENSOR_TEMP_RANGE_MIN;
    sensor_temp->info.period_min = 5;
    rt_memcpy(&sensor_temp->config, cfg, sizeof(struct rt_sensor_config));
    sensor_temp->ops = &sensor_ops;
    result = rt_hw_sensor_register(sensor_temp, name, RT_DEVICE_FLAG_RDONLY, RT_NULL);
    if (result != RT_EOK)
    {
    LOG_E("device register err code: %d", result);
    goto __exit;
    }
    /
    humidity sensor register */
    sensor_humi = rt_calloc(1, sizeof(struct rt_sensor_device));
    if (sensor_humi == RT_NULL)
    return -1;
    sensor_humi->info.type = RT_SENSOR_CLASS_HUMI;
    sensor_humi->info.vendor = RT_SENSOR_VENDOR_UNKNOWN;
    sensor_humi->info.model = "hs300x";
    sensor_humi->info.unit = RT_SENSOR_UNIT_PERMILLAGE;
    sensor_humi->info.intf_type = RT_SENSOR_INTF_I2C;
    sensor_humi->info.range_max = SENSOR_HUMI_RANGE_MAX;
    sensor_humi->info.range_min = SENSOR_HUMI_RANGE_MIN;
    sensor_humi->info.period_min = 5;
    rt_memcpy(&sensor_humi->config, cfg, sizeof(struct rt_sensor_config));
    sensor_humi->ops = &sensor_ops;
    result = rt_hw_sensor_register(sensor_humi, name, RT_DEVICE_FLAG_RDONLY, RT_NULL);
    if (result != RT_EOK)
    {
    LOG_E("device register err code: %d", result);
    goto __exit;
    }
    _hs300x_init(&cfg->intf);
    return RT_EOK;
    __exit:
    if (sensor_temp)
    rt_free(sensor_temp);
    if (sensor_humi)
    rt_free(sensor_humi);
    return -RT_ERROR;
    }
    #define HS300X_I2C_BUS "i2c1"
    int rt_hw_hs300x_port(void)
    {
    struct rt_sensor_config cfg;
    cfg.intf.dev_name = HS300X_I2C_BUS;
    cfg.intf.user_data = (void *)HS300X_I2C_ADDR;
    rt_hw_hs300x_init("hs300x", &cfg);
    return RT_EOK;
    }
    INIT_APP_EXPORT(rt_hw_hs300x_port);
    6、修改hal_entry.c為如下內(nèi)容:

/*

Copyright (c) 2006-2021, RT-Thread Development Team

SPDX-License-Identifier: Apache-2.0

Change Logs:
Date Author Notes
2021-10-10 Sherman first version
/
#include
#include "hal_data.h"
#include
#include "sensor_renesas_hs300x.h"
#define LED1_PIN "P502" /
Onboard LED pins /
#define USER_INPUT "P004"
extern struct hs300x_device temp_humi_dev;
void hal_entry(void)
{
float temp_f,humi_f;
rt_kprintf("nHello RT-Thread!n");
rt_uint32_t led1_pin = rt_pin_get(LED1_PIN);
while (1)
{
rt_pin_write(led1_pin, PIN_HIGH);
rt_thread_mdelay(500);
rt_pin_write(led1_pin, PIN_LOW);
rt_thread_mdelay(500);
hs300x_read_data(&temp_humi_dev, &humi_f, &temp_f);
rt_kprintf("HUMI: %d.%2dn", (int)humi_f, (int)(humi_f
100)%100);
rt_kprintf("HUMI: %d.%2dn", (int)temp_f, (int)(temp_f*100)%100);
}
}
void irq_callback_test(void args)
{
rt_kprintf("n IRQ03 triggered n");
}
void icu_sample(void)
{
/
init */
rt_uint32_t pin = rt_pin_get(USER_INPUT);
rt_kprintf("n pin number : 0x%04X n", pin);
rt_err_t err = rt_pin_attach_irq(pin, PIN_IRQ_MODE_RISING, irq_callback_test, RT_NULL);
if (RT_EOK != err)
{
rt_kprintf("n attach irq failed. n");
}
err = rt_pin_irq_enable(pin, PIN_IRQ_ENABLE);
if (RT_EOK != err)
{
rt_kprintf("n enable irq failed. n");
}
}
MSH_CMD_EXPORT(icu_sample, icu sample);

實現(xiàn)效果為:

1.jpg

【小結(jié)】這節(jié)主要是新建基礎(chǔ)工程,并且添加hs3003的軟件包。實現(xiàn)溫度、濕度的采集。下一集創(chuàng)建DA16200 AT_MQTT。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • SDA
    SDA
    +關(guān)注

    關(guān)注

    0

    文章

    123

    瀏覽量

    27956
  • SCL
    SCL
    +關(guān)注

    關(guān)注

    1

    文章

    239

    瀏覽量

    16990
  • FSP
    FSP
    +關(guān)注

    關(guān)注

    0

    文章

    34

    瀏覽量

    7072
  • RTThread
    +關(guān)注

    關(guān)注

    7

    文章

    132

    瀏覽量

    40684
  • HAL庫
    +關(guān)注

    關(guān)注

    1

    文章

    114

    瀏覽量

    6032
收藏 人收藏

    評論

    相關(guān)推薦

    英飛凌PSC62低功耗溫濕度數(shù)據(jù)采集

    驅(qū)動hs3003溫濕度傳感器,采集完數(shù)據(jù)后進入深度睡眠模式,以達到節(jié)能的目的。
    的頭像 發(fā)表于 05-30 09:05 ?41.5w次閱讀
    英飛凌PSC62低功耗<b class='flag-5'>溫濕度數(shù)據(jù)采集</b>

    使用RT-Thread和CPK-RA2L1采集DHT11溫濕度

    本篇文章主要介紹使用RT-Thread Studio 和瑞薩 CPK-RA2L1評估板,使用大佬的輪子采集溫濕度
    的頭像 發(fā)表于 10-11 11:34 ?1465次閱讀
    使用RT-Thread和CPK-<b class='flag-5'>RA2L1</b><b class='flag-5'>采集</b>DHT11<b class='flag-5'>溫濕度</b>

    RA4M2設(shè)計挑戰(zhàn)賽】HS3003讀取數(shù)據(jù)

    HS3003溫濕度計,I2C接口,這里給大家分享下基本的驅(qū)動:時鐘配置這里要說明下,原來的RA4M
    發(fā)表于 01-17 07:57

    RA4M2設(shè)計挑戰(zhàn)賽】RTT sensor模塊驅(qū)動hs3003

    上層提供統(tǒng)的操作接口,提高上層代碼的可重用性經(jīng)查看sensor支持包,rtt支持該傳感器的:在【RA4M2設(shè)計挑戰(zhàn)賽】RTT 移植 這篇帖子基礎(chǔ)上加入
    發(fā)表于 02-06 14:37

    RA4M2設(shè)計挑戰(zhàn)賽】2. 硬件IIC讀取HS3003溫濕度數(shù)據(jù)

    ),基于FreeRTOS作為OS,實現(xiàn)硬件IIC采集HS3003溫濕度數(shù)據(jù)。HS300X原理圖通過對比了RA4M2開發(fā)板的PMOD接口以及
    發(fā)表于 02-11 20:21

    RA4M2設(shè)計挑戰(zhàn)賽】讀取HS3003數(shù)據(jù),并在OLED上顯示,串口打印

    概述HS3003種數(shù)字式溫濕度傳感器,可以測量環(huán)境中的溫度和濕度。讀取HS3003的數(shù)據(jù)需要連接傳感器到
    發(fā)表于 02-22 15:11

    RA4M2設(shè)計挑戰(zhàn)賽】低功耗遠距離無線溫度監(jiān)控項目

    次數(shù)據(jù),長達1年左右的工作時間。項目用到的硬件1、瑞薩RA4M2開發(fā)板 12、瑞薩
    發(fā)表于 02-23 15:03

    RA4M2設(shè)計挑戰(zhàn)賽】+溫濕度采集通過WiFi模塊上傳PC端

    通過HS3003溫濕度模塊采集溫度,采集溫度時3個LED燈閃亮。通過DA16200WiFi模塊上傳到PC網(wǎng)頁端,PC端使用python Flask建立本地服務(wù)器,展示溫度數(shù)據(jù)。通過U盤
    發(fā)表于 02-24 23:02

    RA4M2設(shè)計挑戰(zhàn)賽】2、H3003溫濕度傳感器使用

    RA4M2設(shè)計挑戰(zhàn)賽】2、H3003溫濕度傳感器使用H3003簡介HS3003
    發(fā)表于 02-26 22:29

    基于RA4M2HS3003溫濕度測量

    、前言HS3003種數(shù)字式溫濕度傳感器,可以測量環(huán)境中的溫度和濕度。讀取HS3003的數(shù)據(jù)
    發(fā)表于 03-05 23:38

    【精品合集】瑞薩RA4M2物聯(lián)網(wǎng)網(wǎng)關(guān)設(shè)計挑戰(zhàn)賽作品合集

    FreeRTOS【RA4M2設(shè)計挑戰(zhàn)賽】2. 硬件IIC讀取HS3003溫濕度數(shù)據(jù)【RA4M2設(shè)計挑戰(zhàn)賽】3. 硬件IIC讀取ISL290
    發(fā)表于 03-07 14:33

    RTT RA2L1 HS3003采集溫濕度項目設(shè)計

    , icu sample);  實現(xiàn)效果為:  【小結(jié)】  這節(jié)主要是新建基礎(chǔ)工程,并且添加hs3003的軟件包。實現(xiàn)溫度、濕度采集。原作者:Lu_盼盼
    發(fā)表于 03-07 17:43

    【CW32飯盒派開發(fā)板試用體驗】6.硬件I2C之連接HS300X讀取溫濕度數(shù)據(jù)

    器 【CW32飯盒派開發(fā)板試用體驗】4. ADC采樣搖桿模塊X軸和Y軸輸出 【CW32飯盒派開發(fā)板試用體驗】5. 極簡方式移植FreeRTOS成功 1 HS3003介紹 HS3003是瑞薩的
    發(fā)表于 06-07 21:45

    國民技術(shù)N32WB031驅(qū)動HS3003采集溫濕度

    國民技術(shù)n32wb031驅(qū)動hs3003。
    的頭像 發(fā)表于 05-02 17:28 ?25.8w次閱讀
    國民技術(shù)N32WB031驅(qū)動<b class='flag-5'>HS3003</b><b class='flag-5'>采集</b><b class='flag-5'>溫濕度</b>

    RA4M2開發(fā)(4)----讀取HS3003數(shù)據(jù),并在OLED上顯示,串口打印

    HS3003種數(shù)字式溫濕度傳感器,可以測量環(huán)境中的溫度和濕度。讀取HS3003的數(shù)據(jù)需要連接傳感器到
    的頭像 發(fā)表于 07-27 10:14 ?1193次閱讀
    <b class='flag-5'>RA4M2</b>開發(fā)(4)----讀取<b class='flag-5'>HS3003</b>數(shù)據(jù),并在OLED上顯示,串口打印