HC-05 蓝牙模块教程:用 Android 手机控制 Arduino

Smartphone controlling an Arduino Uno LED wirelessly through an HC-05 Bluetooth module with blue base board and green antenna daughter board

可以 — HC-05 能让任何一台 Android 手机通过蓝牙控制 Arduino Uno:用 PIN 码 1234 配对,接四根杜邦线加两个电阻,上传一个程序,再用一个免费的串口终端 App 就能开关 Uno 的 LED。买之前先把话说清楚:HC-05 是经典蓝牙,只支持 Android — 不支持 iPhone。

为什么 HC-05 支持 Android 却不支持 iPhone?

HC-05 的核心是一颗 BC417 射频芯片,走的是经典蓝牙 2.0+EDR 加串口协议(SPP) — 它不是 BLE(低功耗蓝牙)模块。Android 原生支持 SPP,所以 Android 手机连起来毫不费劲。Apple 那边则是另一回事:iOS 在 App 层面完全不支持经典蓝牙 SPP;经典蓝牙数据配件必须通过 Apple MFi 认证并使用 iAP2 协议,HC-05 两者都不是,所以 iPhone 无法使用这个模块。这是我们卖这颗模块见得最多的失望点,所以放在最前面讲清楚。

如果你的项目必须和 iPhone 通讯,请改用 BLE 串口模块,或者干脆选一块自带蓝牙的开发板。我们的 ESP32、ESP8266 与 Arduino Uno 对比解释了为什么 ESP32 自带的蓝牙是这里最自然的升级路线。

示意图:Android 手机成功连接 HC-05 蓝牙模块,而 iPhone 的连接被挡在门外
Android 原生就能连上 HC-05 的经典蓝牙 SPP;iOS 对非 MFi 硬件一律不放行,所以 iPhone 用不了这个模块。

分压电阻用

ItemPriceQty
400 pcs 1/4W Resistor Pack Resistor Kit 20 Common Value with 20 each400 pcs 1/4W Resistor Pack Resistor Kit 20 Common Value with 20 each400RPACRM7.95

分压电路需要一个 1k 和一个 2k 电阻。这盒 400 只装的电阻包两种都有,以后要用到的其他阻值也基本备齐了。

你还需要一块面包板和几根公对母杜邦线,整个项目免焊接就能完成,另外准备两个普通电阻(1kΩ 和 2kΩ)用来搭下面的分压电阻。

HC-05 怎么接到 Arduino Uno?

HC-05 模块有六根公排针:STATE、RX、TX、GND、VCC 和 EN。供电很简单 — 板子的 VCC 可接受 3.6–6V,因为板载稳压器会把它降到 3.3V,所以直接用 Uno 的 5V 引脚就行。真正要注意的是逻辑电平:HC-05 的 RX 引脚是 3.3V 逻辑,并不耐 5V,而 Uno 的输出是 5V。解决办法是用两个电阻搭一组分压电阻:Uno D3 → 1kΩ → HC-05 RX,再从 HC-05 RX 接一个 2kΩ 到 GND。这样 5V × 2000 ÷ (1000 + 2000) = 3.33V — 正好是这个引脚想要的电压。反方向上,HC-05 的 3.3V TX 信号足够让 Uno 直接读取,那一侧不需要分压。说句实话:不少教程直接省掉分压电阻,模块往往也能撑一阵子 — 但这个引脚的额定电压确实不是 5V,而正确的做法只花两个电阻的钱。

HC-05 引脚 接到 说明
VCC Uno 5V 板子可接受 3.6–6V;板载稳压器输出 3.3V。
GND Uno GND 共地。
TX Uno D2 3.3V 信号 — Uno 可以直接读取。
RX Uno D3 经 1kΩ,另加 2kΩ 接 GND 分压电阻把 Uno 的 5V 降到 3.3V。
STATE 不接 可选:手机连接期间输出高电平。
EN 不接 保持悬空 — 进 AT 模式请用板上的按钮。

