中级
30 分钟

使用 ENS160 和 PIC18F57Q43 检测空气中的污染物

不要让空气污染影响你的心情!

Air quality 9 Click with Curiosity Nano with PIC18F57Q43

已发布 6月 25, 2024

点击板

Air quality 9 Click

开发板

Curiosity Nano with PIC18F57Q43

编译器

NECTO Studio

微控制器单元

PIC18F57Q43

最佳空气质量传感解决方案。

A

A

硬件概览

它是如何工作的?

Air Quality 9 Click基于ENS160,这是一款室内空气质量传感器,采用了来自ScioSense的四个MOx传感器元件的金属氧化物(MOX)技术。该传感器具有复杂的融合算法,可产生更好地调整为人类占用者自然响应的测量输出。基于ENS160的多元素TrueVOC™技术对氧化性气体(如臭氧)以及一系列挥发性有机化合物(VOC),如乙醇、甲苯以及氢和二氧化氮,具有卓越的选择性和准确性,影响室内空气质量。ENS160符合全球室内空气质量(IAQ)信号标准,并设计用于高容量和可靠性。为了获得最佳性能,传感器必须在正常室内空气中工作,在-5到60°C(典型值:25°C)的温度范围内,相对湿度在20到80%RH(典

型值:50%RH),无冷凝物,无侵蚀性或有毒气体存在。在这些条件之外的环境中长时间暴露可能会影响传感器的性能和寿命。这个Click板™允许使用I2C和SPI接口,I2C通信的最大频率为1MHz,SPI通信的最大频率为10MHz。可以通过适当位置的标记为COMM SEL的SMD跳线进行选择。注意,所有跳线的位置必须在同一侧,否则Click板™可能会变得无响应。当选择I2C接口时,ENS160允许使用标记为ADDR SEL的SMD跳线选择其I2C从设备地址的最低有效位(LSB)。这个Click板™还具有一个额外的中断信号,路由到标记为INT的mikroBUS™插座的INT引脚上,指示测量过程本身的状态。ENS160还需要1.8V的供电电压

才能正常工作。因此,来自Diodes Incorporated的小型LDO稳压器AP2112提供了来自mikroBUS™ 3V3电源轨的1.8V。可以通过路由到mikroBUS™插座的PWM引脚的EN引脚启用或禁用该LDO,因此,提供了一个开关操作来打开/关闭对ENS160的电源传递。这个Click板™只能以3.3V逻辑电压电平运行。在使用具有不同逻辑电平的MCU之前,板子必须执行适当的逻辑电压电平转换。但是,Click板™配备了一个包含函数和示例代码的库,可用作进一步开发的参考。

Air quality 9 Click top side image
Air quality 9 Click bottom side image

功能概述

开发板

PIC18F57Q43 Curiosity Nano 评估套件是一款尖端的硬件平台,旨在评估 PIC18-Q43 系列内的微控制器。其设计的核心是包含了功能强大的 PIC18F57Q43 微控制器(MCU),提供先进的功能和稳健的性能。这个评估套件的关键特点包括一个黄 色用户 LED 和一个响应灵敏的机械用户开关,提供无

缝的交互和测试。为一个 32.768kHz 水晶振荡器足迹提供支持,确保精准的定时能力。套件内置的调试器拥有一个绿色电源和状态 LED,使编程和调试变得直观高效。此外,增强其实用性的还有虚拟串行端口 (CDC)和一个调试 GPIO 通道(DGI GPIO),提供广泛的连接选项。该套件通过 USB 供电,拥有由

 MIC5353 LDO 调节器提供支持的可调目标电压功能,确保在 1.8V 至 5.1V 的输出电压范围内稳定运行,最大输出电流为 500mA,受环境温度和电压限制。

PIC18F57Q43 Curiosity Nano double side image

微控制器概述 

MCU卡片 / MCU

default

建筑

PIC

MCU 内存 (KB)

128

硅供应商

Microchip

引脚数

48

RAM (字节)

8196

你完善了我!

配件

Curiosity Nano Base for Click boards 是一款多功能硬件扩展平台,专为简化 Curiosity Nano 套件与扩展板之间的集成而设计,特别针对符合 mikroBUS™ 标准的 Click 板和 Xplained Pro 扩展板。这款创新的基板(屏蔽板)提供了无缝的连接和扩展可能性,简化了实验和开发过程。主要特点包括从 Curiosity Nano 套件提供 USB 电源兼容性,以及为增强灵活性而提供的另一种外部电源输入选项。板载锂离子/锂聚合物充电器和管理电路确保电池供电应用的平稳运行,简化了使用和管理。此外,基板内置了一个固定的 3.3V 电源供应单元,专用于目标和 mikroBUS™ 电源轨,以及一个固定的 5.0V 升压转换器,专供 mikroBUS™ 插座的 5V 电源轨,为各种连接设备提供稳定的电力供应。

