Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread活动
RTT RA2L1 HS3003采集温湿度之一
发布于 2023-02-24 19:57:14 浏览:500
订阅该版
[tocm] # 新建项目 1、文件->新建->RT-Thread项目 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230224/0f6fa4ea6d2dc637fa02f6889b6c29c0.png.webp) 2、选择基于开发板->CPK-RA2L1 填入项目名称,点击完成,就创建好了工程。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230224/d4811021ccaf333ebb54a85323d28cb5.png.webp) 3、给RA Smart Configurator设置FSP3.5.0的路径: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230224/ff07dbe6863acc46b3a7af641ef689af.png.webp) 4、打开RT-Thread settings添加hs3003软包: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230224/4d3163de91fcdd6548c3cd7f87713c71.png.webp) 5、打开I2c,配置P407、P408为I2C的SDA、SCL: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230224/911191ca6a9ca134a132789473ece43c.png.webp) 6、修改sensor_renesas_hs300x.c为如下内容: ```c /* * 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,%x\n", r_buf[0], r_buf[1], r_buf[2], r_buf[3]); LOG_D("state:%x\n", 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为如下内容: ```c /* * 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.%2d\n", (int)humi_f, (int)(humi_f*100)%100); rt_kprintf("HUMI: %d.%2d\n", (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); ``` 实现效果为: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230224/ade9c3fefaeab9a30a76a932c694ea31.png) 【小结】这节主要是新建基础工程,并且添加hs3003的软件包。实现温度、湿度的采集。下一集创建DA16200 AT_MQTT。
3
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
Lu_盼盼
这家伙很懒,什么也没写!
文章
35
回答
20
被采纳
0
关注TA
发私信
相关文章
1
(苏州站)RT-Thread物联网开发者沙龙【已结束】
2
(成都站)RT-Thread物联网开发者沙龙
3
(深圳站)RT-Thread物联网开发者沙龙
4
(西安站)RT-Thread物联网开发者沙龙
5
成都站2018 RT-Thread开发者沙龙回顾及PPT下载
6
2018 RT-Thread物联网开发者沙龙(北京站)
7
2018 RT-Thread物联网开发者沙龙(南京站)
8
第十三届研电赛RT-Thread企业专项奖发布通知
9
RT-Thread应用作品征集大赛开始啦!
10
你的投票将决定RT-Thread官网应该优先准备的文档是哪些
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
cubemx
WIZnet_W5500
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
keil_MDK
ulog
SFUD
msh
C++_cpp
MicroPython
本月问答贡献
RTT_逍遥
7
个答案
2
次被采纳
三世执戟
7
个答案
1
次被采纳
KunYi
6
个答案
1
次被采纳
winfeng
2
个答案
1
次被采纳
chenyaxing
2
个答案
1
次被采纳
本月文章贡献
出出啊
1
篇文章
4
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部