以上全部在面包板上免焊完成。以后要把电路搬到永久板子上时,可以参考我们的排针焊接教程

Arduino Uno D3 引脚与 HC-05 蓝牙模块 RX 引脚之间两电阻分压电阻的接线图
保护 HC-05 的分压电阻:Uno D3 经 1k 接到 RX 引脚,再从 RX 经 2k 接到 GND —— 进来 5V,引脚上刚好 3.3V。

用什么 Arduino 代码让手机控制 LED?

HC-05 的数据不能占用 0、1 号引脚,所以程序用 SoftwareSerial 走 2、3 号引脚,把硬件串口留给上传程序和串口监视器。大多数 HC-05 克隆板出厂即为数据模式、9600 波特率。手机发 1,13 号引脚的板载 LED 点亮;发 0 熄灭;每次 Uno 都会把新状态回传给手机。

#include <SoftwareSerial.h>

// HC-05 TX -> Uno D2(直连),Uno D3 -> 1k/2k 分压电阻 -> HC-05 RX
SoftwareSerial bt(2, 3);  // RX, TX

const int LED_PIN = 13;   // Uno 板载 LED

void setup() {
  pinMode(LED_PIN, OUTPUT);
  Serial.begin(9600);     // USB 串口监视器
  bt.begin(9600);         // HC-05 数据模式(多数板子的默认值)
  bt.println("HC-05 ready. Send 1 for ON, 0 for OFF.");
}

void loop() {
  if (bt.available()) {
    char c = bt.read();
    if (c == '1') {
      digitalWrite(LED_PIN, HIGH);
      bt.println("LED ON");        // 把新状态回传给手机
      Serial.println("Phone sent 1 - LED ON");
    } else if (c == '0') {
      digitalWrite(LED_PIN, LOW);
      bt.println("LED OFF");
      Serial.println("Phone sent 0 - LED OFF");
    }
    // 其他字符(比如换行符)一律忽略
  }
}

LED 听话之后,同一句 digitalWrite 就能驱动更大的东西 — 把 13 号引脚换成继电器的信号引脚,手机就能开关一盏灯或一台水泵。动手之前请先读我们的继电器模块安全指南,尤其是市电那一节。

Android 手机怎么连接 HC-05?

HC-05 的连接分两步,跳过第一步是“App 找不到设备”最常见的原因。第一步先在 Android 系统里配对:设置 → 蓝牙 → 扫描 → 点 HC-05 → 输入 PIN 码 1234(少数批次是 0000)。配对只是让两台设备互相认识 — 此时什么都还没连上。

第二步在串口终端 App 里建立连接。我们推荐 Google Play 上 Kai Morich 出品的 Serial Bluetooth Terminal — 它支持经典蓝牙 SPP,正是 HC-05 用的协议。在 App 里打开 Devices → Bluetooth Classic,点 HC-05,显示已连接后,输入 1 并发送 — Uno 的 LED 亮起,终端里同时收到“LED ON”。

想先完整看一遍流程再动手?这段视频演示了类似的接线、类似的程序和 App 配对全过程:

怎么进入 AT 模式给 HC-05 改名或改设置?

HC-05 的各项设置 — 名称、PIN 码、波特率 — 都要在 AT 指令模式里改,而这也是最多人卡住的地方。诀窍全在时机:先按住板上的小按钮,再接通电源,然后松开。状态 LED 会变成慢闪 — 大约每两秒一次,而不是平时的快闪 — 那就是 AT 模式;用这种方式进入时波特率固定为 38400,与你的数据模式设置无关。

上传下面这个桥接程序(接线和上面完全一样),然后按住按钮给 HC-05 重新上电:

#include <SoftwareSerial.h>

SoftwareSerial bt(2, 3);  // RX, TX

void setup() {
  Serial.begin(9600);     // 串口监视器这一侧
  bt.begin(38400);        // AT 模式固定 38400 波特率
}

