nRF54L15

zephyr pms7003 driver 사용하기

병남 2025. 9. 22. 01:27

pms7003 공기질센서 드라이버는 아래 경로에서 찾을 수 있습니다.

zephyr/drivers/sensor/pms7003

 

동작환경

zephyr OS : v4.0.99

nRF Connect SDK v3.0.1

 

동작로그

 

개발환경 

nRF54L15-DK Board + pms7003 sensor

 

prj.conf

# General kernel settings
CONFIG_PRINTK=y
CONFIG_MAIN_STACK_SIZE=2048

# Enable the sensor subsystem and the PMS7003 driver
CONFIG_SENSOR=y
CONFIG_PMS7003=y

# PMS7003 uses UART
CONFIG_SERIAL=y
# Enable interrupt-driven UART communication
CONFIG_UART_INTERRUPT_DRIVEN=y

# Enable floating point support for printf to display sensor values
CONFIG_CBPRINTF_FP_SUPPORT=y

# Enable Sensor Debug Log
CONFIG_LOG=y
CONFIG_SENSOR_LOG_LEVEL_DBG=y

 

app.overlay

/{
    aliases {
        pms0 = &pms7003;
    };
};

&uart21 {
    compatible = "nordic,nrf-uarte";
    current-speed = <9600>;
    status = "okay";
    pinctrl-0 = <&uart21_default>;
    pinctrl-1 = <&uart21_sleep>;
    pinctrl-names = "default", "sleep";

    pms7003:pms7003 {
        compatible = "plantower,pms7003";
        label = "PMS7003";
        status = "okay";
    };
   
};

&pinctrl {
    uart21_default: uart21_default {
        group1 {
            psels = <NRF_PSEL(UART_TX, 1, 11)>,
                    <NRF_PSEL(UART_RX, 1, 12)>;
        };
    };

    uart21_sleep: uart21_sleep {
        group1 {
            psels = <NRF_PSEL(UART_TX, 1, 11)>,
                    <NRF_PSEL(UART_RX, 1, 12)>;
            low-power-enable;
        };
    };
};

 

main.c

#include <zephyr/kernel.h>
#include <zephyr/device.h>
#include <zephyr/drivers/sensor.h>
#include <zephyr/sys/printk.h>
#include <stdio.h>

static const struct device *pms_dev = DEVICE_DT_GET(DT_ALIAS(pms0));

/* sensor_value를 double로 변환하여 출력하는 헬퍼 함수 */
static void print_sensor_value(const char *name, const struct sensor_value *val)
{
    printk("%s: %.2f ug/m3\n", name, sensor_value_to_double(val));
}

int main(void)
{
    if (!device_is_ready(pms_dev)) {
        printk("PMS7003 sensor device not ready!\n");
        return 1;
    }

    printk("PMS7003 Particulate Matter Sensor Sample (using alias)\n");

    while (1) {
        struct sensor_value pm1p0, pm2p5, pm10p0;
        int ret;

        /* 센서로부터 새로운 데이터를 가져옵니다. */
        ret = sensor_sample_fetch(pms_dev);
        if (ret) {
            printk("Failed to fetch sample from PMS7003: %d\n", ret);
            k_sleep(K_MSEC(200));
            continue;
        }

        /* 각 채널(PM1.0, PM2.5, PM10)의 값을 읽어옵니다. */
        sensor_channel_get(pms_dev, SENSOR_CHAN_PM_1_0, &pm1p0);
        sensor_channel_get(pms_dev, SENSOR_CHAN_PM_2_5, &pm2p5);
        sensor_channel_get(pms_dev, SENSOR_CHAN_PM_10, &pm10p0);

        /* 읽어온 값을 출력합니다. */
        print_sensor_value("PM  1.0", &pm1p0);
        print_sensor_value("PM  2.5", &pm2p5);
        print_sensor_value("PM 10.0", &pm10p0);
        printk("----------------------------------------\n");

        k_sleep(K_MSEC(100));
    }
}

 

build & flash하면 아래와 같이 동작하는 것을 확인할 수 있습니다.

 

동작영상

 

 

'nRF54L15' 카테고리의 다른 글

zephyr dht11 driver 사용하기  (0) 2025.09.21