Подсветка на шкафу, скетч-пульт из урока про светодиод и монитор — и полтора метра USB-кабеля в натяг. Однажды я дёрнул ноутбук ближе к дивану, штекер выскочил, и пульт умер на середине команды. Serial есть Serial: он начинается там, где воткнут кабель, и ни на сантиметр дальше.
HC-05 закрывает это без проводов: Bluetooth-модуль, который для скетча выглядит как ещё один Serial. Вы пишете bt.println(...) — байты улетают в эфир; всё, что телефон напечатал в Bluetooth-терминал, падает в bt.available(). Радиус — метров десять у классических плат, скорость скромная, но для команд on/off и показаний датчиков хватает с запасом. В этом уроке вешаем HC-05 на SoftwareSerial из прошлого урока про второй порт, спариваем модуль с телефоном и переносим по воздуху весь командный словарь, который мы собирали в уроке про парсер.
Одна оговорка, чтобы вы не купили не то. HC-05 — это классический Bluetooth 2.0 с профилем SPP (Serial Port Profile): телефон воспринимает его как последовательный порт, и Bluetooth-терминалы к нему подключаются без танцев. Новые дешёвые модули — HC-08, JDY-19 и прочие с BLE на борту — часто требуют отдельных приложений и другого протокола: обычный терминал к ним либо не подключится вовсе, либо подключится и молчать. На плате HC-05 шесть ног в ряд и кнопка на борту у большинства версий — проверяйте перед покупкой, иначе урок про второй порт рискует превратиться в урок про возврат посылки.
Шесть проводов и один делитель
Схема — крест-накрест из прошлого урока плюс одна тонкость. TXD модуля идёт в пин 10 (RX скетча) напрямую: модуль выдаёт 3,3 вольта, а порог HIGH у ATmega — 0,6 от питания, то есть 3,0 вольта при пяти — проходит, хотя и с запасом всего в одну десятую вольта. А вот RXD модуля кормим через делитель: вход рассчитан на 3,3 В, а Uno выдаёт честные пять. Резистор 1 кОм от пина 11 к RXD и 2 кОм от RXD к земле: 5 × 2 / (1 + 2) = 3,33 В. Номиналы и цветовые полоски, по которым их находят в коробке не глядя, — в уроке про цветовой код резисторов.
Питание проще: VCC — на 5 В, на плате модуля стоит свой стабилизатор; голые платы без обвязки — редкость, но надпись на обратной стороне стоит проверить — там бывает напечатано LEVEL 3.3V, и такой вход пяти вольт не простит. GND — общий с платой: без общей земли порт читает кашу. Нога EN/KEY пока в покое — она нужна только режиму настройки из следующего урока. Нога STATE дублирует светодиод высоким уровнем, когда пара установлена, — на неё удобно повесить индикаторный огонёк.
| Нога HC-05 | Куда на Uno | Зачем / нюанс |
|---|---|---|
| VCC | 5 В | на плате модуля свой стабилизатор; голую плату так кормить нельзя |
| GND | GND | общая земля обязательна, иначе каша в порту |
| TXD | пин 10 (RX) напрямую | 3,3 В от модуля ATmega читает как HIGH |
| RXD | пин 11 (TX) через делитель 1 кОм + 2 кОм | вход модуля — 3,3 В; пять вольт напрямую он живёт недолго |
| EN/KEY | пока не подключаем | нужен только режиму AT из следующего урока |
| STATE | по желанию | HIGH при установленной паре — готовый сигнал индикатору |
Пара с телефоном
Включаете плату — светодиод модуля мигает быстро, раза два в секунду: модуль раздаёт имя HC-05 и ждёт пару. В настройках Bluetooth телефона ищете устройство с этим именем, PIN заводской — 1234 (на части модулей 0000). Пара установилась — характер мигания меняется: двойные короткие вспышки с паузой. С телефона ставьте любой Bluetooth-терминал: на Android я живу в Serial Bluetooth Terminal — это ваш монитор порта, только беспроводной.
Скорость. HC-05 из коробки в режиме данных разговаривает на 9600 бод — та же цифра, что мы ставили в самом первом уроке про монитор порта. bt.begin(9600) — и стороны договорились. Менять её можно командой AT+UART, но сначала дважды посчитайте: SoftwareSerial выше 38400 на приёме сыплет битыми байтами, а для команд и датчиков 9600 за глаза.
Скетч — пересадка парсера. Лампа с ШИМ остаётся на пине 9, яркость правим командой yark 0–255 через analogWrite — сам механизм разобран в уроке про ШИМ. Разница с настольной версией в одном: все чтения и ответы идут через bt, то есть в телефон, а не в монитор компьютера. Строка, обрывающая команду на переводе строки, — bt.readStringUntil(10), как родная.
#include <SoftwareSerial.h> SoftwareSerial bt(10, 11); // RX, TX: 10 - от модуля, 11 - к модулюconst int PIN_LAMPA = 9;int pwm = 0; int kodKomandy(String slovo) { if (slovo == "on") return 1; if (slovo == "off") return 2; if (slovo == "yark") return 3; return 0;} void setup() { bt.begin(9600); // заводская скорость HC-05 в режиме данных pinMode(PIN_LAMPA, OUTPUT); bt.println("Lampa na 9. Komandy: on, off, yark 0-255");} void loop() { if (bt.available() > 0) { String cmd = bt.readStringUntil(10); cmd.trim(); int probel = cmd.indexOf(" "); String slovo = cmd; String param = ""; if (probel > 0) { slovo = cmd.substring(0, probel); param = cmd.substring(probel + 1); } switch (kodKomandy(slovo)) { case 1: pwm = 255; analogWrite(PIN_LAMPA, pwm); bt.print("OK on: svet="); bt.println(pwm); break; case 2: pwm = 0; analogWrite(PIN_LAMPA, pwm); bt.println("OK off: svet=0"); break; case 3: { int yarkost = param.toInt(); if (yarkost >= 0 && yarkost <= 255) { pwm = yarkost; analogWrite(PIN_LAMPA, pwm); bt.print("OK yark: svet="); bt.println(pwm); } else { bt.print("ERR diapazon: svet="); bt.println(yarkost); } break; } default: bt.println("ERR: neizvestnaya komanda"); break; } }}Грабли по воздуху
Светодиод мигает, телефон пишет «подключено», а скетч молчит — самый частый звонок в ночь после сборки. В семи случаях из десяти это перепутанные TXD и RXD: пара устанавливается на уровне Bluetooth, ей провода безразличны, а вот байты по кресту не идут. Вторая по частоте — забытый делитель: вход модуля с пятью вольтами напрямую работает неделями, а потом не работает вовсе, и без мультиметра причину уже не найти.
Третья грабля — питание. HC-05 охотно заводят с пина 3.3V Arduino — и потом ловят перезагрузки модуля в момент старта передатчика: радиомодуль в импульсе ест больше, чем стабилизатор платы успевает отдать. Симптом узнаваемый: модуль работает от отдельного источника и не работает от платы. Я ставлю конденсатор 100 мкФ прямо на ноги питания модуля — этого хватает на моей макетке; если лампа дальнобойная и питание проседает сильнее, кормлю модуль отдельно, а земли всё равно свожу в одну точку. И держите в голове соседа по прилавку HC-06: снаружи одинаковые, внутри другой чип — только slave, другой синтаксис настроек, без мастера и без AT+NAME в том виде, как здесь. Урок про второй порт переносится на него почти целиком, а вот следующий — нет.
Ещё одна грабля ждёт тех, кто решит «заодно и настроить». В установленной паре модуль прозрачен, как провод: AT-команды, посланные в bt, не командуют модулем — они улетают на телефон как текст. Режим настройки включается отдельно, кнопкой EN или пином KEY, и живёт на скорости 38400 — этому целиком посвящён следующий урок про AT-команды, там же таблица команд.
Симулятор: воздух без воздуха
Bluetooth в движке симулятора не поддержан, и это честно записано в его ограничения. Тренажёр проверяет другую половину урока — протокол и логику «пара есть / пары нет». Строка ввода монитора изображает Bluetooth-терминал телефона, а тумблер D2 играет ногу STATE: вверх — пара установлена, вниз — модуль молчит, как и в жизни до спаривания. Наберите on и «Отправить» при опущенном тумблере, затем поднимите его и повторите — разница между «ушло в эфир» и «ушло в пустоту» видна сразу.
За кадром остаются радиочасть и провода — их проверяет только реальная макетка. Зато логика ответов здесь та же, что в скетче для платы: OK с фактом в формате имя=значение, ERR с диагнозом и тишина, когда пара не установлена. Перенесите скетч из код-блока выше на Uno с HC-05 — и телефон станет пультом подсветки: тем же словарём, теми же ответами, без единой правки парсера.
- Пересчитайте делитель для другой пары номиналов — например, 4,7 кОм сверху и 10 кОм снизу: сколько вольт придёт на RXD и годится ли это модулю.
- Добавьте в словарь команду stat, отвечающую двумя парами: svet= с текущим pwm и para= с digitalRead(PIN_STATE). Проверьте в симуляторе при поднятой и опущенной паре.
- Посчитайте: команда yark 128 — восемь символов. Сколько миллисекунд она едет на 9600 бод и успевает ли канал за вашим темпом нажатий?
- На реальной плате снимите питание с Arduino и верните: переподключается ли телефон сам, и что показывает светодиод модуля в каждую из фаз.
- Найдите в Bluetooth-терминале настройку окончания строки и выставьте Newline: без него парсер получит хвост после команды и ответит ERR — та же грабля, что с монитором порта.
- HC-05 — это Serial по воздуху: bt.println уходит в эфир, Bluetooth-терминал телефона печатает в bt.available()
- Крест-накрест: TXD → пин 10 напрямую, RXD → пин 11 через делитель 1 кОм + 2 кОм (5 В превращаются в 3,33 В)
- Заводская скорость данных — 9600 бод, PIN пары — 1234; быстрое мигание — ждёт пару, двойные вспышки — пара есть
- Командный словарь пересаживается с Serial на bt сменой имени объекта: парсер, ответы OK/ERR и плоттер работают без переделки
- В установленной паре модуль прозрачен: AT-команды по воздуху не работают — для настройки нужен режим AT из следующего урока
- 1. Зачем делитель из 1 кОм и 2 кОм на линии RXD модуля?
- 2. Светодиод HC-05 мигает двойными короткими вспышками с паузой. Что это значит?
- 3. Вы отправили AT+NAME=Test в bt при установленной паре. Что произойдёт?
- 4. Какая скорость у HC-05 по умолчанию в режиме данных?
- 5. Ответы парсер печатает в bt, а не в Serial. Где их смотреть?
Частые вопросы по теме урока
- Зачем делитель из 1 кОм и 2 кОм на линии RXD модуля?
- 5 × 2/(1+2) = 3,33 В — безопасное питание для входа модуля. На TXD делитель не нужен и даже вреден: он занижает и без того скромные 3,3 В. Вход модуля рассчитан на 3,3 В, а Uno выдаёт 5 В: делитель даёт 3,33 В
- Светодиод HC-05 мигает двойными короткими вспышками с паузой. Что это значит?
- Быстрое мигание — модуль раздаёт имя и ждёт пару. Двойные вспышки с паузой — пара установлена; нога STATE при этом поднята высоко. Пара установлена, канал данных открыт
- Вы отправили AT+NAME=Test в bt при установленной паре. Что произойдёт?
- В режиме данных HC-05 — просто провод между скетчем и телефоном. Команды настройки живут только в отдельном режиме AT на скорости 38400. Строка улетит на телефон как обычный текст: в паре модуль прозрачен
- Какая скорость у HC-05 по умолчанию в режиме данных?
- Заводская скорость данных — 9600 бод, поэтому bt.begin(9600) договаривается с модулем сразу. 38400 — это скорость режима AT, она отдельно и всегда. 9600 бод
- Ответы парсер печатает в bt, а не в Serial. Где их смотреть?
- bt — это эфир: всё, что печатается в него, приходит на телефон в терминал. Монитор компьютера слушает только аппаратный Serial и остаётся пустым. В Bluetooth-терминале телефона