初学者
10 分钟

使用 IQS323 和 STM32L496AG 实现电容滑动界面

面向嵌入式系统的直观、低功耗手势控制的电容滑动解决方案

Cap Slider 3 Click with Discovery kit with STM32L496AG MCU

已发布 8月 13, 2025

点击板

Cap Slider 3 Click

开发板

Discovery kit with STM32L496AG MCU

编译器

NECTO Studio

微控制器单元

STM32L496AG

电容滑动手势检测,具备超低功耗运行与抗噪性能,实现直观的触控控制体验

A

A

硬件概览

它是如何工作的?

Cap Slider 3 Click 基于 Azoteq 的 IQS323,这是一款高度灵活的 ProxFusion® 传感融合芯片,专为为各种基于触控的控制应用提供可靠的电容滑动界面而设计。板子正面集成了一个大型传感器区域,支持直观的滑动手势,带来流畅的用户体验。IQS323 通过标准 I2C 接口与主控通信,并在芯片内完成所有处理,即使在超低功耗模式下也能高效运行。其集成功能包括自动调谐,以在不同环境条件下实现最佳灵敏度,先进的噪声过滤以确保稳定读数,以及通过参考通道支持差分测量来提高检测精度。IQS323 还集成了消抖和迟滞机制以防止误触发,同时支持双向触发指示,能清晰识别上下两个方向的滑动手势。此外,

IQS323 支持极大降低功耗的 Halt 模式,以及智能平衡响应时间与能效的分布式超低功耗(ULP)模式。得益于这些功能,Cap Slider 3 Click 非常适合需要稳健、低功耗触控或接近检测界面的应用,如健身手环、智能手表等可穿戴设备、佩戴检测机制、SAR(比吸收率)安全传感器,以及电池供电系统中的唤醒按键。如前所述,该 Click 板包含一个三段式电容滑动传感器,可检测向上或向下的滑动动作,并配有两个 LED 指示灯(TOUCH 和 PWR)。这两个元件位于板子正面,使其支持覆盖一层保护性亚克力面板。当滑动区域检测到触控事件时,TOUCH 指示灯将切换状态,以表明有通道被激活,精确地反映触控

发生在哪一段区域。Cap Slider 3 Click 通过标准的 I2C 双线接口与主控 MCU 通信,通信时钟频率最高可达 1MHz,并可通过软件寄存器进行调整。此外,它还提供一个额外的就绪信号,通过 mikroBUS™ 插座上的 RDY 引脚传出,用以指示有新数据可供通信窗口读取,便于系统实现快速响应。因此,建议将 INT 引脚用作通信触发器以获得最佳响应速率。该 Click 板仅支持 3.3V 逻辑电压,若与其他逻辑电平的 MCU 搭配使用,必须先进行适当的电平转换。此 Click 板还配套提供了驱动库和示例代码,可作为后续开发的参考。

Cap Slider 3 Click hardware overview image

功能概述

开发板

32L496GDISCOVERY Discovery 套件是一款功能全面的演示和开发平台,专为搭载 Arm® Cortex®-M4 内核的 STM32L496AG 微控制器设计。该套件适用于需要在高性能、先进图形处理和超低功耗之间取得平衡的应用,支持无缝原型开发,适用于各种嵌入式解决方案。STM32L496AG 采用创新的节能架构,集成

了扩展 RAM 和 Chrom-ART 图形加速器,在提升图形性能的同时保持低功耗,使其特别适用于音频处理、图形用户界面和实时数据采集等对能效要求较高的应用。为了简化开发流程,该开发板配备了板载 ST-LINK/V2-1 调试器/编程器,提供即插即用的调试和编程体验,使用户无需额外硬件即可轻松加载、调

试和测试应用程序。凭借低功耗特性、增强的内存能力以及内置调试工具,32L496GDISCOVERY 套件是开发先进嵌入式系统、实现高效能解决方案的理想选择。

Discovery kit with STM32L496AG MCU double side image

微控制器概述 

MCU卡片 / MCU

STM32L496AG Image

建筑