Curiosity Nano Base for Click boards accessories 1 image

使用的MCU引脚

mikroBUS™映射器

NC
NC
AN
NC
NC
RST
SPI Chip Select
PD4
CS
SPI Clock
PC6
SCK
SPI Data OUT
PC5
MISO
SPI Data IN
PC4
MOSI
Power Supply
3.3V
3.3V
Ground
GND
GND
NC
NC
PWM
Interrupt
PA6
INT
NC
NC
TX
NC
NC
RX
I2C Clock
PB2
SCL
I2C Data
PB1
SDA
Power Supply
5V
5V
Ground
GND
GND
1

“仔细看看!”

Click board™ 原理图

Air quality 9 Click Schematic schematic

一步一步来

项目组装

Curiosity Nano Base for Click boards front image hardware assembly

从选择您的开发板和Click板™开始。以Curiosity Nano with PIC18F57Q43作为您的开发板开始。

Curiosity Nano Base for Click boards front image hardware assembly
Charger 27 Click front image hardware assembly
PIC18F47Q10 Curiosity Nano front image hardware assembly
Prog-cut hardware assembly
Board mapper by product8 hardware assembly
Necto image step 2 hardware assembly
Necto image step 3 hardware assembly
Necto image step 4 hardware assembly
Necto image step 5 hardware assembly
Necto image step 6 hardware assembly
PIC18F57Q43 Curiosity MCU Step hardware assembly
Necto No Display image step 8 hardware assembly
Necto image step 9 hardware assembly
Necto image step 10 hardware assembly
Debug Image Necto Step hardware assembly

软件支持

库描述

该库包含 Air quality 9 Click 驱动程序的 API。

关键功能:

  • airquality9_read_aqi_uba - 该函数读取每个UBA的空气质量指数(AQI-UBA)。

  • airquality9_read_tvoc - 该函数读取每ppb的计算总挥发性有机化合物(TVOC)浓度。

  • airquality9_read_eco2 - 该函数读取每ppm的计算等效二氧化碳(eCO2)浓度。

开源

代码示例

完整的应用程序代码和一个现成的项目可以通过NECTO Studio包管理器直接安装到NECTO Studio 应用程序代码也可以在MIKROE的GitHub账户中找到。

/*!
 * @file main.c
 * @brief AirQuality9 Click example
 *
 * # Description
 * This example demonstrates the use of Air Quality 9 Click board by reading and displaying
 * outputs such as eCO2, TVOC and AQI in compliance with worldwide IAQ standards.
 *
 * The demo application is composed of two sections :
 *
 * ## Application Init
 * Initializes the driver and logger and performs the Click default configuration.
 *
 * ## Application Task
 * Waits for the new data interrupt which triggers once per second, 
 * and then reads the validity status, TVOC, eCO2, and AQI-UBA values. 
 * All values are being displayed on the USB UART where you can track their changes.
 *
 * @author Stefan Filipovic
 *
 */

#include "board.h"
#include "log.h"
#include "airquality9.h"

static airquality9_t airquality9;
static log_t logger;

/**
 * @brief Air Quality 9 display status validity function.
 * @details This function parses the status validity from status byte and displays it on the USB UART.
 * @param[in] status : Data status byte.
 * @return None.
 * @note None.
 */
void airquality9_display_status_validity ( uint8_t status );

/**
 * @brief Air Quality 9 display aqi uba function.
 * @details This function parses the Air Quality Index per UBA (AQI-UBA) value and displays it on the USB UART.
 * @param[in] aqi_uba : AQI-UBA value.
 * @return None.
 * @note None.
 */
void airquality9_display_aqi_uba ( uint8_t aqi_uba );

void application_init ( void )
{
    log_cfg_t log_cfg;  /**< Logger config object. */
    airquality9_cfg_t airquality9_cfg;  /**< Click config object. */

    /** 
     * Logger initialization.
     * Default baud rate: 115200
     * Default log level: LOG_LEVEL_DEBUG
     * @note If USB_UART_RX and USB_UART_TX 
     * are defined as HAL_PIN_NC, you will 
     * need to define them manually for log to work. 
     * See @b LOG_MAP_USB_UART macro definition for detailed explanation.
     */
    LOG_MAP_USB_UART( log_cfg );
    log_init( &logger, &log_cfg );
    log_info( &logger, " Application Init " );

    // Click initialization.
    airquality9_cfg_setup( &airquality9_cfg );
    AIRQUALITY9_MAP_MIKROBUS( airquality9_cfg, MIKROBUS_1 );
    err_t init_flag  = airquality9_init( &airquality9, &airquality9_cfg );
    if ( ( I2C_MASTER_ERROR == init_flag ) || ( SPI_MASTER_ERROR == init_flag ) )
    {
        log_error( &logger, " Communication init." );
        for ( ; ; );
    }
    
    if ( AIRQUALITY9_ERROR == airquality9_default_cfg ( &airquality9 ) )
    {
        log_error( &logger, " Default configuration." );
        for ( ; ; );
    }
    
    log_info( &logger, " Application Task " );
}

