1. 项目概述打造你的专属桌面控制中枢作为一个常年泡在工作室里折腾各种硬件的玩家我总觉得桌面上那些零零散散的快捷键、旋钮和屏幕信息显示不够“一体化”。想要快速调节音量、一键静音会议、或者瞥一眼正在播放的音乐往往需要在键盘、鼠标和手机之间来回切换效率低下不说体验也割裂。于是一个念头冒了出来为什么不自己动手做一个集成所有常用功能的物理控制面板呢这个想法催生了今天要分享的项目一个基于Arduino Pro Micro和Nextion 3.5英寸触摸屏的PC控制面板。它的核心目标很简单将一系列高频的电脑操作实体化、集中化。通过这个巴掌大的设备你可以用实体旋钮无极调节系统音量用触摸按钮一键静音甚至能单独静音Discord在屏幕上实时显示Spotify或Chrome正在播放的歌曲信息还能设置一个带PIN码的物理锁定按钮来快速锁屏。整个系统通过串口与电脑通信是学习嵌入式系统、人机交互界面HMI开发以及软硬件联调的绝佳实践。无论你是刚接触Arduino的创客新手还是想为你的工作站增添一个酷炫外设的资深玩家这个项目都能提供从硬件焊接、固件编写、界面设计到上位机软件调试的完整链条。接下来我将拆解每一个环节不仅告诉你“怎么做”更会深入解释“为什么这么做”并分享我在实际制作中踩过的坑和总结的技巧。2. 核心硬件选型与设计思路解析为什么是Arduino Pro Micro加Nextion的组合这个选择背后是成本、功能、开发难度和最终体验的综合考量。市面上能实现类似功能的方案很多比如纯Arduino加普通LCD屏或者使用树莓派Pico配合更复杂的图形库。但经过对比当前方案在易用性和效果上取得了很好的平衡。2.1 主控芯片Arduino Pro Micro的不可替代性首先主控选择了Arduino Pro Micro并且必须是5V版本。这一点至关重要。很多新手会疑惑为什么不用更常见的Uno或者Nano核心原因在于Pro Micro原生模拟了USB HID人机接口设备功能。HID功能的价值我们的面板需要直接向电脑发送键盘快捷键如音量增/减、播放/暂停和组合键如WinL锁屏。Pro Micro的ATmega32U4芯片内置USB控制器可以把自己伪装成一个标准的USB键盘或鼠标直接发送这些指令。而Uno/Nano使用的ATmega328P芯片需要通过额外的USB转串口芯片与电脑通信本身不具备直接发送HID指令的能力实现类似功能需要更复杂的第三方库且稳定性欠佳。5V电压的必须性Nextion触摸屏的工作电压是5V。虽然它有3.3V的型号但5V版本更为常见且与Pro Micro的5V逻辑电平完美匹配。使用5V版本可以确保串口通信电平一致避免需要逻辑电平转换器的麻烦也简化了供电设计——两者可以共用来自电脑USB口的5V电源。注意购买时务必确认是“Arduino Pro Micro 5V”。3.3V版本虽然也能工作但其IO口输出高电平为3.3V驱动5V的Nextion屏幕可能会不稳定长期使用有风险。2.2 交互核心Nextion触摸屏的优势显示和触摸交互部分选择了Nextion 3.5英寸智能串口屏。它不是一个简单的“显示屏”而是一个集成了显示驱动、触摸控制器和独立处理器的HMI设备。开发模式的区别与直接驱动LCD屏你需要自己处理每个像素的绘制、触摸坐标的解析不同Nextion采用“指令集”交互模式。我们在电脑上使用其官方编辑器Nextion Editor进行“所见即所得”的界面设计生成一个.HMI文件。将这个文件烧录到屏幕内部的Flash中后屏幕就独立运行这个界面程序。Arduino只需要通过串口向屏幕发送简单的指令如t0.txt\Hello\来更新文本框t0的内容或者接收屏幕发送的触摸事件编号如按下按钮b0屏幕会向串口发送b0的ID。这极大地降低了微控制器的编程负担让Arduino可以专注于逻辑控制和与电脑的通信。型号选择的考量3.5英寸是一个兼顾信息显示面积和设备体积的尺寸适合放在桌面。分辨率480x320足够清晰显示歌曲名、艺术家等信息。它自带IPS面板可视角度很好。选择带电阻屏或电容屏的型号取决于个人喜好电容屏手感更顺滑但电阻屏戴手套也可操作。2.3 系统架构与通信流程理解了硬件选型整个系统的工作流程就清晰了用户交互层用户在Nextion屏幕上进行触摸操作如点击音量按钮。指令传递层Nextion屏幕通过串口TX引脚向Arduino Pro Micro的RX引脚发送一个预设的按钮ID字符例如发送字符A代表音量增加。逻辑处理层Arduino通过串口中断或轮询收到字符解析其含义。如果是音量控制则通过HID库模拟按下键盘的VOL_UP键如果是锁定命令则模拟按下WinL组合键。系统响应层电脑操作系统接收到这些HID指令执行相应的系统级操作。信息反馈流同时运行在电脑上的一个自定义C#程序上位机持续监测Spotify或Chrome的播放状态。当歌曲信息变化时该程序通过指定的COM口向Arduino发送新的歌曲信息字符串。显示更新层Arduino收到歌曲信息字符串后通过串口TX引脚转发给Nextion屏幕屏幕解析指令并更新对应文本框的显示内容。这个双向串口通信构成了系统的骨干。Arduino在这里扮演了“协议转换器”和“信息中转站”的核心角色。3. 硬件搭建与电路连接详解有了清晰的思路接下来就是动手把硬件组装起来。这个过程并不复杂但细节决定成败尤其是电源和通信线路。3.1 物料清单与工具准备除了核心的Arduino Pro Micro和Nextion 3.5寸屏你还需要连接线若干杜邦线公对公。建议使用不同颜色区分电源红正、黑负和信号线如黄、绿。USB数据线一条Micro USB线用于同时为整个设备供电和连接电脑进行编程、通信。焊接工具可选如果你希望连接更牢固可以将杜邦线直接焊接到Pro Micro和Nextion的插针上。对于Nextion也可以使用其配套的4Pin或5Pin连接器。3D打印外壳项目提供了.stl文件用于打印面板的顶盖和底壳。这是获得完美外观的关键。如果没有3D打印机可以考虑用亚克力板激光切割制作甚至用心仪的现成小盒子改造。3.2 电路连接原理图与实操连接非常简单只有四条线VCC - 5V将Nextion的VCC引脚连接到Arduino Pro Micro的VCC或5V引脚。这是最重要的供电连接必须确保是5V。GND - GND将Nextion的GND引脚连接到Arduino Pro Micro的任意一个GND引脚。共地是保证信号正常参考的基础。RX - TX将Nextion的RX接收引脚连接到Arduino Pro Micro的TX发送引脚。这样Arduino发送的数据屏幕才能收到。TX - RX将Nextion的TX发送引脚连接到Arduino Pro Micro的RX接收引脚。这样屏幕发送的触摸事件Arduino才能收到。重要提示这里有一个初学者极易混淆的点。在串口通信中设备的TX应连接对端的RX。所以是“交叉连接”屏的TX接板的RX屏的RX接板的TX。接反了会导致通信完全失败。连接好后你可以先用USB线将Pro Micro连接到电脑。Nextion屏幕应该会亮起并显示初始界面如果已烧录程序。此时打开Arduino IDE的串口监视器设置正确的波特率Nextion默认115200然后触摸屏幕上的按钮你应该能在监视器里看到对应的按钮ID代码输出。这是验证硬件连接和屏幕程序是否正常的第一步。3.3 供电考量与稳定性保障整个系统通过Pro Micro的USB口取电再通过5V和GND线给Nextion屏幕供电。对于3.5寸屏来说这是一个简洁的方案但需要注意电流需求Nextion屏幕在工作时尤其是背光全亮时峰值电流可能达到200-300mA。Arduino Pro Micro的5V引脚通常可以从USB口获取500mA左右的电流。在大多数情况下这是够用的。但如果你的电脑USB口供电不足可能会导致屏幕闪烁或Arduino重启。稳定性增强如果遇到不稳定情况一个简单的改进是在5V和GND之间靠近Nextion屏幕电源引脚的地方焊接一个100μF的电解电容和一个0.1μF的陶瓷电容。这可以平滑电源纹波特别是在屏幕背光亮度变化时引起的电流突变能显著提高系统稳定性。这是从实际调试中总结出的宝贵经验。4. Arduino固件开发与核心逻辑剖析硬件准备就绪后我们进入“大脑”的编程环节。Arduino代码负责承上启下是逻辑控制的核心。4.1 开发环境与核心库配置首先确保你安装了最新版的Arduino IDE。你需要安装两个关键库Keyboard.h和Mouse.h这是Arduino AVR Boards核心自带的库用于模拟HID设备。Pro Micro基于ATmega32U4原生支持。SoftwareSerial.h备用虽然Pro Micro有硬件串口Serial但通常我们用它来与电脑调试通信。与Nextion的通信可以使用另一个硬件串口Serial1如果引脚不冲突的话。更通用的做法是使用软件模拟串口SoftwareSerial来连接Nextion这样能释放硬件串口Serial专门用于调试输出。在我的代码中我使用了Serial1RX0 TX1但要注意在Pro Micro上引脚0和1也是硬件串口Serial的一部分在烧录程序时不能连接其他设备否则会冲突。因此烧录程序时最好暂时断开Nextion的TX/RX线。代码开头需要引入这些库并定义关键引脚和变量#include Keyboard.h #include Mouse.h // 定义与Nextion通信的串口这里使用Serial1 (RX on 0, TX on 1) #define nextion Serial1 // 定义从Nextion接收到的命令字符 char incomingByte 0; String spotifyInfo ; // 用于存储从PC上位机接收的歌曲信息 bool receivingInfo false; // 标志位表示正在接收歌曲信息字符串4.2 主循环逻辑与串口数据处理在setup()函数中我们需要初始化串口并启动Keyboard功能void setup() { Serial.begin(115200); // 用于调试连接电脑 nextion.begin(115200); // 与Nextion通信波特率必须与屏幕设置一致 Keyboard.begin(); delay(1000); // 等待系统稳定 Serial.println(PC Control Deck Started!); }loop()函数是心脏它需要高效地处理两件事1. 读取来自Nextion的触摸命令2. 读取来自PC上位机的歌曲信息并转发。void loop() { // 第一部分处理来自Nextion的触摸命令 if (nextion.available() 0) { incomingByte nextion.read(); // 读取一个字节 processNextionCommand(incomingByte); } // 第二部分处理来自PC通过Serial的歌曲信息 if (Serial.available() 0) { char pcByte Serial.read(); // 假设上位机发送的信息以开始以结束 if (pcByte ) { spotifyInfo ; receivingInfo true; } else if (pcByte receivingInfo) { receivingInfo false; // 将歌曲信息转发给Nextion显示例如更新文本框t0 nextion.print(t0.txt\); nextion.print(spotifyInfo); nextion.print(\); nextion.write(0xff); // Nextion指令必须以0xff 0xff 0xff结尾 nextion.write(0xff); nextion.write(0xff); } else if (receivingInfo) { spotifyInfo pcByte; } } }4.3 命令解析函数与HID动作执行processNextionCommand函数是业务逻辑的核心。它根据收到的字符执行对应的动作void processNextionCommand(char cmd) { switch(cmd) { case V: // 假设Nextion音量按钮发送字符V Keyboard.press(KEY_MEDIA_VOLUME_UP); delay(50); // 短暂按下 Keyboard.release(KEY_MEDIA_VOLUME_UP); Serial.println(Volume Up); break; case v: // 音量- Keyboard.press(KEY_MEDIA_VOLUME_DOWN); delay(50); Keyboard.release(KEY_MEDIA_VOLUME_DOWN); Serial.println(Volume Down); break; case M: // 静音 Keyboard.press(KEY_MEDIA_MUTE); delay(50); Keyboard.release(KEY_MEDIA_MUTE); Serial.println(Mute Toggle); break; case L: // 锁定电脑 (WinL) Keyboard.press(KEY_LEFT_GUI); // 按下Win键 Keyboard.press(l); // 按下L键 delay(100); Keyboard.release(l); Keyboard.release(KEY_LEFT_GUI); Serial.println(PC Locked); break; // ... 可以添加更多命令如播放/暂停(P)下一曲(N)等 default: // 如果是数字可能是PIN码输入的一部分这里需要更复杂的逻辑处理 if (cmd 0 cmd 9) { handlePinInput(cmd); } break; } }实操心得在模拟键盘按键时delay(50)这个小延时非常关键。它确保了按键事件被操作系统可靠地识别。太快地press和release可能导致按键无效。但也不宜过长否则会影响其他操作的响应速度。50-100ms是一个经验值。4.4 PIN码锁定功能的实现细节项目提到了一个有趣的“锁定”功能它并非简单的锁屏而是带有一个PIN码验证的二级界面。这需要在Nextion界面设计两个页面一个主页面一个PIN码输入页面。Nextion端设计在PIN码输入页面设计0-9的数字按钮和一个确认按钮。每个数字按钮被按下时除了在本地显示如用星号*外还要通过串口发送对应的数字字符给Arduino。Arduino端逻辑Arduino需要维护一个状态机和一个输入缓冲区。当用户从主页面点击“锁定”按钮发送命令L时Arduino可以发送指令让Nextion跳转到PIN码输入页面并进入“等待PIN码”状态。随后接收到的数字字符被依次存入缓冲区。当收到“确认”命令时将缓冲区字符串与预设的PIN码在代码中定义如#define PIN_CODE \1234\进行比较。如果匹配则执行WinL锁屏如果不匹配则清空缓冲区并在屏幕上显示错误信息然后可以跳回PIN输入页或主页。这个功能增加了项目的趣味性和安全性是一个很好的综合练习涵盖了状态管理、字符串比较和更复杂的串口交互协议设计。5. Nextion界面设计与指令系统精讲Nextion屏幕的开发与传统编程不同它更像是在做一个动态的“皮肤”或“界面配置”。理解其指令系统是高效开发的关键。5.1 Nextion Editor基础与页面规划首先从Nextion官网下载并安装Nextion Editor。新建一个工程选择与你硬件完全一致的型号如NX4832T035。项目通常由多个“Page”页面组成。对于这个控制面板我们可以设计两个主要页面Page 0: 主控制页面包含音量加减、静音按钮、歌曲信息显示区域一个Text组件、锁定按钮、以及可能的其他媒体控制键。Page 1: PIN码输入页面包含数字键盘0-9、一个显示输入状态的Text组件显示****、确认和取消按钮。每个按钮Button组件都有两个关键属性需要配置txt按钮上显示的文字如“”、“-”、“Mute”。Touch Press Event这是核心。在这里你可以写入当按钮被按下时要执行的指令。指令可以直接是修改其他组件属性如vis j0,0隐藏某个组件也可以是向串口发送数据。5.2 串口指令发送与协议定义要让Nextion与Arduino对话我们需要在按钮的“Touch Press Event”里使用printh指令或直接写串口发送命令。方法一使用printh发送16进制数据更精确。例如要让按钮发送字符AASCII码是0x41可以写printh 41。如果要发送字符串需要逐个字符发送。方法二直接使用串口发送字符串更直观。对于发送单个字符命令可以在事件里写prints \A\。但要注意Nextion指令需要以三个字节的0xFF作为结束符。所以更完整的写法是prints \A\然后跟三个0xFF。在编辑器中0xFF通常用\\xff表示。定义通信协议这是软硬件联调的基础必须事先约定好。例如音量按钮发送字符V(0x56)音量-按钮发送字符v(0x76)静音按钮发送字符M(0x4D)锁定按钮发送字符L(0x4C)数字按钮0-9发送对应字符0到9确认按钮发送字符E(0x45) (Enter)这个协议需要与Arduino代码中的processNextionCommand函数解析逻辑完全对应。5.3 动态内容更新与Arduino控制界面除了接收触摸事件Nextion还需要根据Arduino或PC的指令更新显示内容比如歌曲信息。在Arduino代码中我们使用特定的指令格式来更新Nextion组件// 更新ID为t0的Text组件的内容为“Hello World” nextion.print(t0.txt\Hello World\); nextion.write(0xff); nextion.write(0xff); nextion.write(0xff); // 改变ID为b0的Button组件的背景色为红色 nextion.print(b0.bco63488); // 63488是Nextion颜色编码中的红色 nextion.write(0xff); nextion.write(0xff); nextion.write(0xff);在Nextion Editor中你需要知道每个组件的ID如t0,b1和属性名如.txt文本.bco背景色。通过组合这些指令你可以实现丰富的动态效果比如歌曲播放时让某个按钮闪烁或者根据PIN码输入正确与否改变提示文字的颜色。避坑指南Nextion指令必须以三个0xFF字节结尾作为指令终止符。忘记发送它们是最常见的导致屏幕无响应的原因。另外字符串内容必须用双引号括起来且指令中不能有多余的空格属性赋值部分除外。6. Windows端上位机软件与系统集成控制面板要显示电脑上正在播放的音乐信息这就需要一个小程序在电脑后台运行监听播放器状态并通过串口发送给Arduino。6.1 上位机开发环境与思路原作者提供了基于C#和.NET框架的程序。使用C#是因为它可以方便地调用Windows API来获取系统音频会话信息并且有成熟的串口通信库System.IO.Ports。程序的基本逻辑是枚举音频会话使用NAudio或CoreAudio API等库获取系统中所有活跃的音频流会话。识别目标应用遍历这些会话通过进程名如Spotify.exe、chrome.exe找到来自Spotify或Chrome的会话。提取媒体信息对于Windows 10/11Spotify等UWP应用或部分桌面应用可以通过SystemMediaTransportControls或应用的特定API如Chrome的chrome://media-internals但需要更复杂的方法来获取当前播放的歌曲名、艺术家。一个更通用但略取巧的方法是读取播放器窗口的标题栏文本如果它包含了歌曲信息。串口通信当检测到歌曲信息发生变化时将信息格式化为约定好的协议如歌曲名 - 艺术家通过SerialPort类发送到Arduino所在的COM口。6.2 串口配置与权限处理在C#中初始化串口如下using System.IO.Ports; SerialPort serialPort; serialPort new SerialPort(COM3, 115200); // 端口号需根据实际修改 serialPort.Open(); // 发送数据 serialPort.WriteLine(Running Up That Hill - Kate Bush);关键点获取正确的COM口Arduino Pro Micro在电脑上枚举的COM端口号需要在设备管理器中查看。程序最好能提供自动扫描和选择的功能。以管理员权限运行在某些系统上访问串口或某些系统音频信息可能需要管理员权限。可以在Visual Studio项目属性中设置清单要求以管理员身份运行。异常处理必须用try-catch包裹串口操作处理端口被占用、断开等异常避免程序崩溃。6.3 Windows注册表优化解决音量调节延迟问题这是一个非常实用但常被忽略的细节。Windows默认的音量调节步进和重复速率对于实体旋钮编码器或快速连按的按钮来说可能感觉“不跟手”或“跳跃感太强”。项目提到的修改注册表正是为了优化这个体验。具体路径和键值如下路径HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Audio需要修改的键值均为DWORD值VolumeAccelThreshold: 将其值改为0。这个值控制音量调节的“加速阈值”。设为0意味着每次按键调节都会立即生效没有延迟加速。VolumeDownTransitionTime: 改为0。这控制了音量下降的过渡时间。VolumeRepeatWindow: 改为0。这控制了音量键重复的响应窗口。操作步骤与警告按WinR输入regedit回车打开注册表编辑器。导航到上述路径。如果Audio键不存在可能需要手动创建。右键 - 新建 - DWORD (32位) 值创建上述三个键如果不存在并将它们的值数据设置为0。修改前务必备份注册表错误修改可能导致系统不稳定。修改后需要重启电脑或重启Windows资源管理器任务管理器里重启explorer.exe进程才能使设置生效。修改后你会发现用面板上的按钮调节音量响应更加即时和线性手感大幅提升。这个技巧对所有使用键盘媒体键调节音量的外设都适用。7. 系统集成调试与故障排除实录将所有部分组合在一起时难免会遇到问题。下面是我在调试过程中遇到的一些典型问题及解决方法希望能帮你快速排雷。7.1 通信全无硬件连接与电源检查现象屏幕不亮或者屏幕亮但触摸无反应Arduino IDE串口监视器无任何输出。排查步骤供电检查用万用表测量Nextion的VCC和GND之间电压确保为稳定的5V。如果电压低于4.8V可能是USB线或电脑USB口供电不足尝试更换线缆或插到主板后置USB口。接线检查再次确认TX-RX是否交叉连接。最直接的验证方法是将Arduino的TX引脚暂时连接到RX引脚自发自收在代码中让Serial1.print(test)同时用Serial1.read()读取看是否能收到。如果可以说明Arduino端串口正常。屏幕程序检查确保.HMI文件已通过SD卡或USB转TTL工具正确烧录到Nextion屏幕中。可以尝试烧录一个最简单的、只包含一个发送固定字符按钮的程序来测试。波特率一致性检查Arduino代码中nextion.begin(115200)的波特率是否与Nextion Editor中项目属性的“波特率”设置完全一致。哪怕差一点都会导致乱码或无法通信。7.2 指令时灵时不灵软件层面的常见陷阱现象有时触摸按钮能正确执行功能有时没反应或者歌曲信息显示乱码、不更新。排查步骤指令终止符这是最高频的错误源。百分之百确认你从Arduino发送给Nextion的每一条指令末尾都跟了三个0xFF字节。在代码中nextion.write(0xff)要写三次。可以用串口监视器设置显示十六进制查看实际发送的数据流来验证。串口缓冲区冲突确保Arduino的loop()函数中没有长时间阻塞的操作如长delay。这会导致串口缓冲区被塞满丢失数据。采用非阻塞的定时逻辑millis()来代替长delay。字符串格式发送给Nextion的文本指令字符串必须用双引号括起来且内部如果包含双引号需要转义。例如t0.txt\She said \\\Hello\\\\。上位机数据格式检查PC端C#程序发送的数据是否严格遵循了与Arduino约定的协议。例如是否以开始以结束可以在C#程序中加入日志功能将准备发送的字符串打印到文件或控制台同时用独立的串口调试工具监听Arduino收到的原始数据进行对比。多线程竞争如果C#程序在多个线程中操作同一个SerialPort对象可能会引发异常。确保串口的读写操作是线程安全的或者都在同一个线程上下文中进行。7.3 功能特异性问题Discord静音与PIN码逻辑现象Discord静音键无效PIN码锁屏功能逻辑错乱。Discord静音这个功能利用了Discord的“键盘快捷键”功能。它并非直接模拟系统静音键而是需要你在Discord设置中为“切换麦克风静音”动作录制一个快捷键。录制时按下你面板上分配为Discord静音的按钮。Arduino会发送一个特定的键值比如KEY_F13这是一个通常不被其他程序使用的功能键。Discord会记录这个键值。之后每次按下该按钮就相当于触发了Discord内部的静音快捷键。确保Arduino发送的键值与Discord录制的完全匹配。PIN码逻辑这是一个状态机逻辑。常见的bug是状态没有正确重置。例如输入错误PIN码后应该清空输入缓冲区并重置状态到“等待输入”而不是停留在“验证失败”状态。在Arduino代码中仔细检查handlePinInput函数和相关的状态变量如inputIndexpinState在成功、失败、超时等各种情况下的重置逻辑。在Nextion端也要确保页面跳转指令如page 1被正确发送和执行。7.4 性能与稳定性优化消抖处理对于实体按钮如果未来扩展需要在Arduino代码中实现软件消抖。对于Nextion触摸屏其固件通常已做了消抖但如果发现一次触摸触发多次事件可以在Nextion Editor中调整按钮组件的“Touch Repetition”属性或是在Arduino代码中在收到命令后添加一个短暂的处理延时并忽略后续重复命令。错误恢复在Arduino代码中可以加入看门狗定时器Watchdog Timer防止程序跑飞。如果长时间未收到任何串口数据可以发送一个复位指令给Nextion或者让Arduino自己软重启。资源管理避免在Arduino的loop()中使用String类进行复杂的字符串拼接特别是在处理可能很长的歌曲信息时这容易导致内存碎片。使用字符数组char[]和更底层的字符串操作函数如strncpy是更安全的选择。经过以上步骤的精心调试你的PC控制面板应该已经能够稳定可靠地工作了。将它装入3D打印的外壳中连接上电脑一个功能强大、外观专业的桌面控制中枢就此诞生。这个项目不仅是一个实用的工具更是一个涵盖了嵌入式系统、HMI设计、串口通信、PC软件开发和系统集成等多个领域的综合学习案例。你可以在此基础上继续扩展比如增加环境光传感器来自动调节屏幕亮度或者增加几个可编程的宏按键来控制其他软件让它的功能变得更加强大。
基于Arduino与Nextion打造桌面PC控制面板:从硬件到软件的完整实践
1. 项目概述打造你的专属桌面控制中枢作为一个常年泡在工作室里折腾各种硬件的玩家我总觉得桌面上那些零零散散的快捷键、旋钮和屏幕信息显示不够“一体化”。想要快速调节音量、一键静音会议、或者瞥一眼正在播放的音乐往往需要在键盘、鼠标和手机之间来回切换效率低下不说体验也割裂。于是一个念头冒了出来为什么不自己动手做一个集成所有常用功能的物理控制面板呢这个想法催生了今天要分享的项目一个基于Arduino Pro Micro和Nextion 3.5英寸触摸屏的PC控制面板。它的核心目标很简单将一系列高频的电脑操作实体化、集中化。通过这个巴掌大的设备你可以用实体旋钮无极调节系统音量用触摸按钮一键静音甚至能单独静音Discord在屏幕上实时显示Spotify或Chrome正在播放的歌曲信息还能设置一个带PIN码的物理锁定按钮来快速锁屏。整个系统通过串口与电脑通信是学习嵌入式系统、人机交互界面HMI开发以及软硬件联调的绝佳实践。无论你是刚接触Arduino的创客新手还是想为你的工作站增添一个酷炫外设的资深玩家这个项目都能提供从硬件焊接、固件编写、界面设计到上位机软件调试的完整链条。接下来我将拆解每一个环节不仅告诉你“怎么做”更会深入解释“为什么这么做”并分享我在实际制作中踩过的坑和总结的技巧。2. 核心硬件选型与设计思路解析为什么是Arduino Pro Micro加Nextion的组合这个选择背后是成本、功能、开发难度和最终体验的综合考量。市面上能实现类似功能的方案很多比如纯Arduino加普通LCD屏或者使用树莓派Pico配合更复杂的图形库。但经过对比当前方案在易用性和效果上取得了很好的平衡。2.1 主控芯片Arduino Pro Micro的不可替代性首先主控选择了Arduino Pro Micro并且必须是5V版本。这一点至关重要。很多新手会疑惑为什么不用更常见的Uno或者Nano核心原因在于Pro Micro原生模拟了USB HID人机接口设备功能。HID功能的价值我们的面板需要直接向电脑发送键盘快捷键如音量增/减、播放/暂停和组合键如WinL锁屏。Pro Micro的ATmega32U4芯片内置USB控制器可以把自己伪装成一个标准的USB键盘或鼠标直接发送这些指令。而Uno/Nano使用的ATmega328P芯片需要通过额外的USB转串口芯片与电脑通信本身不具备直接发送HID指令的能力实现类似功能需要更复杂的第三方库且稳定性欠佳。5V电压的必须性Nextion触摸屏的工作电压是5V。虽然它有3.3V的型号但5V版本更为常见且与Pro Micro的5V逻辑电平完美匹配。使用5V版本可以确保串口通信电平一致避免需要逻辑电平转换器的麻烦也简化了供电设计——两者可以共用来自电脑USB口的5V电源。注意购买时务必确认是“Arduino Pro Micro 5V”。3.3V版本虽然也能工作但其IO口输出高电平为3.3V驱动5V的Nextion屏幕可能会不稳定长期使用有风险。2.2 交互核心Nextion触摸屏的优势显示和触摸交互部分选择了Nextion 3.5英寸智能串口屏。它不是一个简单的“显示屏”而是一个集成了显示驱动、触摸控制器和独立处理器的HMI设备。开发模式的区别与直接驱动LCD屏你需要自己处理每个像素的绘制、触摸坐标的解析不同Nextion采用“指令集”交互模式。我们在电脑上使用其官方编辑器Nextion Editor进行“所见即所得”的界面设计生成一个.HMI文件。将这个文件烧录到屏幕内部的Flash中后屏幕就独立运行这个界面程序。Arduino只需要通过串口向屏幕发送简单的指令如t0.txt\Hello\来更新文本框t0的内容或者接收屏幕发送的触摸事件编号如按下按钮b0屏幕会向串口发送b0的ID。这极大地降低了微控制器的编程负担让Arduino可以专注于逻辑控制和与电脑的通信。型号选择的考量3.5英寸是一个兼顾信息显示面积和设备体积的尺寸适合放在桌面。分辨率480x320足够清晰显示歌曲名、艺术家等信息。它自带IPS面板可视角度很好。选择带电阻屏或电容屏的型号取决于个人喜好电容屏手感更顺滑但电阻屏戴手套也可操作。2.3 系统架构与通信流程理解了硬件选型整个系统的工作流程就清晰了用户交互层用户在Nextion屏幕上进行触摸操作如点击音量按钮。指令传递层Nextion屏幕通过串口TX引脚向Arduino Pro Micro的RX引脚发送一个预设的按钮ID字符例如发送字符A代表音量增加。逻辑处理层Arduino通过串口中断或轮询收到字符解析其含义。如果是音量控制则通过HID库模拟按下键盘的VOL_UP键如果是锁定命令则模拟按下WinL组合键。系统响应层电脑操作系统接收到这些HID指令执行相应的系统级操作。信息反馈流同时运行在电脑上的一个自定义C#程序上位机持续监测Spotify或Chrome的播放状态。当歌曲信息变化时该程序通过指定的COM口向Arduino发送新的歌曲信息字符串。显示更新层Arduino收到歌曲信息字符串后通过串口TX引脚转发给Nextion屏幕屏幕解析指令并更新对应文本框的显示内容。这个双向串口通信构成了系统的骨干。Arduino在这里扮演了“协议转换器”和“信息中转站”的核心角色。3. 硬件搭建与电路连接详解有了清晰的思路接下来就是动手把硬件组装起来。这个过程并不复杂但细节决定成败尤其是电源和通信线路。3.1 物料清单与工具准备除了核心的Arduino Pro Micro和Nextion 3.5寸屏你还需要连接线若干杜邦线公对公。建议使用不同颜色区分电源红正、黑负和信号线如黄、绿。USB数据线一条Micro USB线用于同时为整个设备供电和连接电脑进行编程、通信。焊接工具可选如果你希望连接更牢固可以将杜邦线直接焊接到Pro Micro和Nextion的插针上。对于Nextion也可以使用其配套的4Pin或5Pin连接器。3D打印外壳项目提供了.stl文件用于打印面板的顶盖和底壳。这是获得完美外观的关键。如果没有3D打印机可以考虑用亚克力板激光切割制作甚至用心仪的现成小盒子改造。3.2 电路连接原理图与实操连接非常简单只有四条线VCC - 5V将Nextion的VCC引脚连接到Arduino Pro Micro的VCC或5V引脚。这是最重要的供电连接必须确保是5V。GND - GND将Nextion的GND引脚连接到Arduino Pro Micro的任意一个GND引脚。共地是保证信号正常参考的基础。RX - TX将Nextion的RX接收引脚连接到Arduino Pro Micro的TX发送引脚。这样Arduino发送的数据屏幕才能收到。TX - RX将Nextion的TX发送引脚连接到Arduino Pro Micro的RX接收引脚。这样屏幕发送的触摸事件Arduino才能收到。重要提示这里有一个初学者极易混淆的点。在串口通信中设备的TX应连接对端的RX。所以是“交叉连接”屏的TX接板的RX屏的RX接板的TX。接反了会导致通信完全失败。连接好后你可以先用USB线将Pro Micro连接到电脑。Nextion屏幕应该会亮起并显示初始界面如果已烧录程序。此时打开Arduino IDE的串口监视器设置正确的波特率Nextion默认115200然后触摸屏幕上的按钮你应该能在监视器里看到对应的按钮ID代码输出。这是验证硬件连接和屏幕程序是否正常的第一步。3.3 供电考量与稳定性保障整个系统通过Pro Micro的USB口取电再通过5V和GND线给Nextion屏幕供电。对于3.5寸屏来说这是一个简洁的方案但需要注意电流需求Nextion屏幕在工作时尤其是背光全亮时峰值电流可能达到200-300mA。Arduino Pro Micro的5V引脚通常可以从USB口获取500mA左右的电流。在大多数情况下这是够用的。但如果你的电脑USB口供电不足可能会导致屏幕闪烁或Arduino重启。稳定性增强如果遇到不稳定情况一个简单的改进是在5V和GND之间靠近Nextion屏幕电源引脚的地方焊接一个100μF的电解电容和一个0.1μF的陶瓷电容。这可以平滑电源纹波特别是在屏幕背光亮度变化时引起的电流突变能显著提高系统稳定性。这是从实际调试中总结出的宝贵经验。4. Arduino固件开发与核心逻辑剖析硬件准备就绪后我们进入“大脑”的编程环节。Arduino代码负责承上启下是逻辑控制的核心。4.1 开发环境与核心库配置首先确保你安装了最新版的Arduino IDE。你需要安装两个关键库Keyboard.h和Mouse.h这是Arduino AVR Boards核心自带的库用于模拟HID设备。Pro Micro基于ATmega32U4原生支持。SoftwareSerial.h备用虽然Pro Micro有硬件串口Serial但通常我们用它来与电脑调试通信。与Nextion的通信可以使用另一个硬件串口Serial1如果引脚不冲突的话。更通用的做法是使用软件模拟串口SoftwareSerial来连接Nextion这样能释放硬件串口Serial专门用于调试输出。在我的代码中我使用了Serial1RX0 TX1但要注意在Pro Micro上引脚0和1也是硬件串口Serial的一部分在烧录程序时不能连接其他设备否则会冲突。因此烧录程序时最好暂时断开Nextion的TX/RX线。代码开头需要引入这些库并定义关键引脚和变量#include Keyboard.h #include Mouse.h // 定义与Nextion通信的串口这里使用Serial1 (RX on 0, TX on 1) #define nextion Serial1 // 定义从Nextion接收到的命令字符 char incomingByte 0; String spotifyInfo ; // 用于存储从PC上位机接收的歌曲信息 bool receivingInfo false; // 标志位表示正在接收歌曲信息字符串4.2 主循环逻辑与串口数据处理在setup()函数中我们需要初始化串口并启动Keyboard功能void setup() { Serial.begin(115200); // 用于调试连接电脑 nextion.begin(115200); // 与Nextion通信波特率必须与屏幕设置一致 Keyboard.begin(); delay(1000); // 等待系统稳定 Serial.println(PC Control Deck Started!); }loop()函数是心脏它需要高效地处理两件事1. 读取来自Nextion的触摸命令2. 读取来自PC上位机的歌曲信息并转发。void loop() { // 第一部分处理来自Nextion的触摸命令 if (nextion.available() 0) { incomingByte nextion.read(); // 读取一个字节 processNextionCommand(incomingByte); } // 第二部分处理来自PC通过Serial的歌曲信息 if (Serial.available() 0) { char pcByte Serial.read(); // 假设上位机发送的信息以开始以结束 if (pcByte ) { spotifyInfo ; receivingInfo true; } else if (pcByte receivingInfo) { receivingInfo false; // 将歌曲信息转发给Nextion显示例如更新文本框t0 nextion.print(t0.txt\); nextion.print(spotifyInfo); nextion.print(\); nextion.write(0xff); // Nextion指令必须以0xff 0xff 0xff结尾 nextion.write(0xff); nextion.write(0xff); } else if (receivingInfo) { spotifyInfo pcByte; } } }4.3 命令解析函数与HID动作执行processNextionCommand函数是业务逻辑的核心。它根据收到的字符执行对应的动作void processNextionCommand(char cmd) { switch(cmd) { case V: // 假设Nextion音量按钮发送字符V Keyboard.press(KEY_MEDIA_VOLUME_UP); delay(50); // 短暂按下 Keyboard.release(KEY_MEDIA_VOLUME_UP); Serial.println(Volume Up); break; case v: // 音量- Keyboard.press(KEY_MEDIA_VOLUME_DOWN); delay(50); Keyboard.release(KEY_MEDIA_VOLUME_DOWN); Serial.println(Volume Down); break; case M: // 静音 Keyboard.press(KEY_MEDIA_MUTE); delay(50); Keyboard.release(KEY_MEDIA_MUTE); Serial.println(Mute Toggle); break; case L: // 锁定电脑 (WinL) Keyboard.press(KEY_LEFT_GUI); // 按下Win键 Keyboard.press(l); // 按下L键 delay(100); Keyboard.release(l); Keyboard.release(KEY_LEFT_GUI); Serial.println(PC Locked); break; // ... 可以添加更多命令如播放/暂停(P)下一曲(N)等 default: // 如果是数字可能是PIN码输入的一部分这里需要更复杂的逻辑处理 if (cmd 0 cmd 9) { handlePinInput(cmd); } break; } }实操心得在模拟键盘按键时delay(50)这个小延时非常关键。它确保了按键事件被操作系统可靠地识别。太快地press和release可能导致按键无效。但也不宜过长否则会影响其他操作的响应速度。50-100ms是一个经验值。4.4 PIN码锁定功能的实现细节项目提到了一个有趣的“锁定”功能它并非简单的锁屏而是带有一个PIN码验证的二级界面。这需要在Nextion界面设计两个页面一个主页面一个PIN码输入页面。Nextion端设计在PIN码输入页面设计0-9的数字按钮和一个确认按钮。每个数字按钮被按下时除了在本地显示如用星号*外还要通过串口发送对应的数字字符给Arduino。Arduino端逻辑Arduino需要维护一个状态机和一个输入缓冲区。当用户从主页面点击“锁定”按钮发送命令L时Arduino可以发送指令让Nextion跳转到PIN码输入页面并进入“等待PIN码”状态。随后接收到的数字字符被依次存入缓冲区。当收到“确认”命令时将缓冲区字符串与预设的PIN码在代码中定义如#define PIN_CODE \1234\进行比较。如果匹配则执行WinL锁屏如果不匹配则清空缓冲区并在屏幕上显示错误信息然后可以跳回PIN输入页或主页。这个功能增加了项目的趣味性和安全性是一个很好的综合练习涵盖了状态管理、字符串比较和更复杂的串口交互协议设计。5. Nextion界面设计与指令系统精讲Nextion屏幕的开发与传统编程不同它更像是在做一个动态的“皮肤”或“界面配置”。理解其指令系统是高效开发的关键。5.1 Nextion Editor基础与页面规划首先从Nextion官网下载并安装Nextion Editor。新建一个工程选择与你硬件完全一致的型号如NX4832T035。项目通常由多个“Page”页面组成。对于这个控制面板我们可以设计两个主要页面Page 0: 主控制页面包含音量加减、静音按钮、歌曲信息显示区域一个Text组件、锁定按钮、以及可能的其他媒体控制键。Page 1: PIN码输入页面包含数字键盘0-9、一个显示输入状态的Text组件显示****、确认和取消按钮。每个按钮Button组件都有两个关键属性需要配置txt按钮上显示的文字如“”、“-”、“Mute”。Touch Press Event这是核心。在这里你可以写入当按钮被按下时要执行的指令。指令可以直接是修改其他组件属性如vis j0,0隐藏某个组件也可以是向串口发送数据。5.2 串口指令发送与协议定义要让Nextion与Arduino对话我们需要在按钮的“Touch Press Event”里使用printh指令或直接写串口发送命令。方法一使用printh发送16进制数据更精确。例如要让按钮发送字符AASCII码是0x41可以写printh 41。如果要发送字符串需要逐个字符发送。方法二直接使用串口发送字符串更直观。对于发送单个字符命令可以在事件里写prints \A\。但要注意Nextion指令需要以三个字节的0xFF作为结束符。所以更完整的写法是prints \A\然后跟三个0xFF。在编辑器中0xFF通常用\\xff表示。定义通信协议这是软硬件联调的基础必须事先约定好。例如音量按钮发送字符V(0x56)音量-按钮发送字符v(0x76)静音按钮发送字符M(0x4D)锁定按钮发送字符L(0x4C)数字按钮0-9发送对应字符0到9确认按钮发送字符E(0x45) (Enter)这个协议需要与Arduino代码中的processNextionCommand函数解析逻辑完全对应。5.3 动态内容更新与Arduino控制界面除了接收触摸事件Nextion还需要根据Arduino或PC的指令更新显示内容比如歌曲信息。在Arduino代码中我们使用特定的指令格式来更新Nextion组件// 更新ID为t0的Text组件的内容为“Hello World” nextion.print(t0.txt\Hello World\); nextion.write(0xff); nextion.write(0xff); nextion.write(0xff); // 改变ID为b0的Button组件的背景色为红色 nextion.print(b0.bco63488); // 63488是Nextion颜色编码中的红色 nextion.write(0xff); nextion.write(0xff); nextion.write(0xff);在Nextion Editor中你需要知道每个组件的ID如t0,b1和属性名如.txt文本.bco背景色。通过组合这些指令你可以实现丰富的动态效果比如歌曲播放时让某个按钮闪烁或者根据PIN码输入正确与否改变提示文字的颜色。避坑指南Nextion指令必须以三个0xFF字节结尾作为指令终止符。忘记发送它们是最常见的导致屏幕无响应的原因。另外字符串内容必须用双引号括起来且指令中不能有多余的空格属性赋值部分除外。6. Windows端上位机软件与系统集成控制面板要显示电脑上正在播放的音乐信息这就需要一个小程序在电脑后台运行监听播放器状态并通过串口发送给Arduino。6.1 上位机开发环境与思路原作者提供了基于C#和.NET框架的程序。使用C#是因为它可以方便地调用Windows API来获取系统音频会话信息并且有成熟的串口通信库System.IO.Ports。程序的基本逻辑是枚举音频会话使用NAudio或CoreAudio API等库获取系统中所有活跃的音频流会话。识别目标应用遍历这些会话通过进程名如Spotify.exe、chrome.exe找到来自Spotify或Chrome的会话。提取媒体信息对于Windows 10/11Spotify等UWP应用或部分桌面应用可以通过SystemMediaTransportControls或应用的特定API如Chrome的chrome://media-internals但需要更复杂的方法来获取当前播放的歌曲名、艺术家。一个更通用但略取巧的方法是读取播放器窗口的标题栏文本如果它包含了歌曲信息。串口通信当检测到歌曲信息发生变化时将信息格式化为约定好的协议如歌曲名 - 艺术家通过SerialPort类发送到Arduino所在的COM口。6.2 串口配置与权限处理在C#中初始化串口如下using System.IO.Ports; SerialPort serialPort; serialPort new SerialPort(COM3, 115200); // 端口号需根据实际修改 serialPort.Open(); // 发送数据 serialPort.WriteLine(Running Up That Hill - Kate Bush);关键点获取正确的COM口Arduino Pro Micro在电脑上枚举的COM端口号需要在设备管理器中查看。程序最好能提供自动扫描和选择的功能。以管理员权限运行在某些系统上访问串口或某些系统音频信息可能需要管理员权限。可以在Visual Studio项目属性中设置清单要求以管理员身份运行。异常处理必须用try-catch包裹串口操作处理端口被占用、断开等异常避免程序崩溃。6.3 Windows注册表优化解决音量调节延迟问题这是一个非常实用但常被忽略的细节。Windows默认的音量调节步进和重复速率对于实体旋钮编码器或快速连按的按钮来说可能感觉“不跟手”或“跳跃感太强”。项目提到的修改注册表正是为了优化这个体验。具体路径和键值如下路径HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Audio需要修改的键值均为DWORD值VolumeAccelThreshold: 将其值改为0。这个值控制音量调节的“加速阈值”。设为0意味着每次按键调节都会立即生效没有延迟加速。VolumeDownTransitionTime: 改为0。这控制了音量下降的过渡时间。VolumeRepeatWindow: 改为0。这控制了音量键重复的响应窗口。操作步骤与警告按WinR输入regedit回车打开注册表编辑器。导航到上述路径。如果Audio键不存在可能需要手动创建。右键 - 新建 - DWORD (32位) 值创建上述三个键如果不存在并将它们的值数据设置为0。修改前务必备份注册表错误修改可能导致系统不稳定。修改后需要重启电脑或重启Windows资源管理器任务管理器里重启explorer.exe进程才能使设置生效。修改后你会发现用面板上的按钮调节音量响应更加即时和线性手感大幅提升。这个技巧对所有使用键盘媒体键调节音量的外设都适用。7. 系统集成调试与故障排除实录将所有部分组合在一起时难免会遇到问题。下面是我在调试过程中遇到的一些典型问题及解决方法希望能帮你快速排雷。7.1 通信全无硬件连接与电源检查现象屏幕不亮或者屏幕亮但触摸无反应Arduino IDE串口监视器无任何输出。排查步骤供电检查用万用表测量Nextion的VCC和GND之间电压确保为稳定的5V。如果电压低于4.8V可能是USB线或电脑USB口供电不足尝试更换线缆或插到主板后置USB口。接线检查再次确认TX-RX是否交叉连接。最直接的验证方法是将Arduino的TX引脚暂时连接到RX引脚自发自收在代码中让Serial1.print(test)同时用Serial1.read()读取看是否能收到。如果可以说明Arduino端串口正常。屏幕程序检查确保.HMI文件已通过SD卡或USB转TTL工具正确烧录到Nextion屏幕中。可以尝试烧录一个最简单的、只包含一个发送固定字符按钮的程序来测试。波特率一致性检查Arduino代码中nextion.begin(115200)的波特率是否与Nextion Editor中项目属性的“波特率”设置完全一致。哪怕差一点都会导致乱码或无法通信。7.2 指令时灵时不灵软件层面的常见陷阱现象有时触摸按钮能正确执行功能有时没反应或者歌曲信息显示乱码、不更新。排查步骤指令终止符这是最高频的错误源。百分之百确认你从Arduino发送给Nextion的每一条指令末尾都跟了三个0xFF字节。在代码中nextion.write(0xff)要写三次。可以用串口监视器设置显示十六进制查看实际发送的数据流来验证。串口缓冲区冲突确保Arduino的loop()函数中没有长时间阻塞的操作如长delay。这会导致串口缓冲区被塞满丢失数据。采用非阻塞的定时逻辑millis()来代替长delay。字符串格式发送给Nextion的文本指令字符串必须用双引号括起来且内部如果包含双引号需要转义。例如t0.txt\She said \\\Hello\\\\。上位机数据格式检查PC端C#程序发送的数据是否严格遵循了与Arduino约定的协议。例如是否以开始以结束可以在C#程序中加入日志功能将准备发送的字符串打印到文件或控制台同时用独立的串口调试工具监听Arduino收到的原始数据进行对比。多线程竞争如果C#程序在多个线程中操作同一个SerialPort对象可能会引发异常。确保串口的读写操作是线程安全的或者都在同一个线程上下文中进行。7.3 功能特异性问题Discord静音与PIN码逻辑现象Discord静音键无效PIN码锁屏功能逻辑错乱。Discord静音这个功能利用了Discord的“键盘快捷键”功能。它并非直接模拟系统静音键而是需要你在Discord设置中为“切换麦克风静音”动作录制一个快捷键。录制时按下你面板上分配为Discord静音的按钮。Arduino会发送一个特定的键值比如KEY_F13这是一个通常不被其他程序使用的功能键。Discord会记录这个键值。之后每次按下该按钮就相当于触发了Discord内部的静音快捷键。确保Arduino发送的键值与Discord录制的完全匹配。PIN码逻辑这是一个状态机逻辑。常见的bug是状态没有正确重置。例如输入错误PIN码后应该清空输入缓冲区并重置状态到“等待输入”而不是停留在“验证失败”状态。在Arduino代码中仔细检查handlePinInput函数和相关的状态变量如inputIndexpinState在成功、失败、超时等各种情况下的重置逻辑。在Nextion端也要确保页面跳转指令如page 1被正确发送和执行。7.4 性能与稳定性优化消抖处理对于实体按钮如果未来扩展需要在Arduino代码中实现软件消抖。对于Nextion触摸屏其固件通常已做了消抖但如果发现一次触摸触发多次事件可以在Nextion Editor中调整按钮组件的“Touch Repetition”属性或是在Arduino代码中在收到命令后添加一个短暂的处理延时并忽略后续重复命令。错误恢复在Arduino代码中可以加入看门狗定时器Watchdog Timer防止程序跑飞。如果长时间未收到任何串口数据可以发送一个复位指令给Nextion或者让Arduino自己软重启。资源管理避免在Arduino的loop()中使用String类进行复杂的字符串拼接特别是在处理可能很长的歌曲信息时这容易导致内存碎片。使用字符数组char[]和更底层的字符串操作函数如strncpy是更安全的选择。经过以上步骤的精心调试你的PC控制面板应该已经能够稳定可靠地工作了。将它装入3D打印的外壳中连接上电脑一个功能强大、外观专业的桌面控制中枢就此诞生。这个项目不仅是一个实用的工具更是一个涵盖了嵌入式系统、HMI设计、串口通信、PC软件开发和系统集成等多个领域的综合学习案例。你可以在此基础上继续扩展比如增加环境光传感器来自动调节屏幕亮度或者增加几个可编程的宏按键来控制其他软件让它的功能变得更加强大。