可以参考书籍,以下内容由AI豆包提供编程
你这份 Arduino 代码的核心需求是:通过 5 号引脚的按键控制计数(0-3 循环),串口输出计数值、13 号引脚 LED 提示按键状态,同时初始化蓝牙模块为主机并完成绑定、波特率等配置,但代码里存在语法错误、蓝牙 AT 指令格式错误、按键消抖缺失、逻辑缩进错误等问题,导致实际无法正常运行。
下面先逐点指出问题,再给出可直接复制使用的修正版代码,最后补充关键的使用注意事项。
一、原代码的核心问题
- 蓝牙 AT 指令格式错误 :
Serial.print里的换行符应该是\r\n(转义字符),原代码写成r n会导致模块无法识别 AT 指令; - 语法与缩进错误 :
loop中else后的delay(200)没有缩进,导致无论按键是否按下,延迟都独立执行,逻辑混乱; - 无按键消抖:物理按键按下 / 松开时会有电平抖动,直接读取会导致一次按键被识别为多次,计数不准;
- 变量作用与计数逻辑 :原代码
i<3时累加,否则归0,实际计数是1→2→3→0循环,若想实现0→1→2→3循环需要微调; - 注释与格式冗余:部分注释无实际意义,代码排版可更规范。
二、修正后的完整可运行代码
cs
// 引脚定义
const int KEY_PIN = 5; // 按键接数字5脚
const int LED_PIN = 13; // Uno自带LED(数字13脚)
// 全局变量
int pressCount = 0; // 按键按下次数(替换原i,变量名更语义化)
bool lastKeyState = HIGH; // 记录上一次按键状态,用于消抖
unsigned long lastDebounceTime = 0; // 消抖时间戳
const unsigned long debounceDelay = 200; // 消抖延迟200ms(与原延迟一致)
/**
* 蓝牙模块AT指令配置函数
* 功能:设置为主机→绑定从机地址→上电自动配对→波特率9600→重启
*/
void setupBluetooth() {
Serial.print("AT+ROLE1\r\n"); // 设置为主机(正确换行:\r\n)
delay(500); // 延长延迟至500ms,确保指令执行(原50ms过短)
Serial.print("AT+BIND00,06,71,00,3B,AA\r\n"); // 绑定从机蓝牙地址
delay(500);
Serial.print("AT+AUTOIN1\r\n"); // 上电自动配对(原指令多了空格,修正为AT+AUTOIN1)
delay(500);
Serial.print("AT+BAUD4\r\n"); // 设置波特率9600(BAUD4对应9600,需匹配模块手册)
delay(500);
Serial.print("AT+RESET\r\n"); // 重启蓝牙模块使配置生效
delay(2000); // 重启延迟保留2000ms
}
void setup() {
pinMode(KEY_PIN, INPUT_PULLUP); // 按键引脚设为**上拉输入**(推荐!无需外接上拉电阻)
pinMode(LED_PIN, OUTPUT); // LED引脚设为输出
Serial.begin(9600); // 串口波特率9600,与蓝牙模块一致
setupBluetooth(); // 初始化蓝牙模块
digitalWrite(LED_PIN, LOW); // 初始状态LED熄灭
}
void loop() {
// 1. 读取当前按键状态(上拉输入:按下为LOW,松开为HIGH)
bool currentKeyState = digitalRead(KEY_PIN);
// 2. 按键消抖:电平变化且超过消抖延迟,判定为有效按键
if (currentKeyState != lastKeyState) {
lastDebounceTime = millis(); // 重置时间戳
}
// 3. 有效按键判定:延迟后电平仍稳定,执行计数逻辑
if ((millis() - lastDebounceTime) > debounceDelay) {
// 按键从松开→按下(下降沿),执行一次计数
if (currentKeyState == LOW && lastKeyState == HIGH) {
pressCount++; // 计数累加
if (pressCount > 3) { // 超过3则归0,实现0-3循环(1→2→3→0)
pressCount = 0;
}
Serial.println(pressCount); // 串口输出计数值(用println,自动换行,更易读)
digitalWrite(LED_PIN, HIGH); // LED亮,提示按键按下
}
// 按键松开(高电平),LED熄灭
else if (currentKeyState == HIGH) {
digitalWrite(LED_PIN, LOW);
}
}
// 4. 更新上一次按键状态
lastKeyState = currentKeyState;
}
三、关键修改说明 & 使用注意事项
1. 按键输入优化:INPUT_PULLUP(上拉输入)
原代码用INPUT(浮空输入),需要外接上拉电阻 才能让按键松开时为高电平;修正为INPUT_PULLUP(Arduino 内部上拉),无需外接电阻,接线更简单:
- 按键一端接 5 号引脚,另一端直接接 GND 即可(按下时引脚为 LOW,松开为 HIGH)。
2. 完善按键消抖逻辑
采用时间戳消抖法 (millis ()),避免使用delay()导致程序阻塞,核心逻辑:
- 检测到按键电平变化时,重置时间戳;
- 只有电平稳定超过 200ms,才判定为有效按键操作;
- 仅在按键从松开→按下(下降沿)时计数,避免松手时重复计数。
3. 蓝牙 AT 指令核心修正
- 换行符必须用转义字符
\r\n(串口通信标准换行),原代码r n是普通字符,模块无法识别; - 延长指令延迟至 500ms(原 50ms 过短),蓝牙模块执行 AT 指令需要一定时间,过短会导致配置失败;
- 修正指令格式:
AT+AUTOIN 1→AT+AUTOIN1(多数蓝牙模块 AT 指令无空格,需匹配模块手册)。
4. 变量与逻辑优化
- 变量名从
i改为pressCount,语义更清晰,便于后期维护; - 计数逻辑:
1→2→3→0循环(与原需求一致),若想改为0→1→2→3,只需将pressCount++移到归 0 判断后:
cs
if (pressCount > 2) {pressCount = 0;}
pressCount++;
- 串口输出用
Serial.println()(自动换行),比Serial.print()更易读,蓝牙接收端也能清晰识别每次计数。
5. 缩进与语法修正
修复loop中else后的delay(200)缩进问题,改用非阻塞消抖 (millis ()),彻底去掉逻辑中的delay(),让程序响应更灵敏。
四、硬件接线(关键!)
- 按键:5 号引脚 → 按键一端,按键另一端 → GND(无需外接电阻);
- LED:使用 Uno 自带 LED(13 号引脚),无需额外接线;
- 蓝牙模块 (如 HC-05/HC-06):
- 蓝牙 TX → Arduino RX(0 号引脚,下载程序时需断开,否则串口冲突);
- 蓝牙 RX → Arduino TX(1 号引脚),需串联 1kΩ 电阻(蓝牙模块为 3.3V,Arduino TX 为 5V,防止烧模块);
- 蓝牙 VCC → 5V(部分模块为 3.3V,需看模块手册),GND → GND;
- 若蓝牙模块有 KEY 引脚,可接 3.3V(进入 AT 指令模式),配置完成后可悬空。
五、蓝牙模块配置注意事项
- 下载 Arduino 程序前,必须断开蓝牙模块与 Arduino TX/RX 的连接,否则串口被占用,程序下载失败;
- 确保蓝牙模块的初始波特率为 9600(若模块初始波特率不是 9600,需先单独用串口助手修改为 9600,再执行代码中的配置);
AT+BIND后的地址00,06,71,00,3B,AA是从机蓝牙模块的 MAC 地址,需替换为你实际的从机地址,否则无法绑定;- 若蓝牙配置失败,可单独用USB 转 TTL 模块连接蓝牙模块,通过串口助手手动发送 AT 指令测试,确认指令有效性。
六、代码测试效果
- 程序上电后,蓝牙模块自动执行 AT 指令配置,重启后进入主机模式,自动配对绑定的从机;
- 按一次按键 :LED 亮一下(松开后熄灭),串口 / 蓝牙输出
1; - 按第二次 :输出
2,LED 同步亮; - 按第三次 :输出
3,LED 同步亮; - 按第四次 :输出
0,LED 同步亮; - 按键无抖动,一次按下仅计数一次,松开后 LED 立即熄灭。
总结
- 原代码的核心问题是蓝牙 AT 指令格式错误 和无按键消抖,其次是缩进、输入模式的不规范;
- 修正后采用
INPUT_PULLUP上拉输入,无需外接电阻,接线更简单,时间戳消抖解决了按键抖动问题; - 蓝牙配置的关键是
\r\n换行符、足够的指令延迟、匹配的模块初始波特率和正确的从机 MAC 地址; - 计数逻辑为
1→2→3→0循环,可根据需求微调为0→1→2→3,串口 / 蓝牙输出清晰,LED 状态与按键同步。
你这份代码的核心需求是:把蓝牙模块配置为从机模式 (配合上一份的主机),通过串口 / 蓝牙接收数字指令1/2/3,分别控制 D9/D10/D11 引脚的 RGB 灯点亮红、绿、蓝单色,其他指令则让 RGB 灯全灭,同时依旧存在蓝牙 AT 指令格式错误、串口读取无缓冲、局部变量定义冗余、注释混乱等问题,会导致蓝牙配置失败、指令识别异常。
下面先指出核心问题,再给出可直接复制运行的修正版代码,补充 RGB 灯硬件接线、蓝牙配合使用的关键注意事项,兼顾代码规范性和实际实用性。
一、原代码的核心问题
- 蓝牙 AT 指令格式错误 :和上一份代码一样,换行符写成
r n,正确的是转义字符\r\n,模块无法识别 AT 指令,蓝牙配置完全失效; - 指令延迟过短 :蓝牙执行 AT 指令需要一定时间,原
delay(50)过短,易导致配置指令丢失; - 串口读取无防抖 / 缓冲 :蓝牙 / 串口传数据时可能有微小延迟,
Serial.read()单次读取易漏读,且无延迟过滤杂波; - 局部变量冗余 :
loop()中每次循环都重新定义int i=0; char a;,虽不影响功能,但属于不必要的冗余; - 注释混乱:部分注释行错位、无实际意义,RGB 灯的功能注释缺失;
- 指令鲁棒性低 :仅处理数字
1/2/3的 ASCII 码,若接收非数字字符,i=a-48会得到异常值,虽有default兜底,但可优化判断逻辑。
二、修正后的完整可运行代码
cs
// RGB灯引脚定义(PWM输出,需接支持模拟写的引脚:D9/D10/D11均支持)
const int RED_PIN = 9; // 红色LED接D9
const int GREEN_PIN = 10; // 绿色LED接D10
const int BLUE_PIN = 11; // 蓝色LED接D11
/**
* 蓝牙模块AT指令配置(从机模式)
* 适配HC-05/HC-06等蓝牙串口模块,核心:从机+自动配对+9600波特率+重启
*/
void setupBluetooth() {
Serial.print("AT+ROLE0\r\n"); // 设置为从机模式(正确换行:\r\n)
delay(500); // 延长延迟至500ms,确保指令执行
Serial.print("AT+AUTOIN1\r\n"); // 上电自动配对(原指令多空格,修正为无空格)
delay(500);
Serial.print("AT+BAUD4\r\n"); // 设置波特率9600(BAUD4对应9600,匹配模块手册)
delay(500);
Serial.print("AT+RESET\r\n"); // 重启模块,使配置生效
delay(2000); // 重启延迟2s,等待模块初始化
}
void setup() {
// 配置RGB灯引脚为输出模式
pinMode(RED_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
pinMode(BLUE_PIN, OUTPUT);
Serial.begin(9600); // 串口波特率9600,与蓝牙模块一致
setupBluetooth(); // 初始化蓝牙模块为从机
analogWrite(RED_PIN, 0); // 初始状态:RGB灯全灭
analogWrite(GREEN_PIN, 0);
analogWrite(BLUE_PIN, 0);
}
void loop() {
// 仅当串口/蓝牙有数据时,才执行读取和灯控逻辑
if (Serial.available() > 0) {
delay(10); // 短暂延迟10ms,等待数据完全接收,避免漏读
char recvChar = (char)Serial.read(); // 读取接收到的字符
int cmd = recvChar - '0'; // ASCII转数字('0'的ASCII是48,更直观)
// 根据指令控制RGB灯,仅响应1/2/3,其他情况全灭
switch(cmd) {
case 1: // 指令1:亮纯红
analogWrite(RED_PIN, 255);
analogWrite(GREEN_PIN, 0);
analogWrite(BLUE_PIN, 0);
break;
case 2: // 指令2:亮纯绿
analogWrite(RED_PIN, 0);
analogWrite(GREEN_PIN, 255);
analogWrite(BLUE_PIN, 0);
break;
case 3: // 指令3:亮纯蓝
analogWrite(RED_PIN, 0);
analogWrite(GREEN_PIN, 0);
analogWrite(BLUE_PIN, 255);
break;
default: // 其他指令/杂波:RGB灯全灭
analogWrite(RED_PIN, 0);
analogWrite(GREEN_PIN, 0);
analogWrite(BLUE_PIN, 0);
break;
}
// 可选:串口回显指令,方便调试
Serial.print("收到指令:");
Serial.println(cmd);
}
}
三、关键修改说明
1. 蓝牙 AT 指令核心修正(解决配置失效问题)
- 换行符改为串口标准转义字符
\r\n,这是蓝牙模块识别 AT 指令的必要条件; - 指令延迟从
50ms延长至500ms,避免模块因处理速度慢导致指令丢失; - 修正
AT+AUTOIN 1为AT+AUTOIN1(多数蓝牙串口模块的 AT 指令无空格,空格会导致指令无效); - 保留
AT+RESET和 2s 重启延迟,确保所有配置生效。
2. 串口读取优化(解决指令识别异常)
- 增加10ms 短延迟 :蓝牙 / 串口传输数据时,数据帧可能有微小延迟,单次
Serial.read()易漏读,短延迟确保数据完全接收; - 简化 ASCII 转数字:用
recvChar - '0'替代a-48,'0'的 ASCII 码本身就是 48,代码更直观、易读; - 移除冗余局部变量:把
i/a合并为recvChar/cmd,减少不必要的变量定义,代码更简洁; - 增加串口回显 :可选的
Serial.print("收到指令:"),方便通过 Arduino 串口监视器调试,确认是否正确接收指令。
3. 代码规范性优化
- 用
const定义引脚和固定参数,避免后续误修改; - 变量名语义化:
Red→RED_PIN、i→cmd,代码可读性大幅提升; - 补充清晰的功能注释:RGB 灯控制、蓝牙配置、串口处理的注释一目了然,方便后期修改;
- 初始化 RGB 灯为全灭状态,避免上电后灯常亮的问题。
4. 保留原核心逻辑
完全保留你原本的需求:指令 1 亮红、2 亮绿、3 亮蓝、其他全灭,未做额外修改,仅优化执行稳定性。
四、硬件接线(关键!必须按此接线,否则灯不亮 / 烧模块)
这份代码中 RGB 灯的引脚是PWM 输出 (D9/D10/D11 支持 Arduino Uno 的analogWrite),必须串联限流电阻,否则会烧毁 LED 灯珠,接线方式如下:
1. RGB 灯(共阴极 RGB 模块 / 独立三色 LED)【推荐,匹配代码逻辑】
- 红色 LED 正极 → 220Ω 限流电阻 → Arduino D9
- 绿色 LED 正极 → 220Ω 限流电阻 → Arduino D10
- 蓝色 LED 正极 → 220Ω 限流电阻 → Arduino D11
- RGB 灯公共负极(GND) → Arduino GND
2. 若为共阳极 RGB 模块(需修改代码)
如果你的 RGB 灯是公共正极,需将代码中255和0互换(比如亮红改为analogWrite(RED_PIN, 0); Green/Blue=255;),接线为:公共正极→5V,各颜色负极串电阻接对应引脚。
3. 蓝牙模块(从机,如 HC-05/HC-06)接线
和上一份主机代码的蓝牙接线一致,注意电平匹配(蓝牙模块为 3.3V,Arduino 为 5V):
- 蓝牙 TX → Arduino RX(D0,下载程序时必须断开,否则串口冲突)
- 蓝牙 RX → 1kΩ 限流电阻 → Arduino TX(D1,防止 5V 烧蓝牙 3.3V 引脚)
- 蓝牙 VCC → 5V(部分模块为 3.3V,看模块手册),蓝牙 GND → Arduino GND
- 蓝牙 KEY 引脚:若需手动进入 AT 模式接 3.3V,代码自动配置可悬空
五、与上一份「主机代码」的配合使用步骤
你上一份代码是蓝牙主机(按键计数发指令) ,这份是蓝牙从机(收指令控 RGB) ,两者配对后可实现主机按键→蓝牙发数字→从机收指令→RGB 灯变色,完整使用步骤:
- 先下载从机代码 :给接 RGB 灯的 Arduino 下载本修正版代码,下载前断开蓝牙模块与 RX/TX 的连接,下载完成后再接上;
- 再下载主机代码:给接按键的 Arduino 下载上一份修正的主机代码,同样先断蓝牙再下载;
- 上电配对 :两台 Arduino 同时上电,蓝牙主从机会自动配对 (因都配置了
AT+AUTOIN1),配对成功后蓝牙模块的指示灯会从快闪变为慢闪 / 常亮; - 测试功能 :按主机的 5 号引脚按键,主机蓝牙会发送
1/2/3/0,从机接收后:- 收到 1 → 红点亮;收到 2 → 绿点亮;收到 3 → 蓝点亮;
- 收到 0 → RGB 灯全灭(匹配 default 逻辑)。
六、常见问题排查
-
蓝牙无法配对:
- 检查主从机的蓝牙 MAC 地址:主机代码中的
AT+BIND地址必须是本从机蓝牙的 MAC 地址(需替换为实际地址); - 检查波特率:主从机均配置为 9600,且蓝牙模块初始波特率也为 9600(否则先用电平助手修改);
- 确认主从模式:主机是
AT+ROLE1,从机是AT+ROLE0,模式不能反。
- 检查主从机的蓝牙 MAC 地址:主机代码中的
-
RGB 灯不亮:
- 检查限流电阻:必须串联 220Ω~1kΩ 电阻,无电阻会烧 LED;
- 检查接线:确认是共阴极(匹配代码),若为共阳极需互换代码中的 0 和 255;
- 检查引脚:D9/D10/D11 是 Uno 的 PWM 引脚(带~标识),确保接对。
-
收不到指令 / 灯无反应:
- 下载程序前是否断开了蓝牙 RX/TX?未断开会导致串口被占用,程序下载失败;
- 打开 Arduino 串口监视器(波特率 9600),发送 1/2/3,看是否有回显,无回显则串口 / 蓝牙接线有问题;
- 检查蓝牙电平:RX 引脚是否串联了 1kΩ 电阻?直接接 5V TX 会烧蓝牙模块。
总结
- 本次修正的核心是修复蓝牙 AT 指令格式 (
\r\n换行 + 延长延迟)和优化串口读取(短延迟防漏读),解决了原代码蓝牙配置失效、指令识别异常的核心问题; - 代码完全保留你原本的 RGB 灯控制逻辑,仅做规范性和稳定性优化,且增加了串口回显方便调试;
- 硬件接线的关键是RGB 灯串限流电阻(共阴极) 、蓝牙 RX 串 1kΩ 电阻 、下载程序前断蓝牙串口;
- 与上一份主机代码配合时,只需保证主从模式正确、MAC 地址匹配、波特率一致,即可实现蓝牙无线控灯。
如果需要扩展功能(比如调灯光亮度、混合颜色),只需修改analogWrite的数值(0-255 可调亮度),并对应增加串口指令即可。
这两个修正后的 Arduino 程序配合蓝牙主从模块,共同实现了基于蓝牙无线通信的 "按键遥控 RGB 灯" 完整功能 :一台 Arduino 作为蓝牙主机 (带按键),另一台作为蓝牙从机 (带 RGB 三色灯),按下主机的物理按键,会通过蓝牙无线发送数字指令,从机接收指令后自动点亮对应颜色的 RGB 灯,全程无需有线连接,是典型的蓝牙无线串口通信控制案例。
核心改造思路
原方案是Arduino 主→蓝牙→Arduino 从 ,新方案是Arduino(蓝牙从机)→蓝牙→手机(蓝牙主机) ,之所以把 Arduino 设为蓝牙从机 ,是因为手机默认只能作为蓝牙主机搜索 / 连接外设,这是蓝牙串口通信的通用适配逻辑,改造后整体流程:
改造分 3 步完成(从硬件到软件,零基础可实现)
第一步:简化 Arduino 端代码(核心:按键发指令 + 蓝牙从机,去掉所有灯控逻辑)
保留原代码的按键消抖、计数发指令、蓝牙从机配置 核心,删除无关逻辑,代码更简洁、稳定,且无需额外硬件(仅 Arduino + 按键 + 蓝牙模块),以下是可直接用的改造后代码:
cs
// 引脚定义
const int KEY_PIN = 5; // 按键接D5,INPUT_PULLUP模式(仅接引脚+GND)
const unsigned long debounceDelay = 200; // 按键消抖200ms
// 全局变量
int pressCount = 0; // 按键计数(1→2→3→0循环)
bool lastKeyState = HIGH; // 消抖用:上一次按键状态
unsigned long lastDebounceTime = 0; // 消抖时间戳
/**
* 蓝牙模块配置:固定为从机模式(适配手机连接)
* 波特率9600+自动配对,手机蓝牙可直接搜索连接
*/
void setupBluetooth() {
Serial.print("AT+ROLE0\r\n"); // 必须设为从机(手机只能当主机)
delay(500);
Serial.print("AT+AUTOIN1\r\n"); // 自动配对,手机连接更顺畅
delay(500);
Serial.print("AT+BAUD4\r\n"); // 波特率9600,手机端需匹配
delay(500);
Serial.print("AT+RESET\r\n"); // 重启生效
delay(2000);
}
void setup() {
pinMode(KEY_PIN, INPUT_PULLUP); // 上拉输入,按键接线:D5→按键→GND
Serial.begin(9600);
setupBluetooth();
}
void loop() {
bool currentKeyState = digitalRead(KEY_PIN);
// 1. 按键消抖:电平变化时重置时间戳
if (currentKeyState != lastKeyState) {
lastDebounceTime = millis();
}
// 2. 有效按键:下降沿(按下)时发指令,仅一次触发
if ((millis() - lastDebounceTime) > debounceDelay) {
if (currentKeyState == LOW && lastKeyState == HIGH) {
pressCount++;
if (pressCount > 3) pressCount = 0; // 1→2→3→0循环
Serial.println(pressCount); // 蓝牙发送指令(带换行,手机端易解析)
}
}
lastKeyState = currentKeyState; // 更新按键状态
}
Arduino 硬件接线(和之前一致,极简):
- 按键:D5 → 按键一端,按键另一端 → GND(无外接电阻);
- 蓝牙模块(HC-05/HC-06 均可):
- 蓝牙 TX → Arduino RX(D0,下载程序时断开);
- 蓝牙 RX → 1kΩ 电阻 → Arduino TX(D1,防 5V 烧 3.3V 蓝牙);
- 蓝牙 VCC→5V,GND→Arduino GND;KEY 引脚悬空即可。
第二步:手机端蓝牙接收(通用方案,安卓 /iOS 均支持,安卓更易操作)
手机需要先连接 Arduino 的蓝牙模块 ,再用蓝牙串口 APP 接收 Arduino 发送的数字指令(1/2/3/0),这是手机端的 "数据中转站",推荐 2 个免费、好用的 APP,安卓优先用「Serial Bluetooth Terminal」,iOS 用「BlueTerm」,操作步骤通用:
- 手机打开蓝牙,搜索附近的蓝牙设备(蓝牙模块默认名称如「HC-05」「linvor」);
- 连接蓝牙模块,默认配对密码一般是
1234或0000(可通过 AT 指令修改); - 打开蓝牙串口 APP,选择已连接的蓝牙模块,设置波特率 9600(和 Arduino 一致),点击连接;
- 按下 Arduino 的按键,APP 的接收窗口会实时显示
1、2、3、0(循环),说明蓝牙通信成功!
第三步:手机端指令触发软件动作(核心实现:接收指令→执行 APP 操作)
这一步是按键遥控手机软件 的关键,核心是让手机 "识别蓝牙收到的 1/2/3/0,并触发对应软件的动作",分 **「简易快捷方案(免编程,适合新手)」和「自定义开发方案(可深度定制,适合有基础者)」**,优先推荐简易方案,零基础 5 分钟搞定。
方案一:简易快捷方案(免编程,安卓专属,推荐)
利用安卓的 **「自动化 APP」+「蓝牙串口 APP」** 的联动,实现 "蓝牙收到指令→触发手机自动化动作",无需写代码,支持控制几乎所有手机软件(打开 APP、点击按钮、发送消息、播放音乐等)。
所需工具(均为安卓免费 APP,应用商店可下)
- 蓝牙串口接收:Serial Bluetooth Terminal(第一步已用);
- 手机自动化:MacroDroid(或「Tasker」,MacroDroid 更简单,新手友好)。
核心原理
MacroDroid 可以监控手机的 "文本内容变化",我们让蓝牙串口 APP 把收到的指令(1/2/3/0)写入手机的「剪贴板」,再让 MacroDroid 监控剪贴板,识别到对应数字后执行预设动作。
具体操作步骤(以 MacroDroid 为例,控制微信发消息 + 打开抖音 + 播放音乐为例)
步骤 1:蓝牙串口 APP 设置(把收到的指令写入剪贴板)
打开「Serial Bluetooth Terminal」→ 右上角「设置」→ 找到「Output」(输出)→ 开启「Copy to clipboard」(复制到剪贴板)→ 保存设置,此时按下 Arduino 按键,指令 1/2/3/0 会自动写入手机剪贴板。
步骤 2:MacroDroid 创建自动化规则(监控剪贴板→执行动作)
MacroDroid 的核心是「触发器→条件→动作」,我们为每个指令(1/2/3/0)创建一条规则,以 **"识别到 1→打开微信"** 为例:
- 打开 MacroDroid→右下角「+」→创建新宏→命名为「打开微信」;
- 添加触发器:搜索「剪贴板」→选择「Clipboard Changed」(剪贴板变化);
- 添加条件:搜索「文本」→选择「Clipboard Contains」(剪贴板包含)→输入「1」→保存;
- 添加动作:搜索「应用」→选择「Launch App」(打开应用)→选择「微信」→保存;
- 启用该宏,此时蓝牙收到指令 1,手机会自动打开微信。
步骤 3:创建其他指令的规则(同理,按需定制)
- 指令 2→触发动作:搜索「媒体」→选择「Play Music」(播放音乐),可指定播放软件(如网易云、QQ 音乐);
- 指令 3→触发动作:搜索「应用」→选择「Launch App」→选择「抖音」;
- 指令 0→触发动作:搜索「媒体」→选择「Stop Music」(停止播放)+「Close App」(关闭抖音);支持的动作几乎无限制:打开任意 APP、点击手机屏幕指定位置、发送微信 / QQ 消息、调节音量、拍照、解锁屏幕等。
方案二:自定义开发方案(可深度定制,安卓 /iOS 均支持)
如果需要更个性化的功能(比如专属 APP 界面、自定义指令、精准控制软件内按钮),可以自己开发手机端 APP,适合有一点编程基础的同学,核心思路是开发一个集成「蓝牙串口通信」+「指令解析」+「APP 控制」的自定义 APP。
可选开发平台(零基础也能上手)
- MIT App Inventor (推荐,零基础可视化开发,安卓 /iOS 均可):
- 全图形化编程,无需写代码,拖拽组件即可实现蓝牙接收、指令解析、APP 控制;
- 内置「蓝牙串口」组件,可直接连接 Arduino 的蓝牙模块,内置「打开应用」「点击按钮」等动作组件;
- 开发完成后可直接生成 APK 安装包,安装到手机使用。
- Android Studio (原生开发,安卓专属):
- 用 Java/Kotlin 编写,需掌握基础安卓开发;
- 调用 Android 的「BluetoothSerial」蓝牙串口库实现数据接收,调用「Intent」实现打开 APP、触发动作;
- Xcode (原生开发,iOS 专属):
- 用 Swift 编写,需掌握 iOS 开发;
- 调用 iOS 的「CoreBluetooth」蓝牙框架实现数据接收,调用「UIApplication」实现 APP 控制。
开发核心逻辑(以 MIT App Inventor 为例,可视化)
- 拖拽「蓝牙串口」组件,设置波特率 9600,实现手机与 Arduino 蓝牙的连接和数据接收;
- 拖拽「文本解析」组件,解析收到的蓝牙数据(1/2/3/0);
- 拖拽「应用控制」组件,为每个数字指令绑定对应动作(打开 APP、发送消息等);
- 生成 APK,安装到手机,即可实现自定义的按键遥控手机软件功能。
关键注意事项(避坑必备)
- 蓝牙模式必须正确 :Arduino 的蓝牙模块必须设为从机(ROLE0),手机只能作为蓝牙主机,搜索连接外设,设为主机的话手机无法识别;
- 波特率严格匹配:Arduino 端(9600)、蓝牙串口 APP(9600)必须一致,否则会收到乱码,无法解析;
- 安卓 /iOS 差异 :iOS 对蓝牙的权限限制较严格,仅支持「MFi 认证」的蓝牙模块,安卓无限制,HC-05/HC-06 均可直接使用,新手优先用安卓手机;
- 动作触发权限:手机自动化 APP(MacroDroid/Tasker)需要开启「悬浮窗」「辅助功能」「应用权限」,否则无法触发控制其他软件的动作,开启后即可正常使用;
- 蓝牙连接稳定性:Arduino 的蓝牙模块建议接 5V 供电,避免供电不足导致连接断开,有效通信距离一般为 10-20 米(无遮挡)。
扩展功能(按需升级,超简单)
改造后的代码和方案可轻松扩展,实现更多按键遥控功能,仅需修改 Arduino 的计数逻辑和手机端的自动化规则:
- 增加按键:再接 1 个按键到 D6,实现 "不同按键触发不同动作"(比如 D5 控制社交软件,D6 控制媒体软件);
- 自定义指令:把数字指令改为字母 / 字符(比如 A/B/C/D),避免和其他数据冲突;
- 精准控制软件内动作:MacroDroid/Tasker 支持「模拟屏幕点击」,可实现 "打开微信→点击通讯录→点击好友→发送消息" 的精准操作;
- 反馈功能:给 Arduino 加一个 LED,手机端通过蓝牙发送反馈指令(如 "已执行"),让 Arduino 的 LED 亮灯,实现 "按键→执行→反馈" 的闭环。
核心总结
本次改造把原有的蓝牙主从机硬件互控 ,改成了Arduino 硬件→蓝牙→手机软件的遥控逻辑,核心关键点:
- Arduino 端必须将蓝牙设为从机模式,适配手机的蓝牙主机特性,代码简化为「按键消抖 + 计数 + 蓝牙发指令」;
- 手机端分两步:蓝牙串口 APP 接收指令 +自动化 APP 触发软件动作,简易方案免编程,新手也能快速实现;
- 支持控制几乎所有手机软件,动作可自由定制(打开 APP、发消息、播放音乐、拍照等),且硬件接线极简,无需额外配件。
这个改造是硬件外设与手机端联动的典型案例,后续可把 Arduino 的按键换成其他传感器(人体感应、温湿度传感器、红外感应),实现 "传感器触发→手机软件自动响应" 的更智能的功能(比如有人靠近→手机自动打开监控 APP)。