ARM Cortex-M4

MCU 内存 (KB)

1024

硅供应商

STMicroelectronics

引脚数

169

RAM (字节)

327680

使用的MCU引脚

mikroBUS™映射器

NC
NC
AN
NC
NC
RST
ID COMM
PG11
CS
NC
NC
SCK
NC
NC
MISO
NC
NC
MOSI
Power Supply
3.3V
3.3V
Ground
GND
GND
Data Ready Indicator
PA0
PWM
NC
NC
INT
NC
NC
TX
NC
NC
RX
I2C Clock
PB8
SCL
I2C Data
PB7
SDA
NC
NC
5V
Ground
GND
GND
1

“仔细看看!”

Click board™ 原理图

Cap Slider 3 Click Schematic schematic

一步一步来

项目组装

Discovery kit with STM32H750XB MCU front image hardware assembly

从选择您的开发板和Click板™开始。以Discovery kit with STM32L496AG MCU作为您的开发板开始。

Discovery kit with STM32H750XB MCU front image hardware assembly
Thermo 21 Click front image hardware assembly
Prog-cut hardware assembly
Thermo 21 Click complete accessories setup image hardware assembly
Board mapper by product7 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
Discovery kit with STM32H750XB MCU NECTO MCU Selection Step hardware assembly
Necto No Display image step 8 hardware assembly
Necto image step 9 hardware assembly
Necto image step 10 hardware assembly
Necto image step 11 hardware assembly

实时跟踪您的结果

应用程序输出

1. 应用程序输出 - 在调试模式下,“应用程序输出”窗口支持实时数据监控,直接提供执行结果的可视化。请按照提供的教程正确配置环境,以确保数据正确显示。

2. UART 终端 - 使用UART Terminal通过USB to UART converter监视数据传输,实现Click board™与开发系统之间的直接通信。请根据项目需求配置波特率和其他串行设置,以确保正常运行。有关分步设置说明,请参考提供的教程

3. Plot 输出 - Plot功能提供了一种强大的方式来可视化实时传感器数据,使趋势分析、调试和多个数据点的对比变得更加直观。要正确设置,请按照提供的教程,其中包含使用Plot功能显示Click board™读数的分步示例。在代码中使用Plot功能时,请使用以下函数:plot(insert_graph_name, variable_name);。这是一个通用格式,用户需要将“insert_graph_name”替换为实际图表名称,并将“variable_name”替换为要显示的参数。

软件支持

库描述

Cap Slider 3 Click 演示应用程序使用 NECTO Studio开发,确保与 mikroSDK 的开源库和工具兼容。该演示设计为即插即用,可与所有具有 mikroBUS™ 插座的 开发板、入门板和 mikromedia 板完全兼容,用于快速实现和测试。

示例描述
本示例展示了如何使用 Cap Slider 3 Click 板,通过初始化设备并读取当前滑动位置,实现滑动检测功能。应用程序会实时记录检测到的滑动位置。

关键功能:

  • capslider3_cfg_setup - 初始化 Click 配置结构体为默认值。

  • capslider3_init - 初始化此 Click 板所需的所有引脚和外设。

  • capslider3_default_cfg - 执行 Cap Slider 3 Click 板的默认配置。

  • capslider3_read_data - 从 Click 板读取各种系统信息和传感器数据。

应用初始化
初始化日志记录器和 Cap Slider 3 Click 驱动程序。

应用任务
持续读取并记录由 Cap Slider 3 Click 检测到的滑动位置。

开源

代码示例

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

/*!
 * @file main.c
 * @brief Cap Slider 3 Click example
 *
 * # Description
 * This example demonstrates the use of the Cap Slider 3 Click board by initializing
 * the device and reading the current slider position. The application logs the detected
 * slider position in real-time.
 *
 * The demo application is composed of two sections:
 *
 * ## Application Init
 * Initializes the logger and the Cap Slider 3 Click driver.
 *
 * ## Application Task
 * Continuously reads and logs the slider position detected by the Cap Slider 3 Click board.
 * 
 * @note
 * Functions for logging gestures and statuses are available but not used in this example.
 *
 * @author Stefan Filipovic
 *
 */


