Funpack4-1 基于CY8CKIT-149的滑动条和按键状态采集与BLE手机控制
该项目使用了CY8CKIT-149开发套件的采集滑动条和按键状态以及BLE模块,C语言,Java语言,实现了控制手机相关功能的设计,它的主要功能为:调节手机音量控制(根据按键状态,滑动条上下调整)/屏幕亮度(根据按键状态,滑动条上下调整)/上下翻页(根据按键状态,按键操作上下调整),三个按键分别控制不同的对象。
标签
嵌入式系统
Funpack活动
开发板
小月月
更新2025-04-08
28

Funpack4-1 - 基于CY8CKIT-149开发套件实现调节手机音量控制/屏幕亮度/上下翻页

一、项目介绍

Funpack活动是硬禾学堂联合DigiKey发起的玩成功就全额退活动。前三季活动已圆满结束,现在迎来第四季,本季共3期。每期活动会推出多款全球顶级半导体厂商的开发板/仪器套件,参与者可从中任选一款并通过指定得捷购购买板卡,并在规定时间内完成指定任务,就可以获得购板返还,项目优秀者另有额外奖励。

 

本项目基于CY8CKIT-149开发套件采集滑动条和按键状态,实现使用BLE连接并调节手机音量控制(根据按键状态,滑动条上下调整)/屏幕亮度(根据按键状态,滑动条上下调整)/上下翻页(根据按键状态,按键操作上下调整),三个按键分别控制不同的对象。

硬件介绍

CY8CKIT-149PSoC™ 4100S Plus 原型开发套件,用户能够通过该款板卡来评估PSoC™ 4100S Plus 器件。 PSoC™ 4100S Plus 器件是英飞凌的 PSoC™ 4,具有一个 Arm Cortex-M0+ 内核和高达 128KB 闪存、16KB SRAM9 个可编程模拟块、13 个可编程数字块以及 54 个通用 I/O,包括 24 个智能 I/O

 

它还采用英飞凌第四代低功耗 CAPSENSE™ 解决方案,超可靠的低功耗电容式感应解决方案,可在嘈杂环境和液体中 "正常工作"。 该套件使您能够使用两块电容式电路板快速评估和开发 CAPSENSE™,其中一块具有三个电容式按钮,另一块具有一个六段电容式滑块,这两块电路板都能够对按钮进行自电容式感应和互电容式感应。

1.1CY8CKIT-149的结构框图:


image.png



1.2任务二具体如下

交互。采集滑动条和按键状态,使用BLE连接并调节手机或电脑音量控制/屏幕亮度/上下翻页,要求三个按键分别控制不同的对象

设计思路实现步骤如下:

硬件设计

(一)滑动条与按键连接

  1. 滑动条 :将滑动条的一端连接至 CY8CKIT-149 开发套件的 ADC(模数转换器)输入引脚,另一端接地。滑动条本质上是一个可变电阻,通过改变接触点位置,改变电阻值,进而改变输入到 ADC 的模拟电压值。开发套件的 ADC 将采集到的模拟电压转换为数字信号,用于后续处理
  2. 按键 :三个按键分别连接至开发套件的不同 GPIO(通用输入输出)引脚。按键一端连接 VCC,另一端连接 GPIO 引脚,并通过内部或外部上拉 / 下拉电阻实现按键状态的稳定读取。当按键按下时,对应的 GPIO 引脚电平会发生变化,从而被开发套件检测到按键动作

(二)BLE 模块连接

CY8CKIT-149 开发套件本身集成 BLE 功能。通过配置开发套件内部的 BLE 控制器和协议栈,使其能够与 Android 手机建立 BLE 连接。确保开发套件的 BLE 天线布局合理,以获得良好的无线信号传输效果

软件设计

(一)状态采集与处理

  1. 滑动条状态采集 :定期读取 ADC 转换结果,获取滑动条的模拟电压值,并将其映射到相应的控制范围。例如,将采集到的电压值转换为 0 - 100 的百分比数值,用于表示音量大小、屏幕亮度等级或翻页进度等。
  2. 按键状态采集 :通过检测 GPIO 引脚的电平变化,判断按键是否被按下。采用去抖动算法,避免因按键机械抖动导致的误判。根据按键的按下组合和顺序,确定当前需要控制的对象(音量、屏幕亮度或翻页)。

