Funpack4-1 - 基于CY8CKIT-149开发套件实现调节手机音量控制/屏幕亮度/上下翻页
一、项目介绍
Funpack活动是硬禾学堂联合DigiKey发起的“玩成功就全额退”活动。前三季活动已圆满结束,现在迎来第四季,本季共3期。每期活动会推出多款全球顶级半导体厂商的开发板/仪器套件,参与者可从中任选一款并通过指定“得捷购”购买板卡,并在规定时间内完成指定任务,就可以获得购板返还,项目优秀者另有额外奖励。
本项目基于CY8CKIT-149开发套件采集滑动条和按键状态,实现使用BLE连接并调节手机音量控制(根据按键状态,滑动条上下调整)/屏幕亮度(根据按键状态,滑动条上下调整)/上下翻页(根据按键状态,按键操作上下调整),三个按键分别控制不同的对象。
二 、硬件介绍
CY8CKIT-149是PSoC™ 4100S Plus 原型开发套件,用户能够通过该款板卡来评估PSoC™ 4100S Plus 器件。 PSoC™ 4100S Plus 器件是英飞凌的 PSoC™ 4,具有一个 Arm Cortex-M0+ 内核和高达 128KB 闪存、16KB SRAM、9 个可编程模拟块、13 个可编程数字块以及 54 个通用 I/O,包括 24 个智能 I/O。
它还采用英飞凌第四代低功耗 CAPSENSE™ 解决方案,超可靠的低功耗电容式感应解决方案,可在嘈杂环境和液体中 "正常工作"。 该套件使您能够使用两块电容式电路板快速评估和开发 CAPSENSE™,其中一块具有三个电容式按钮,另一块具有一个六段电容式滑块,这两块电路板都能够对按钮进行自电容式感应和互电容式感应。
1.1CY8CKIT-149的结构框图:
1.2任务二具体如下
•交互。采集滑动条和按键状态,使用BLE连接并调节手机或电脑音量控制/屏幕亮度/上下翻页,要求三个按键分别控制不同的对象
三、设计思路实现步骤如下:
硬件设计
(一)滑动条与按键连接
- 滑动条 :将滑动条的一端连接至 CY8CKIT-149 开发套件的 ADC(模数转换器)输入引脚,另一端接地。滑动条本质上是一个可变电阻,通过改变接触点位置,改变电阻值,进而改变输入到 ADC 的模拟电压值。开发套件的 ADC 将采集到的模拟电压转换为数字信号,用于后续处理
- 按键 :三个按键分别连接至开发套件的不同 GPIO(通用输入输出)引脚。按键一端连接 VCC,另一端连接 GPIO 引脚,并通过内部或外部上拉 / 下拉电阻实现按键状态的稳定读取。当按键按下时,对应的 GPIO 引脚电平会发生变化,从而被开发套件检测到按键动作
(二)BLE 模块连接
CY8CKIT-149 开发套件本身集成 BLE 功能。通过配置开发套件内部的 BLE 控制器和协议栈,使其能够与 Android 手机建立 BLE 连接。确保开发套件的 BLE 天线布局合理,以获得良好的无线信号传输效果
软件设计
(一)状态采集与处理
- 滑动条状态采集 :定期读取 ADC 转换结果,获取滑动条的模拟电压值,并将其映射到相应的控制范围。例如,将采集到的电压值转换为 0 - 100 的百分比数值,用于表示音量大小、屏幕亮度等级或翻页进度等。
- 按键状态采集 :通过检测 GPIO 引脚的电平变化,判断按键是否被按下。采用去抖动算法,避免因按键机械抖动导致的误判。根据按键的按下组合和顺序,确定当前需要控制的对象(音量、屏幕亮度或翻页)。
(二)BLE 通信协议设计
- 服务与特征定义 :在开发套件中创建自定义的 BLE 服务,用于传输控制指令。定义不同的特征,分别对应音量控制、屏幕亮度控制和翻页控制。每个特征包含控制数据,如滑动条的调节值和按键操作信息等。
- 数据打包与传输 :将采集到的滑动条状态和按键状态按照预定义的格式打包成数据帧,通过 BLE 发送至 Android 手机。确保数据传输的可靠性和完整性,采用必要的错误检测和纠正机制。
(三)手机端应用设计
- BLE 连接管理 :开发 Android 应用程序,实现与 CY8CKIT-149 开发套件的 BLE 扫描、连接和断开功能。在连接建立后,发现开发套件提供的自定义服务和特征,以便进行数据交互。
- 控制指令解析与执行 :接收来自开发套件的 BLE 数据,解析其中的控制指令。根据指令类型和内容,调用手机系统的相关 API 进行音量调节、屏幕亮度调整或翻页操作。例如,通过 Android 的 AudioManager 调节音量,通过 Settings.System 调整屏幕亮度,通过发送模拟按键事件实现翻页。
架构设计
(一)分层架构
- 硬件层 :包括 CY8CKIT-149 开发套件、滑动条和按键等硬件设备,负责物理信号的采集和传输。
- 驱动层 :提供对硬件设备的驱动支持,如 ADC 驱动、GPIO 驱动和 BLE 驱动等,实现硬件与上层软件的交互。
- 应用层 :运行在开发套件上的主程序,负责状态采集、数据处理和 BLE 通信控制。同时,手机端的应用程序也属于应用层,用于接收指令并执行相应的控制操作。
(二)通信架构
- 本地通信 :在开发套件内部,通过 ADC 和 GPIO 接口实现滑动条和按键状态的采集,通过内部总线进行数据传输和处理。
- 无线通信 :开发套件与 Android 手机之间通过 BLE 进行无线通信,采用主从模式,开发套件作为从设备,手机作为主设备,进行数据交互。
也就是说主要分2块,1:PSoC® Creator™写板子的蓝牙代码。2:Android studio 写Android手机的开发代码。接下来我将会带大家一步步的复刻这个工程
一、开发环境的搭建
前言
PSoC® Creator™ 是一种集成设计环境 (IDE),它可以用于设计使用 Cypress 的 PSoC 4、PSoC 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处理滑动条与按键流程图
主要代码片段说明:
1. main.c中的主循环,负责初始化系统、处理BLE事件和CapSense数据;
2. HandleCapSense函数,通过I2C读取从设备数据并处理滑块和按钮状态
3. BLEApplications.c中的通知发送函数,包括SendDataOverCapSenseSliderNotification和SendDataOverCapSenseButtonNotification,用于将数据通过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):
主要功能实现如下:
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; // 更新按钮位置
}
}
功能展示图片及说明:
(滑条检测页面)
(按钮检测页面,触摸提示+翻页功能)
(按键+滑条 蓝牙联动效果展示)
项目中遇到的难题和解决方法
1. BLE数据同步失败问题 解决方法:通过Handler和BroadcastReceiver实现数据实时更新,确保UI显示与实际状态同步;
2. 音量控制、屏幕亮度权限控制无效 解决方法:Android版本不同,需要动态申请音量控制、屏幕亮度修改等系统权限,采用运行时权限检查机制;
3. 2个界面activity数据不通 解决方法:使用静态变量和Handler定时器在不同类之间共享按键状态,保证数据一致性.
4. 滑动值映射失灵 解决方法:将0-100的滑动值合理映射到系统音量和亮度范围,实现平滑过渡
5. app闪退,功能异常处理 解决方法:针对设备断连、权限拒绝等异常情况添加完善的错误处理和用户提示
对本活动的心得体会
通过使用CY8CKIT-149开发套件,我对硬件开发有了更直观的认识.以前虽然学过硬件相关知识,但实际操作中还是遇到了不少问题,比如滑动条与按键状态采集,与手机的BLE连接,虽然开发套件有基础文档,但对于一些复杂功能的实现,比如BLE高级应用、与其他传感器的集成等,缺乏详细的指导.建议活动组织方可以组织技术专家或有经验的开发者,制作更深入、更全面的技术文档和视频教程,帮助参与者更好地理解和使用开发套件。例如,制作一个关于CY8CKIT-149开发套件在物联网应用中的高级功能开发教程,让参与者能够深入挖掘开发套件的潜力