#include "board.h"
#include "log.h"
#include "capslider3.h"

static capslider3_t capslider3;
static log_t logger;

/**
 * @brief Cap Slider 3 log status function.
 * @details This function logs the power mode, touch, and proximity status of the Cap Slider 3 Click board.
 * @param[in] status : Status data to be logged (sys_info.sys_status).
 * @note None.
 */
static void capslider3_log_status ( uint16_t status );

/**
 * @brief Cap Slider 3 log gesture function.
 * @details This function logs the detected gestures of the Cap Slider 3 Click board.
 * @param[in] gesture : Gesture data to be logged (sys_info.gestures).
 * @note None.
 */
static void capslider3_log_gesture ( uint16_t gesture );

void application_init ( void ) 
{
    log_cfg_t log_cfg;  /**< Logger config object. */
    capslider3_cfg_t capslider3_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.
    capslider3_cfg_setup( &capslider3_cfg );
    CAPSLIDER3_MAP_MIKROBUS( capslider3_cfg, MIKROBUS_1 );
    if ( I2C_MASTER_ERROR == capslider3_init( &capslider3, &capslider3_cfg ) ) 
    {
        log_error( &logger, " Communication init." );
        for ( ; ; );
    }
    
    if ( CAPSLIDER3_ERROR == capslider3_default_cfg ( &capslider3 ) )
    {
        log_error( &logger, " Default configuration." );
        for ( ; ; );
    }
    
    log_info( &logger, " Application Task " );
}

void application_task ( void ) 
{
    capslider3_data_t sys_info;
    if ( CAPSLIDER3_OK == capslider3_read_data ( &capslider3, &sys_info ) )
    {
        if ( CAPSLIDER3_SLIDER_IDLE != sys_info.slider )
        {
            log_printf ( &logger, " Slider: - %u -\r\n\n", sys_info.slider );
        }
    }
}

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;
}

static void capslider3_log_status ( uint16_t status )
{
    log_printf ( &logger, "--- STATUS ---\r\n" );
    log_printf ( &logger, " Power mode: " );
    switch ( status & CAPSLIDER3_SYSTEM_STATUS_POWER_MODE_MASK )
    {
        case CAPSLIDER3_SYSTEM_STATUS_POWER_MODE_NORMAL:
        {
            log_printf ( &logger, "NORMAL" );
            break;
        }
        case CAPSLIDER3_SYSTEM_STATUS_POWER_MODE_LP:
        {
            log_printf ( &logger, "LOW POWER" );
            break;
        }
        case CAPSLIDER3_SYSTEM_STATUS_POWER_MODE_ULP:
        {
            log_printf ( &logger, "ULTRA LOW POWER" );
            break;
        }
        case CAPSLIDER3_SYSTEM_STATUS_POWER_MODE_HALT:
        {
            log_printf ( &logger, "HALT" );
            break;
        }
        default:
        {
            break;
        }
    }

    log_printf ( &logger, "\r\n Channels in Touch: - " );
    if ( status & ( CAPSLIDER3_SYSTEM_STATUS_CH0_TOUCH | 
                    CAPSLIDER3_SYSTEM_STATUS_CH1_TOUCH | 
                    CAPSLIDER3_SYSTEM_STATUS_CH2_TOUCH ) )
    {
        if ( status & CAPSLIDER3_SYSTEM_STATUS_CH0_TOUCH )
        {
            log_printf ( &logger, "0 - " );
        }
        if ( status & CAPSLIDER3_SYSTEM_STATUS_CH1_TOUCH )
        {
            log_printf ( &logger, "1 - " );
        }
        if ( status & CAPSLIDER3_SYSTEM_STATUS_CH2_TOUCH )
        {
            log_printf ( &logger, "2 - " );
        }  
    }
    else
    {
        log_printf ( &logger, "NONE - " );
    }

    log_printf ( &logger, "\r\n Channels in Prox: - " );
    if ( status & ( CAPSLIDER3_SYSTEM_STATUS_CH0_PROX | 
                    CAPSLIDER3_SYSTEM_STATUS_CH1_PROX | 
                    CAPSLIDER3_SYSTEM_STATUS_CH2_PROX ) )
    {
        if ( status & CAPSLIDER3_SYSTEM_STATUS_CH0_PROX )
        {
            log_printf ( &logger, "0 - " );
        }
        if ( status & CAPSLIDER3_SYSTEM_STATUS_CH1_PROX )
        {
            log_printf ( &logger, "1 - " );
        }
        if ( status & CAPSLIDER3_SYSTEM_STATUS_CH2_PROX )
        {
            log_printf ( &logger, "2 - " );
        }  
    }
    else
    {
        log_printf ( &logger, "NONE - " );
    }
    log_printf ( &logger, "\r\n" );
}