(二)BLE 通信协议设计

  1. 服务与特征定义 :在开发套件中创建自定义的 BLE 服务,用于传输控制指令。定义不同的特征,分别对应音量控制、屏幕亮度控制和翻页控制。每个特征包含控制数据,如滑动条的调节值和按键操作信息等。
  2. 数据打包与传输 :将采集到的滑动条状态和按键状态按照预定义的格式打包成数据帧,通过 BLE 发送至 Android 手机。确保数据传输的可靠性和完整性,采用必要的错误检测和纠正机制。

(三)手机端应用设计

  1. BLE 连接管理 :开发 Android 应用程序,实现与 CY8CKIT-149 开发套件的 BLE 扫描、连接和断开功能。在连接建立后,发现开发套件提供的自定义服务和特征,以便进行数据交互。
  2. 控制指令解析与执行 :接收来自开发套件的 BLE 数据,解析其中的控制指令。根据指令类型和内容,调用手机系统的相关 API 进行音量调节、屏幕亮度调整或翻页操作。例如,通过 Android AudioManager 调节音量,通过 Settings.System 调整屏幕亮度,通过发送模拟按键事件实现翻页。

架构设计

(一)分层架构

  1. 硬件层 :包括 CY8CKIT-149 开发套件、滑动条和按键等硬件设备,负责物理信号的采集和传输。
  2. 驱动层 :提供对硬件设备的驱动支持,如 ADC 驱动、GPIO 驱动和 BLE 驱动等,实现硬件与上层软件的交互。
  3. 应用层 :运行在开发套件上的主程序,负责状态采集、数据处理和 BLE 通信控制。同时,手机端的应用程序也属于应用层,用于接收指令并执行相应的控制操作。

(二)通信架构

  1. 本地通信 :在开发套件内部,通过 ADC GPIO 接口实现滑动条和按键状态的采集,通过内部总线进行数据传输和处理。
  2. 无线通信 :开发套件与 Android 手机之间通过 BLE 进行无线通信,采用主从模式,开发套件作为从设备,手机作为主设备,进行数据交互。


  也就是说主要分2块,1PSoC® Creator™写板子的蓝牙代码。2Android studio Android手机的开发代码。接下来我将会带大家一步步的复刻这个工程

一、开发环境的搭建

前言

PSoC® Creator™ 是一种集成设计环境 (IDE),它可以用于设计使用 Cypress PSoC 4PSoC 5LP PSoC 6 MCU 系列的系统级芯片 (SoC) 应用。本篇将进行PSoC® Creator 安装过程讲解。

1. 下载软件
 www.cypress.com/psoccreator 下载 PSoC Creator,或从套件 CD 安装。有关功能、系统要求和安装说明,请参考在 http://www.cypress.com/products/psoc-creator-integrated-design-environment-ide 上的发行说明。

点选Download



点选目前最新的版本跟选取适合安装系统的环境,点击Download


点击下载完后执行它

2.开始安装软体
执行档案后会要求权限控制,请选“是”

之后请确定好安装目录即可按下一步

若硬盘空间够可以选择完整安装,要不然使用预设即可

同意授权及点击下一步

同上,同意授权及点击下一步

等待安装好后

按完成结束安装并启动

这里跳出注册的视窗,若有要注册可输入后按下注册,若没有想要注册可按稍后注册

以及会跳出检查你目前的版本是不是最新的,若有需求可视情况按下更新及下载



3.安装完成
看到此画面,就代表安装完成,接下来会在下一篇讲到的如何使用PSoC Creator



参考资料
Infineon-PSoC_Creator_Quick_Start_Guide-UserManual-v18_00-EN

软件流程图及各功能对应的主要代码片段及说明

PSoC® Creator™CY8CKIT-149 开发套件的蓝牙I2C处理滑动条与按键流程图


image.png



主要代码片段说明:

1. main.c中的主循环,负责初始化系统、处理BLE事件和CapSense数据;

2. HandleCapSense函数,通过I2C读取从设备数据并处理滑块和按钮状态

