RT-Thread Studio学习 驱动攀藤PMS5003ST PM2.5传感器

传感器参数及使用方法参照:

https://blog.csdn.net/lu_embedded/article/details/107317387

PMS 传感器与 MCU 的电路连接示意图如下:

目前使用仅用到RXD、TXD、VCC、GND

软件包使用

PMS5003ST为增强型传感器,软件包配置需要配置为增强型

1.RT-Thread Setting中添加pmsxx软件包

2.组件配置中使能串口DMA模式

  

 3.修改board.h宏,添加相关串口的宏定义 BSP_USING_UARTx 及修改引脚信息,并开启DMA接收功能

 4.修改rtconfig.h宏,修改传感器相关的宏定义 PKG_USING_PMSXX_UART_DMA(开启DMA接收)及PKG_USING_PMSXX_ENHANCED(增强型传感器)

以上软件包配置完成。

打开软件包文件夹可见示例代码:

官方示例程序

#include "my_pmsxx.h"


/*
 * Copyright (c) 2020, RudyLo <luhuadong@163.com>
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2020-07-04     luhuadong    the first version
 */



#ifndef PKG_USING_PMSXX_SAMPLE_UART
#define PMSXX_UART_NAME                    "uart3"
#else
#define PMSXX_UART_NAME                    PKG_USING_PMSXX_SAMPLE_UART
#endif

static void read_dust_entry(void *args)
{
    rt_device_t sensor = RT_NULL;
    struct rt_sensor_data sensor_data;

    sensor = rt_device_find(args);
    if (!sensor)
    {
        rt_kprintf("Can't find PMS device.\n");
        return;
    }

    if (rt_device_open(sensor, RT_DEVICE_FLAG_RDWR))
    {
        rt_kprintf("Open PMS device failed.\n");
        return;
    }

    rt_uint16_t loop = 10;
    while (loop--)
    {
        if (1 != rt_device_read(sensor, 0, &sensor_data, 1))
        {
            rt_kprintf("Read PMS data failed.\n");
            continue;
        }
        rt_kprintf("[%d] PM2.5: %d ug/m3\n", sensor_data.timestamp, sensor_data.data.dust);

        rt_thread_mdelay(3000);
    }

    rt_device_close(sensor);
}

static void dump_dust_entry(void *args)
{
    rt_device_t sensor = RT_NULL;
    struct rt_sensor_data sensor_data;
    struct pms_response resp;
    rt_err_t ret;

    sensor = rt_device_find(args);
    if (!sensor)
    {
        rt_kprintf("Can't find PMS device.\n");
        return;
    }

    if (rt_device_open(sensor, RT_DEVICE_FLAG_RDWR))
    {
        rt_kprintf("Open PMS device failed.\n");
        return;
    }

    rt_uint16_t loop = 10;
    while (loop--)
    {
        ret = rt_device_control(sensor, RT_SENSOR_CTRL_PMS_DUMP, &resp);

        if (ret != RT_EOK)
            rt_kprintf("Dump PMS data failed.\n");
        else
            pms_show_response(&resp);

        rt_thread_mdelay(3000);
    }

    rt_device_close(sensor);
}

static int pms_read_sample(void)
{
    rt_thread_t dust_thread;

    dust_thread = rt_thread_create("pms_read", read_dust_entry,
                                   "dust_pms", 1024,
                                    RT_THREAD_PRIORITY_MAX / 2, 20);

    if (dust_thread)
        rt_thread_startup(dust_thread);
}

static int pms_dump_sample(void)
{
    rt_thread_t dust_thread;

    dust_thread = rt_thread_create("pms_dump", dump_dust_entry,
                                   "dust_pms", 1024,
                                    RT_THREAD_PRIORITY_MAX / 2, 20);

    if (dust_thread)
        rt_thread_startup(dust_thread);
}

#ifdef FINSH_USING_MSH
MSH_CMD_EXPORT(pms_dump_sample, dump pms response data);
MSH_CMD_EXPORT(pms_read_sample, read PM2.5 data);
#endif

static int rt_hw_pms_port(void)
{
    struct rt_sensor_config cfg;

    cfg.intf.type = RT_SENSOR_INTF_UART;
    cfg.intf.dev_name = PMSXX_UART_NAME;
    rt_hw_pms_init("pms", &cfg);

    return RT_EOK;
}
INIT_COMPONENT_EXPORT(rt_hw_pms_port);

测试结果

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值