void application_task ( void )
{
    if ( airquality9_get_int_pin ( &airquality9 ) )
    {
        uint8_t status, aqi_uba;
        uint16_t tvoc, eco2;
        if ( AIRQUALITY9_OK == airquality9_read_status ( &airquality9, &status ) )
        {
            airquality9_display_status_validity ( status );
        }
        if ( AIRQUALITY9_OK == airquality9_read_tvoc ( &airquality9, &tvoc ) )
        {
            log_printf ( &logger, " TVOC: %u ppb\r\n", tvoc );
        }
        if ( AIRQUALITY9_OK == airquality9_read_eco2 ( &airquality9, &eco2 ) )
        {
            log_printf ( &logger, " ECO2: %u ppm\r\n", eco2 );
        }
        if ( AIRQUALITY9_OK == airquality9_read_aqi_uba ( &airquality9, &aqi_uba ) )
        {
            airquality9_display_aqi_uba ( aqi_uba );
        }
    }
}

int main ( void ) 
{
    /* Do not remove this line or clock might not be set correctly. */
    #ifdef PREINIT_SUPPORTED
    preinit();
    #endif
    
    application_init( );
    
    for ( ; ; ) 
    {
        application_task( );
    }

    return 0;
}

void airquality9_display_status_validity ( uint8_t status )
{
    switch ( status & AIRQUALITY_STATUS_VALID_FLAG_BITS )
    {
        case AIRQUALITY_STATUS_VALID_NORMAL_OP:
        {
            log_printf ( &logger, " Status: Normal operation\r\n" );
            break;
        }
        case AIRQUALITY_STATUS_VALID_WARM_UP:
        {
            log_printf ( &logger, " Status: Warm-Up phase\r\n" );
            break;
        }
        case AIRQUALITY_STATUS_VALID_INIT_START_UP:
        {
            log_printf ( &logger, " Status: Initial Start-Up phase\r\n" );
            break;
        }
        case AIRQUALITY_STATUS_VALID_INVALID:
        {
            log_printf ( &logger, " Status: Invalid output\r\n" );
            break;
        }
    }
}

void airquality9_display_aqi_uba ( uint8_t aqi_uba )
{
    switch ( aqi_uba )
    {
        case AIRQUALITY9_AQI_UBA_EXELLENT:
        {
            log_printf ( &logger, " AQI-UBA Rating: Exellent\r\n" );
            log_printf ( &logger, " Recommendation: Target\r\n" );
            log_printf ( &logger, " Exposure Limit: No limit\r\n\n" );
            break;
        }
        case AIRQUALITY9_AQI_UBA_GOOD:
        {
            log_printf ( &logger, " AQI-UBA Rating: Good\r\n" );
            log_printf ( &logger, " Recommendation: Sufficient ventilation\r\n" );
            log_printf ( &logger, " Exposure Limit: No limit\r\n\n" );
            break;
        }
        case AIRQUALITY9_AQI_UBA_MODERATE:
        {
            log_printf ( &logger, " AQI-UBA Rating: Moderate\r\n" );
            log_printf ( &logger, " Recommendation: Increased ventilation - Search for sources\r\n" );
            log_printf ( &logger, " Exposure Limit: <12 months\r\n\n" );
            break;
        }
        case AIRQUALITY9_AQI_UBA_POOR:
        {
            log_printf ( &logger, " AQI-UBA Rating: Poor\r\n" );
            log_printf ( &logger, " Recommendation: Intensified ventilation - Search for sources\r\n" );
            log_printf ( &logger, " Exposure Limit: <1 month\r\n\n" );
            break;
        }
        case AIRQUALITY9_AQI_UBA_UNHEALTHY:
        {
            log_printf ( &logger, " AQI-UBA Rating: Unhealthy\r\n" );
            log_printf ( &logger, " Recommendation: Use only if unavoidable - Intensified ventilation\r\n" );
            log_printf ( &logger, " Exposure Limit: No limit\r\n\n" );
            break;
        }
        default:
        {
            log_printf ( &logger, " AQI-UBA Rating: Unknown\r\n\n" );
            break;
        }
    }
}

// ------------------------------------------------------------------------ END

额外支持

资源

喜欢这个项目吗?

'购买此套件' 按钮会直接带您进入购物车,您可以在购物车中轻松添加或移除产品。