void loop() {
  // 在串口监视器和 HC-05 之间双向转发所有数据
  if (bt.available()) Serial.write(bt.read());
  if (Serial.available()) bt.write(Serial.read());
}

以 9600 波特率打开串口监视器,并把行尾设置为 Both NL & CR — 没有回车加换行,HC-05 会无视所有指令。输入 AT,应该收到 OK。常用指令:

指令 作用 示例
AT 连接测试 — 回复 OK AT
AT+NAME= 给模块改名(下次手机扫描时生效) AT+NAME=MyRobot
AT+PSWD= 修改配对 PIN 码 AT+PSWD=4321
AT+UART= 设置数据模式的波特率、停止位、校验位 AT+UART=9600,0,0

两个小怪癖:很多板子上,查询类指令(例如 AT+NAME?)只有按住按钮时才会应答;另外克隆板固件版本之间略有差异 — 如果一条看起来没问题的指令返回 ERROR,就按住按钮再发一次。改完了?不按按钮重新上电,模块就回到数据模式。

手指按住 HC-05 蓝牙模块上的小按钮同时接通电源,以进入 AT 指令模式
进入 AT 模式全靠时机:先按住按钮,再接通电源。LED 变成约两秒一次的慢闪,就说明已经进入,波特率为 38400。

真实客户最常踩的几个坑

我们收到的 HC-05 求助,几乎都绕不开下面这几个问题。

  1. 买来想配 iPhone 用。HC-05 是经典蓝牙 SPP,iOS 不会连接它。只支持 Android — iPhone 项目请选 BLE 或 ESP32。
  2. 用错波特率。多数板子的数据模式是 9600;AT 模式固定 38400。出现乱码或完全没反应,基本都是这两个搞反了。
  3. TX 接 TX、RX 接 RX。串口线要交叉:模块的 TX 接到程序里负责读取的 Uno 引脚(D2),模块的 RX 接程序里负责发送的引脚(D3,经过分压电阻)。
  4. 以为配对就等于连接。在 Android 设置里配对只是第一步 — 必须由串口终端 App 打开与已配对 HC-05 的连接,一切才会开始工作。
  5. 发 AT 指令时没加 NL & CR。串口监视器行尾设成“No line ending”时,HC-05 会无视一切,新手常常以为模块坏了。

常见问题

HC-05 可以配 iPhone 用吗?

不可以。HC-05 走的是经典蓝牙 SPP,而 iOS 在 App 层面完全不支持经典蓝牙 SPP;经典蓝牙数据配件必须通过 Apple MFi 认证,HC-05 并没有这个认证。iPhone 项目请改用 BLE 串口模块,或选择 ESP32 这类自带蓝牙的开发板。

为什么手机能和 HC-05 配对,App 却连不上?

配对和连接是两个独立的步骤。在 Android 设置里配对之后,还必须在串口终端 App 里打开连接。另外检查是不是有别的 App 已经占着连接 — HC-05 一次只接受一个连接。

为什么 AT 模式下出现乱码,或者收不到 OK?

基本都是波特率或行尾设置的问题。AT 模式固定在 38400 波特率,跟你的数据模式波特率无关;串口监视器必须发送 Both NL & CR。把这两项改对,AT 就会回复 OK。

HC-05 和 HC-06 有什么区别?

HC-05 可以当主机也可以当从机,AT 指令集更完整;HC-06 只能做从机,指令也更少。像本文这种手机控制 Arduino 的项目,两者表现完全一样 — 反正手机都是主机。

HC-05 的传输距离有多远?

它是 Class 2 蓝牙设备,标称空旷环境约 10 米。实际使用中墙壁和干扰会让距离缩水,所以把它当作同一个房间内的距离,别指望覆盖整栋屋子。

最后更新:2026年8月。有问题?WhatsApp 联系我们

Leave a Reply

Your email address will not be published. Required fields are marked *