HC-05: Bluetooth как Serial-кабель
HC-05 — Bluetooth-модуль, который превращается в беспроводной UART-мост: всё, что приходит в его TX — видно на телефоне, всё, что пишет телефон — приходит в его RX. Для кода на Arduino это выглядит как обычный Serial — Bluetooth-протокол полностью скрыт.
HC-05 может быть и мастером, и слейвом (AT-настраивается). HC-06 — упрощённый, только слейв. Для подключения к телефону разницы нет.
Подключение
HC-05 VCC ── 5V (модуль с платой берёт 5В, сам преобразует)
HC-05 GND ── GND
HC-05 TX ── Arduino D2 (RX)
HC-05 RX ── делитель 5В→3.3В ── Arduino D3 (TX)
Критично: HC-05 работает на 3.3 В логике. TX Arduino (5 В) на RX модуля — через делитель 1к+2к. Модули с платой часто имеют стабилизатор и частичную защиту, но делитель на RX — лишняя страховка.
Аппаратный Serial (D0/D1) занят USB — для модуля берём SoftwareSerial на свободных пинах.
Первый код: управление с телефона
#include <SoftwareSerial.h>
SoftwareSerial bt(2, 3); // RX, TX
const int LED = 13;
void setup() {
pinMode(LED, OUTPUT);
Serial.begin(9600);
bt.begin(9600); // у HC-05 по умолчанию 9600 для данных
Serial.println("жду команду по Bluetooth...");
}
void loop() {
if (bt.available()) {
char cmd = bt.read();
Serial.print("команда: "); Serial.println(cmd);
if (cmd == '1') digitalWrite(LED, HIGH);
if (cmd == '0') digitalWrite(LED, LOW);
}
// двусторонне: печатаем на телефон
if (Serial.available()) {
bt.write(Serial.read());
}
}
На телефон ставите Bluetooth Terminal (или любое BLE/UART-приложение), спариваетесь с HC-05 (PIN по умолчанию 1234), шлёте «1»/«0» — светодиод включается/выключается.
AT-режим: имя, PIN, скорость
Для настройки модуля его вводят в AT-режим: зажимаете кнопку на модуле при подаче питания (или подтягиваете KEY к 3.3V) — светодиод мигает медленно (~2 с). В AT-режиме скорость 38400:
SoftwareSerial bt(2, 3);
void setup() {
bt.begin(38400); // AT-режим!
}
// шлём в мониторе:
// AT — ответит OK
// AT+NAME? — текущее имя
// AT+NAME=MyRobot — сменить имя
// AT+PSWD=4321 — PIN
// AT+UART=9600,0,0 — скорость данных
Полезные команды: AT+ROLE? (0=слейв, 1=мастер), AT+ADDR? (адрес), AT+VERSION?, AT+ORGL (сброс в дефолт).
Управление несколькими устройствами
Командная строка удобнее одиночных символов:
String cmd;
void loop() {
while (bt.available()) {
char c = bt.read();
if (c == '\n') { process(cmd); cmd = ""; }
else cmd += c;
}
}
void process(String s) {
if (s == "led on") digitalWrite(13, HIGH);
if (s == "led off") digitalWrite(13, LOW);
if (s.startsWith("servo ")) {
int angle = s.substring(6).toInt();
myservo.write(angle);
}
}
Телефон шлёт «led on», «servo 90» — Arduino парсит и выполняет.
Датчики → телефон
Обратное направление — телеметрия:
void loop() {
float t = dht.readTemperature();
bt.print("T:"); bt.println(t);
delay(2000);
}
Bluetooth-приложение (или самописное на MIT App Inventor) рисует график в реальном времени.
HC-05 vs BLE-модули (HM-10, ESP32)
HC-05 — классический Bluetooth 2.0 SPP: просто, но жрёт энергию и работает только с Android (iOS не поддерживает SPP без MFi). Для iPhone — BLE-модули HM-10 или ESP32 со встроенным BLE. ESP32 вообще имеет и классический Bluetooth, и BLE — универсальнее.
Типичные проблемы
- Не спаривается: PIN не тот (попробуйте 0000/1234), модуль в AT-режиме (мигает медленно).
- Спарился, но данных нет: скорость bt.begin не совпадает с настроенной UART (по умолчанию 9600).
- Мусор в терминале: перепутаны RX/TX, оба конца на разных скоростях.
- AT не отвечает: модуль не в AT-режиме (нужна кнопка при включении), скорость не 38400.
- 5В на RX убил модуль: делитель напряжения обязателен для TX Arduino → RX HC-05.
Итог
HC-05 — простейший способ беспроводного управления: SoftwareSerial на двух пинах, телефон через Bluetooth Terminal, команды — обычным текстом. Правила: делитель на RX модуля, AT-режим на 38400, PIN 1234 по умолчанию. Дальше — пульт для робота, телеметрия с датчиков, умный дом с телефона.
Полный проект: машинка на Bluetooth
#include <SoftwareSerial.h>
SoftwareSerial bt(2, 3); // RX=D2, TX=D3
const int M1_F = 5, M1_B = 6, M2_F = 9, M2_B = 10; // драйвер моторов
void setup() {
for (int p : {M1_F, M1_B, M2_F, M2_B}) pinMode(p, OUTPUT);
bt.begin(9600);
Serial.begin(9600);
}
void loop() {
if (bt.available()) {
char c = bt.read();
if (c == 'F') forward();
else if (c == 'B') backward();
else if (c == 'L') left();
else if (c == 'R') right();
else if (c == 'S') stop();
}
}
На телефоне — Bluetooth-джойстик (Arduino Bluetooth Controller и подобные) с кнопками-направлениями, шлёт F/B/L/R/S.
Двусторонний обмен
// Arduino шлёт данные на телефон
bt.print("T:"); bt.print(temp); bt.print(",");
bt.print("B:"); bt.println(battery);
Приложение парсит T:23.5,B:87 и рисует панель.
HC-05 в режиме мастера
HC-05 может сам подключаться к слейву (другому HC-05/HC-06) — пара устройств «напрямую». В AT-режиме:
AT+ROLE=1 // мастер
AT+CMODE=1 // connect to any
AT+BIND=xxxx:xx:xxxxxx // адрес слейва (получен AT+ADDR? на слейве)
Приложения для телефона
- Bluetooth Terminal — текстовый терминал, команды и ответы.
- Arduino Bluetooth Controller — кнопки/джойстик.
- MIT App Inventor — сделайте своё приложение с кнопками и графиками за вечер.
Безопасность
HC-05 спаривается стандартным PIN — меняйте AT+PSWD с заводского 1234. Сосед в зоне досягаемости может спариться и управлять вашим устройством — для продукта используйте BLE с pairing или обфускацией команд.
Частые ошибки
- RX модуля на 5 В — умирает со временем; делитель обязателен.
- Скорость не совпадает — 9600 данные / 38400 AT по умолчанию.
- PIN неверный — попробуйте 0000/1234/1111.
- AT-режим не входит — кнопка KEY при включении питания.
- iOS не видит — классический SPP не поддерживается, нужен BLE (HM-10, ESP32).
Полный проект: машинка на Bluetooth
#include <SoftwareSerial.h>
SoftwareSerial bt(2, 3);
const int M1_F = 5, M1_B = 6, M2_F = 9, M2_B = 10;
void setup() {
for (int p : {M1_F, M1_B, M2_F, M2_B}) pinMode(p, OUTPUT);
bt.begin(9600);
}
void loop() {
if (bt.available()) {
char c = bt.read();
if (c == 'F') forward();
else if (c == 'B') backward();
else if (c == 'L') left();
else if (c == 'R') right();
else if (c == 'S') stop();
}
}
HC-05 в режиме мастера
AT+ROLE=1 // мастер
AT+CMODE=1 // connect to any
AT+BIND=xxxx:xx:xxxxxx // адрес слейва
Приложения для телефона
- Bluetooth Terminal — текстовый терминал.
- Arduino Bluetooth Controller — кнопки/джойстик.
- MIT App Inventor — своё приложение за вечер.
Частые ошибки
- RX модуля на 5 В — делитель обязателен.
- Скорость не совпадает — 9600 данные / 38400 AT.
- PIN неверный — 0000/1234/1111.
- iOS не видит — классический SPP не поддерживается.