3. BLEApplications.c中的通知发送函数,包括SendDataOverCapSenseSliderNotificationSendDataOverCapSenseButtonNotification,用于将数据通过BLE发送给客户端。这些代码实现了基于PSoC平台的BLE外设功能,通过I2C读取触摸传感器数据并通过BLE发送给中心设备。


系统初始化、BLE事件处理和CapSense数据处理的主要流程的代码实现:

int main()
{
InitializeSystem(); // 初始化系统资源和外设等
for(;;) // 主循环,程序一直运行
{
CyBle_ProcessEvents(); // 处理蓝牙低功耗(BLE)事件,维持BLE通信

// 检查设备是否已连接
if(TRUE == deviceConnected)
{
// 检查BLE子系统状态是否达到生态稳定(可正常通信)
if(CYBLE_BLESS_STATE_ECO_STABLE == CyBle_GetBleSsState())
{
HandleCapSense(); // 处理电容感应相关操作
}
}
}
}

通过I2C读取CapSense数据,并在数值发生变化时通过BLE发送通知的代码实现

void HandleCapSense(void)
{
static uint8 sliderValue = 0; // 当前滑块值,静态变量用于保持状态
static uint8 prevSliderValue = 0; // 上一次滑块值,用于比较变化
static uint8 buttonValue[3]; // 按钮值数组,存储三个按钮的状态
static uint8 prevButtonStat = 0; // 上一次按钮状态,用于比较变化

// 通过I2C从指定从机地址读取数据到i2cBuffer缓冲区
I2CHW_I2CMasterReadBuf(I2C_SLAVE_ADDRESS, i2cBuffer, I2C_BUF_SIZE,
I2CHW_I2C_MODE_COMPLETE_XFER);

// 检查是否启用了滑块通知(通过startNotification标志和掩码判断)
if(startNotification & SLIDER_CCCD_NTF_BIT_MASK)
{

sliderValue = i2cBuffer[0];

// 如果滑块值发生变化
if(prevSliderValue != sliderValue)
{
// 通过通知机制发送滑块值数据
SendDataOverCapSenseSliderNotification(sliderValue);
}


prevSliderValue = sliderValue;
}
}

手机端应用设计:

流程图如下(IDE:android studio):


image.png



主要功能实现如下:

 

1. BLE连接处理:在BluetoothLeService中处理BLE连接状态和数据接收,通过ACTION_DATA_AVAILABLE广播传递数据

2. 按键状态处理:在CapsenseServiceButtons中通过BroadcastReceiver接收按键数据,并更新UI显示

3. 功能控制:在CapsenseServiceSlider中根据滑动值和按键状态分别实现:

   屏幕亮度控制:通过Settings.System.putInt修改系统亮度设置

   音量控制:通过AudioManager调节系统音量

   页面滚动:通过ScrollView实现页面上下滚动



音量控制:在CapsenseServiceSlider中使用AudioManager,将滑动值映射到系统音量范围,通过setStreamVolume设置

// 获取系统音频服务

AudioManager audioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);

 
// 将0-100的滑动值映射到实际音量范围(0-15)

int maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);

int targetVolume = (int) Math.round((sliderValue / 100.0) * maxVolume);

 

// 设置系统音量(FLAG_SHOW_UI显示系统音量条)

audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,

    targetVolume,

    AudioManager.FLAG_SHOW_UI);

// 更新UI显示
mTvSliderValue.setText(String.format("音量等级: %d/%d", targetVolume, maxVolume));


亮度调节:结合Settings.System.putInt修改系统亮度值,同时通过WindowManager更新当前窗口参数

// 将滑动值转换为亮度百分比(0-100)

int brightness = (int) (sliderValue * 2.55);

 

// 修改系统亮度设置

Settings.System.putInt(getActivity().getContentResolver(),

    Settings.System.SCREEN_BRIGHTNESS,

    brightness);

 

// 更新当前窗口亮度

Window window = getActivity().getWindow();

WindowManager.LayoutParams layoutParams = window.getAttributes();

layoutParams.screenBrightness = brightness / 255.0f;

window.setAttributes(layoutParams);

 

