HC-05 Bluetooth + Arduino: управление со смартфона
HC-05 самый дешёвый способ подружить Arduino со смартфоном. Модуль построен на чипе BC417, поддерживает Bluetooth 2.0 с профилем EDR, и работает как серийный порт: то, что приходит по UART в модуль, приходит в телефон. На большинстве плат-адаптеров уже стоит стабилизатор на 3.3 В, поэтому питать можно от 5 В.
Подключение сводится к двум проводам данных и двум проводам питания. Дальше нужен телефон с приложением-терминалом и скетч, который читает символы из SoftwareSerial. Такой скетч-каркас полностью проверяется в нашем симуляторе Arduino, команды можно слать через Serial Monitor вместо Bluetooth-приложения.
Слабое место у HC-05 одно: модуль не умеет Bluetooth Low Energy и не умеет аудио. Зато он умеет ровно то, что нужно для управления платой с телефона, и стоит дешевле любого BLE-модуля.
Грабль номер один: TX и RX
Подключение UART всегда идёт крест-накрест: TX модуля в RX платы, RX модуля в TX платы. На платах HC-05 выходы подписаны как TXD и RXD, то есть относительно самого модуля. Если модуль не отвечает ни на что, первым делом стоит проверить, не воткнули ли вы TXD модуля в TX платы.
На Arduino Uno и Nano аппаратный UART один, и он же занят USB, поэтому HC-05 вешают на программный порт. В коде это SoftwareSerial bt(10, 11), где первая цифра это RX платы, а вторая TX. Пины D10 и D11 в Arduino Uno идут за SPI, так что если вы в том же проекте используете карту SD или дисплей, берите другие свободные пины, например D2 и D3. На Mega и Leonardo есть несколько аппаратных UART, и там модуль лучше сажать на Serial1.
AT-команды: имя, пин, скорость
Чтобы поменять имя устройства, пин-код или скорость, модуль переводят в режим AT-команд: при подаче питания удерживают кнопку на плате либо подтягивают пин KEY в HIGH. Индикатор при этом мигает медленно, примерно 2 раза в секунду. В обычном режиме он мигает часто, около 10 раз в секунду. В терминале отправляют AT и модуль отвечает OK. Дальше AT+NAME=MyArduino задаёт имя, AT+PSWD=1234 пин-код, AT+UART=9600,0,0 скорость данных, AT+RESET перезагружает модуль с новыми настройками.
Грабль: команда обязана заканчиваться переносом строки, то есть двумя символами CRLF. Без них модуль молчит и выглядит как сломанный. Второй момент со скоростью: у большинства модулей режим AT работает на 38400 бод, а у части на 9600. Если на 38400 ответа нет, попробуйте 9600, и наоборот. После AT+UART скорость данных меняется, и в обычном режиме модуль будет говорить на новой.
#include <SoftwareSerial.h>SoftwareSerial bt(10, 11); // RX=10, TX=11void setup() { Serial.begin(9600); bt.begin(9600); pinMode(13, OUTPUT);}void loop() { if (bt.available()) { char c = bt.read(); if (c == '1') digitalWrite(13, HIGH); else if (c == '0') digitalWrite(13, LOW); Serial.print(c); }}Приложение на смартфоне подойдёт любое из класса Bluetooth Terminal: подключаетесь к устройству по пин-коду, печатаете символ, и он тут же прилетает в Arduino. Вариант посложнее: приложение отправляет не символ, а целую команду с переводом строки, тогда в скетче удобнее читать строку целиком и разбирать её через parseInt. Подробнее про разбор чисел из Serial — в уроке про Serial.
Ограничение SoftwareSerial стоит помнить: над 38400 бод программный порт начинает терять байты, потому что он работает на прерываниях и делит один таймер с millis и delay. На 9600 и 19200 бод потери не бывает. Если нужна высокая скорость, переходите на аппаратный Serial1 плат Mega и Leonardo.
| Параметр | HC-05 (master/slave) | HC-06 (slave only) |
|---|---|---|
| Режим | Master + Slave | Только Slave |
| AT-команды | Полный набор | Только часть |
| Сопряжение | Может инициировать | Ждёт подключения |
| Стоимость | ~200 руб | ~150 руб |
Что сначала не получилось
Первый вечер ушёл на то, чтобы модуль вообще замолчал. Я подал AT-команду через монитор порта, не добавив перевод строки, и решил, что модуль сломан. На самом деле он был исправен: без CRLF он просто не видел команду. Когда я перевёл отправку в Serial.println с явным , модуль ответил OK сразу.
Второй затык был со скоростью. Я подключил модуль, открыл Bluetooth Terminal и отправлял команды, но они не доходили. Оказалось, что телефон общается с модулем на 9600 бод, а в скетче у меня стояло 38400. Программный порт при такой скорости уже теряет байты. Как только обе стороны выровнялись на 9600, управление заработало.
Личный опыт: управление выключателем со смартфона
Первая настоящая вещь на HC-05 была самодельная лампа: реле на мобильном модуле, кнопка в приложении, состояние лампы возвращается назад строкой. Скетч держал в Serial эхо того, что пришло из Bluetooth, и по нему было видно, какие символы реально долетают. Так и выяснилось, что при переносе строки терминал присылает 0x0D и 0x0A, а скетч ловил только 0x0A, из-за чего команды на втором символе рассыпались.
Дальше модуль переехал на свободный от SPI пин, скорость закрепилась на 9600 бод, а светодиод на 13 пине стал индикатором приёма. Расстояние до телефона в квартире не превышало 10 метров, и связь не рвалась: это заявленный класс радиомодуля. Скорость 9600 бод при этом даёт около 960 байт в секунду, чего хватает на команды и телеметрию, но совсем не хватает на поток данных с датчиков.
Авторская позиция: что взять новичку
Берите HC-05, а не HC-06, если хотите заранее иметь возможность самому инициировать сопряжение, например чтобы телефон подключался к автомобилю в машине без лишних кнопок. Скорость выставляйте 9600 бод и не трогайте её без нужды: программный порт Arduino не вытянет больше, а разница в скорости для команд не имеет значения. Отдельно стоит посмотреть, есть ли на вашей плате вывод KEY: если есть, AT-режим включается без кнопки, удобнее для отладки. А для проектов, где нужен именно BLE и экономия энергии, берите ESP32: в нём этот радиомодуль уже есть.