static void capslider3_log_gesture ( uint16_t gesture )
{
    static uint16_t gesture_type_old = 0;
    uint16_t gesture_type = 0;
    if ( gesture & CAPSLIDER3_GESTURES_TAP )
    {
        gesture_type = CAPSLIDER3_GESTURES_TAP;
    }
    else if ( gesture & CAPSLIDER3_GESTURES_FLICK_POS )
    {
        gesture_type = CAPSLIDER3_GESTURES_FLICK_POS;
    }
    else if ( gesture & CAPSLIDER3_GESTURES_FLICK_NEG )
    {
        gesture_type = CAPSLIDER3_GESTURES_FLICK_NEG;
    }
    else if ( gesture & CAPSLIDER3_GESTURES_SWIPE_POS )
    {
        gesture_type = CAPSLIDER3_GESTURES_SWIPE_POS;
    }
    else if ( gesture & CAPSLIDER3_GESTURES_SWIPE_NEG )
    {
        gesture_type = CAPSLIDER3_GESTURES_SWIPE_NEG;
    }
    else if ( gesture & CAPSLIDER3_GESTURES_HOLD )
    {
        gesture_type = CAPSLIDER3_GESTURES_HOLD;
    }
    else if ( gesture & CAPSLIDER3_GESTURES_EVENT )
    {
        gesture_type = CAPSLIDER3_GESTURES_EVENT;
    }
    else if ( gesture & CAPSLIDER3_GESTURES_BUSY )
    {
        gesture_type = CAPSLIDER3_GESTURES_BUSY;
    }
    
    if ( gesture_type_old != gesture_type )
    {
        log_printf ( &logger, " Gesture: - " );
        if ( gesture_type & CAPSLIDER3_GESTURES_TAP )
        {
            log_printf ( &logger, "TAP" );
        }
        else if ( gesture_type & CAPSLIDER3_GESTURES_FLICK_POS )
        {
            log_printf ( &logger, "FLICK POSITIVE" );
        }
        else if ( gesture_type & CAPSLIDER3_GESTURES_FLICK_NEG )
        {
            log_printf ( &logger, "FLICK NEGATIVE" );
        }
        else if ( gesture_type & CAPSLIDER3_GESTURES_SWIPE_POS )
        {
            log_printf ( &logger, "SWIPE POSITIVE" );
        }
        else if ( gesture_type & CAPSLIDER3_GESTURES_SWIPE_NEG )
        {
            log_printf ( &logger, "SWIPE NEGATIVE" );
        }
        else if ( gesture_type & CAPSLIDER3_GESTURES_HOLD )
        {
            log_printf ( &logger, "HOLD" );
        }
        else if ( gesture_type & CAPSLIDER3_GESTURES_EVENT )
        {
            log_printf ( &logger, "EVENT" );
        }
        else if ( gesture_type & CAPSLIDER3_GESTURES_BUSY )
        {
            log_printf ( &logger, "BUSY" );
        }
        else
        {
            log_printf ( &logger, "NONE" );
        }
        log_printf ( &logger, " -\r\n" );
        gesture_type_old = gesture_type;
    }
}

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

额外支持

资源

喜欢这个项目吗?

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