// 更新UI显示

mTvSliderValue.setText(String.format("亮度: %d%%", sliderValue));


页面滚动:在CapSenseButtonsGridAdapter中检测按钮按压状态,调用scrollView.fullScroll实现页面滚动

// 按钮状态检测(0-上翻页,1/2-下翻页)

if (button_value == 0) {

    mScrollView.post(() ->

        mScrollView.fullScroll(ScrollView.FOCUS_UP));

} else if (button_value == 1 || button_value == 2) {

    mScrollView.post(() ->

        mScrollView.fullScroll(ScrollView.FOCUS_DOWN));

}

 

// 按钮状态共享(跨类访问)

public static void updateButtonValue(int value) {

    button_value = value;

}


BLE数据接收处理和数据共享:通过静态变量button_value跨类传递按钮状态,使用Handler定时轮询更新状态

// 接收滑动值数据包(0x10类型为滑动数据)

if (characteristic.getUuid().equals(CAPSENSE_SLIDER_CHAR_UUID)) {

    int sliderValue = characteristic.getValue()[1] & 0xFF;

   
    // 根据当前模式分发控制指令

    switch (ControlModeManager.getCurrentMode()) {

        case VOLUME_MODE:

            handleVolumeControl(sliderValue);

            break;

        case BRIGHTNESS_MODE:

            handleBrightnessControl(sliderValue);

            break;

    }

}


// 接收按钮状态数据包(0x20类型为按钮数据)

else if (characteristic.getUuid().equals(CAPSENSE_BUTTONS_CHAR_UUID)) {

    int buttonState = characteristic.getValue()[1] & 0xFF;

    CapSenseButtonsGridAdapter.updateButtonValue(buttonState);

}


数据共享的关键代码如下:

//CapSenseButtonsGridAdapter.java中定义静态变量和方法:

public static int button_value = -1;  // 存储当前触摸的按钮位置

 

public static int getButtonValue() {  // 获取按钮值的静态方法

    return button_value;

}

 

private void updateButtonValue(TextView tvValue, boolean isPressed, int position) {

    if (isPressed) {

        button_value = position;  // 更新按钮位置

    }

}



功能展示图片及说明:

040c51cc6797268d22eaadc0d8352b7.jpg

(滑条检测页面)

75475456906063b7acf44b49af7dd0f.jpg

(按钮检测页面,触摸提示+翻页功能)

71039de389757b6a1b6c70f200e903d.jpg

(按键+滑条 蓝牙联动效果展示)

项目中遇到的难题和解决方法

1.     BLE数据同步失败问题 解决方法:通过HandlerBroadcastReceiver实现数据实时更新,确保UI显示与实际状态同步;

2. 音量控制、屏幕亮度权限控制无效 解决方法:Android版本不同,需要动态申请音量控制、屏幕亮度修改等系统权限,采用运行时权限检查机制;

3. 2个界面activity数据不通 解决方法:使用静态变量和Handler定时器在不同类之间共享按键状态,保证数据一致性.

4. 滑动值映射失灵 解决方法:0-100的滑动值合理映射到系统音量和亮度范围,实现平滑过渡

5. app闪退,功能异常处理 解决方法:针对设备断连、权限拒绝等异常情况添加完善的错误处理和用户提示

 

对本活动的心得体会

通过使用CY8CKIT-149开发套件,我对硬件开发有了更直观的认识.以前虽然学过硬件相关知识,但实际操作中还是遇到了不少问题,比如滑动条与按键状态采集,与手机的BLE连接,虽然开发套件有基础文档,但对于一些复杂功能的实现,比如BLE高级应用、与其他传感器的集成等,缺乏详细的指导.建议活动组织方可以组织技术专家或有经验的开发者,制作更深入、更全面的技术文档和视频教程,帮助参与者更好地理解和使用开发套件。例如,制作一个关于CY8CKIT-149开发套件在物联网应用中的高级功能开发教程,让参与者能够深入挖掘开发套件的潜力



附件下载
CE210709_EZ-BLE_Peripheral01.zip
psoc 蓝牙模块I2C
团队介绍
你可以回到过去,但那里已空无一人。
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号