
Подключение двух Bluetooth модулей к одной плате Arduino открывает возможности для создания распределенных систем с беспроводной связью между несколькими устройствами. Чаще всего используются модули HC-05 и HC-06, работающие по протоколу Bluetooth 2.0, или более современные HM-10 (BLE). Для корректной работы двух модулей одновременно требуется учитывать ограничения по питанию, адресации и программной обработке данных.
Каждый модуль потребляет до 30–50 мА в активном режиме, поэтому при подключении двух устройств рекомендуется использовать внешний источник питания на 5 В с током не менее 500 мА. Модули HC-05/HC-06 работают на скорости 38400 бод по умолчанию, но для стабильной передачи данных между двумя устройствами лучше снизить её до 9600 бод или использовать аппаратные прерывания для обработки входящих пакетов.
Для разделения потоков данных между модулями применяют программные или аппаратные решения. В первом случае используют SoftwareSerial с разными пинами RX/TX для каждого модуля, но это снижает скорость и надёжность связи. Во втором – аппаратный UART (пины 0/1 на Arduino Uno) для одного модуля и программный для второго, что требует отключения модуля при загрузке скетча через USB.
При настройке модулей HC-05 через AT-команды необходимо задать уникальные имена (NAME) и адреса (ADDR), чтобы избежать конфликтов. Например, первый модуль можно настроить как AT+NAME=Master, а второй – AT+NAME=Slave. Для BLE-модулей HM-10 аналогично указывают разные UUID сервисов и характеристики в коде.
В скетче Arduino необходимо реализовать логику мультиплексирования данных, используя буферы для каждого модуля. Пример: проверять наличие данных в обоих потоках с помощью Serial.available() и mySerial.available(), а затем обрабатывать их поочерёдно. Для предотвращения зависаний рекомендуется добавлять тайм-ауты на приём данных (millis()) и контрольные суммы для проверки целостности пакетов.
Выбор совместимых Bluetooth модулей для Arduino

При подключении двух Bluetooth-модулей к Arduino критически важен выбор моделей с разными профилями и минимальными конфликтами по питанию и UART. Наиболее стабильные варианты – HC-05 (Classic Bluetooth) и HM-10 (BLE), так как они работают на разных частотах (2.402–2.480 ГГц и 2.400–2.4835 ГГц соответственно) и не создают взаимных помех. HC-05 поддерживает SPP (Serial Port Profile), что удобно для передачи данных, а HM-10 – BLE с низким энергопотреблением, идеальный для датчиков. Оба модуля совместимы с большинством плат Arduino (Uno, Nano, Mega) через UART, но требуют отдельных пинов TX/RX для каждого.
Для проектов с высокой нагрузкой на канал связи рассмотрите JDY-31 (BLE 5.0) и HC-06 (Classic). JDY-31 обеспечивает скорость до 2 Мбит/с и дальность до 100 м на открытой местности, а HC-06 – простоту настройки через AT-команды. Важно: JDY-31 требует библиотеки SoftwareSerial для работы с несколькими модулями, так как аппаратный UART на Arduino Uno/Nano только один. При параллельном подключении используйте разные скорости передачи (например, 9600 для HC-06 и 115200 для JDY-31), чтобы избежать коллизий.
Избегайте модулей с одинаковыми MAC-адресами или фиксированными каналами связи, таких как дешевые клоны HC-05 без возможности изменения настроек. Проверенные производители: DSD TECH (HC-05/HC-06), Seeed Studio (HM-10), MakerFocus (JDY-31). Модули от этих брендов гарантируют стабильную работу при напряжении 3.3–5 В и имеют встроенные регуляторы питания, что снижает риск перегрузки Arduino. Для тестирования совместимости используйте скетч с минимальной конфигурацией: один модуль на аппаратном UART, второй – на программном.
При выборе обратите внимание на следующие параметры:
- Протокол: Classic (HC-05/HC-06) для непрерывной передачи данных, BLE (HM-10/JDY-31) для экономии энергии.
- Питание: Модули с диапазоном 3.3–6 В (например, HC-05) совместимы с 5-вольтовыми платами без дополнительных преобразователей.
- Антенна: Внешняя антенна (как у JDY-31) увеличивает дальность, но требует больше места.
- AT-команды: Модули с поддержкой
AT+ROLE(HC-05) илиAT+MODE(HM-10) позволяют гибко настраивать режимы master/slave.
Для одновременной работы двух модулей на одной плате Arduino Mega (с несколькими аппаратными UART) оптимальна связка HC-05 (Serial1) и HM-10 (Serial2). На Uno/Nano используйте SoftwareSerial для второго модуля, но учтите ограничения: программный UART не поддерживает скорости выше 115200 бод и может конфликтовать с прерываниями. Пример кода для инициализации:
#include <SoftwareSerial.h>
SoftwareSerial BT2(10, 11); // RX, TX для второго модуля
void setup() {
Serial.begin(9600); // Аппаратный UART для HC-05
BT2.begin(38400); // Программный UART для HM-10
}
Избегайте подключения обоих модулей к одному источнику питания Arduino – используйте внешний 3.3-вольтовый стабилизатор для BLE-модулей, чтобы предотвратить просадки напряжения.
Схема подключения первого Bluetooth модуля к Arduino
Для стабильной работы отключите аппаратный UART Arduino от USB-порта во время загрузки скетча. Используйте SoftwareSerial для создания альтернативного последовательного порта, если требуется одновременная отладка через USB. Пример инициализации:
| Пин Arduino | Назначение |
|---|---|
| 2 | SoftwareSerial RX |
| 3 | SoftwareSerial TX |
Скорость SoftwareSerial должна совпадать с настройками модуля (обычно 9600 или 38400 бод).
Настройка питания и заземления для двух модулей
Общее заземление критично для стабильной работы: соедините GND обоих модулей с GND Arduino единой шиной, используя провод сечением не менее 0,5 мм². Раздельные цепи заземления создают разность потенциалов, вызывая сбои в обмене данными. При подключении к макетной плате избегайте длинных проводников – сопротивление даже 0,1 Ом на линии GND может привести к падению напряжения до 8 мВ при токе 80 мА, что достаточно для нестабильной работы модулей. Для минимизации помех используйте звездообразную топологию заземления: от общей точки на Arduino разведите отдельные провода к каждому модулю.
Подключение второго Bluetooth модуля без конфликтов
Два Bluetooth-модуля на одной плате Arduino создают конфликты из-за совпадения частотных каналов и адресов устройств. Стандартные модули HC-05 или HC-06 работают на частоте 2,4 ГГц, и при одновременной инициализации оба пытаются занять один и тот же канал. Решение – разнести модули по разным аппаратным интерфейсам: один подключить через UART (пины TX/RX), второй – через программный Serial (например, SoftwareSerial на пинах 10 и 11). Это снижает вероятность наложения сигналов, но не устраняет проблему полностью.
Для предотвращения конфликтов на уровне протокола измените параметры AT-команд у одного из модулей. Например, для HC-05 выполните следующие шаги:
- Переведите модуль в AT-режим (пин KEY на HIGH при включении).
- Отправьте команду
AT+ROLE=0для установки режима Slave. - Задайте уникальный адрес:
AT+ADDR=1234,56,789ABC(формат: XXXX,XX,XXXXXX). - Назначьте разные имена:
AT+NAME=Module2. - Установите разные скорости:
AT+UART=38400,0,0для второго модуля (первый оставьте на 9600).
Эти настройки минимизируют пересечения при подключении к внешним устройствам.
Если оба модуля должны работать одновременно, используйте внешние антенны с направленными характеристиками или экранируйте их друг от друга металлической фольгой. Расстояние между модулями должно быть не менее 10 см – это снижает взаимные помехи на 40–60%. Альтернатива – модули с поддержкой Bluetooth 5.0 (например, ESP32), где реализована технология Adaptive Frequency Hopping, автоматически избегающая занятых каналов.
При программировании избегайте одновременной отправки данных. Организуйте очередь сообщений с задержками:
- Используйте флаги состояния для каждого модуля (например,
bool module1Busy = false). - Перед отправкой проверяйте доступность:
if (!module1Busy) { module1.print("data"); module1Busy = true; }. - Освобождайте флаг после подтверждения доставки или по тайм-ауту (200–300 мс).
- Для критичных приложений добавьте контрольную сумму в пакеты данных.
Этот подход гарантирует стабильную работу даже при высокой нагрузке.
Распределение UART портов для одновременной работы
Arduino Uno и Nano имеют только один аппаратный UART (пины 0 и 1), что ограничивает прямое подключение двух Bluetooth-модулей. Для решения используйте программный UART через библиотеку SoftwareSerial, которая эмулирует последовательный порт на любых цифровых пинах. Например, модуль HC-05 подключите к пинам 2 (RX) и 3 (TX), а второй модуль – к 4 (RX) и 5 (TX). Учтите, что SoftwareSerial снижает скорость обмена до 38400 бод и может конфликтовать с прерываниями.
Для плат с несколькими аппаратными UART (например, Arduino Mega с тремя портами) задействуйте Serial1 (пины 19 RX, 18 TX) и Serial2 (пины 17 RX, 16 TX). Это исключает накладные расходы на программную эмуляцию и позволяет работать на скоростях до 115200 бод без потерь данных. При инициализации задайте разные скорости для каждого модуля, если они требуют этого (например, HC-05 – 38400, HM-10 – 9600).
Избегайте использования пинов 0 и 1 для Bluetooth-модулей, если планируете отладку через USB, так как они задействованы под Serial. При подключении двух модулей через SoftwareSerial не назначайте RX одного модуля на тот же пин, что и TX другого – это вызовет конфликт. Для стабильной работы отключайте прием данных на неактивном модуле методом listen(), чтобы предотвратить переполнение буфера.
При работе с модулями, требующими AT-команд (например, HC-05), используйте отдельный программный UART для конфигурации, чтобы не прерывать основной обмен данными. Настройте приоритет портов: основной модуль подключите к аппаратному UART, а вторичный – к программному. Для снижения нагрузки на процессор ограничьте частоту опроса вторичного модуля или используйте прерывания по изменению состояния пинов RX.
Программирование Arduino для обмена данными с двумя модулями
Для работы с двумя Bluetooth-модулями (например, HC-05 и HC-06) на одной плате Arduino используйте программные последовательные порты (SoftwareSerial). Подключите модули к разным пинам: первый к D2 (RX) и D3 (TX), второй – к D4 (RX) и D5 (TX). В коде инициализируйте два объекта SoftwareSerial с соответствующими параметрами скорости (обычно 9600 или 38400 бод). Убедитесь, что аппаратный порт Serial остаётся свободным для отладки через монитор порта.
При отправке данных учитывайте конфликты: модули не должны передавать одновременно. Используйте флаги состояния или таймеры для разделения передачи. Например, отправляйте данные на первый модуль с задержкой в 100 мс после получения ответа от второго. Для синхронизации применяйте методы available() и read(), проверяя наличие данных перед чтением. Избегайте блокирующих задержек (delay()) – используйте millis() для неблокирующего управления.
Обработка входящих данных требует буферизации. Создайте массивы для хранения пакетов от каждого модуля и реализуйте парсинг по маркерам (например, символам начала/конца пакета). Для HC-05 в режиме AT-команд проверяйте ответы на команды типа AT+NAME?, сравнивая их с ожидаемыми значениями. При работе с двумя модулями разделяйте логику обработки: первый модуль может отвечать за управление, второй – за телеметрию.
Оптимизируйте энергопотребление: отключайте модули через пин EN (если есть) в периоды простоя. Для стабильной работы снизьте скорость обмена до 9600 бод при высоких нагрузках на процессор. Тестируйте связь с помощью инструментов типа Bluetooth Terminal на Android или PuTTY на ПК, отправляя тестовые пакеты и проверяя целостность данных.
Обработка одновременных подключений в скетче
Для работы с двумя Bluetooth-модулями (например, HC-05 и HC-06) в одном скетче используйте программные последовательные порты SoftwareSerial с разными пинами. Назначьте каждому модулю уникальные объекты: SoftwareSerial bt1(2, 3) и SoftwareSerial bt2(4, 5). В setup() инициализируйте оба порта с одинаковой скоростью (обычно 9600 или 38400 бод), но проверяйте их готовность по отдельности – модули могут иметь разные задержки инициализации. Для предотвращения конфликтов добавьте буферы приема размером 64 байта и обрабатывайте данные в неблокирующем режиме с помощью bt1.available() и bt2.available().
В основном цикле loop() реализуйте приоритетную обработку сообщений: сначала проверяйте наличие данных в обоих портах, затем последовательно читайте и парсите их. Используйте флаги состояния (например, bool bt1_connected = false) для отслеживания активных подключений и избегайте зависаний с помощью таймаутов: если модуль не отвечает в течение 200 мс, сбрасывайте его состояние. Для синхронизации команд применяйте уникальные префиксы (например, #1: для первого модуля, #2: для второго) – это позволит разделять потоки данных даже при одновременной передаче.
Тестирование связи между модулями и внешними устройствами
Перед проверкой связи убедитесь, что оба Bluetooth-модуля (например, HC-05 и HC-06) настроены на разные каналы: первый – ведущий (master), второй – ведомый (slave). Используйте AT-команды для установки параметров: AT+ROLE=1 для master и AT+ROLE=0 для slave. Задайте одинаковую скорость передачи (например, 38400 бод) и пароль, если требуется. Подключите модули к Arduino через SoftwareSerial на разных пинах (например, 2 и 3 для первого, 4 и 5 для второго), чтобы избежать конфликтов UART.
Для тестирования используйте последовательность команд: отправьте строку с одного модуля и проверьте её получение на другом. Пример кода для отправки: Serial1.print("TEST");, для приёма: if (Serial2.available()) { String data = Serial2.readString(); }. Замерьте задержку передачи с помощью millis() – при стабильной связи она не должна превышать 50–100 мс. Если данные теряются, проверьте питание (модули потребляют до 40 мА) и расстояние (максимум 10 м для Class 2).
Для проверки связи с внешними устройствами (смартфон, ПК) используйте приложения типа «Bluetooth Terminal» или «Serial Bluetooth Terminal». Подключитесь к модулю по имени (например, «HC-05») и отправьте тестовые пакеты. Если устройство не обнаруживается, сбросьте настройки модуля командой AT+RESET и повторите сопряжение. При нестабильной связи уменьшите скорость до 9600 бод или замените антенну на модуле с внешней (для HC-05 доступны модификации с SMA-разъёмом).
Устранение помех при работе двух Bluetooth модулей
Bluetooth-модули, работающие на частоте 2,4 ГГц, создают взаимные помехи при одновременной передаче данных. Основные причины – пересечение каналов и недостаточная развязка по питанию. Для минимизации конфликтов используйте модули с поддержкой Bluetooth Low Energy (BLE) версии 4.2 и выше: они автоматически выбирают наименее загруженный канал из 40 доступных. Если применяются классические Bluetooth-модули (например, HC-05), настройте их на разные каналы вручную через AT-команды. Например, для HC-05:
AT+CMODE=0– принудительный выбор канала;AT+ROLE=0– режим подчиненного устройства;AT+PSWD="1234"– уникальный PIN-код для каждого модуля.
Физическое размещение модулей критически влияет на стабильность связи. Располагайте антенны на расстоянии не менее 30 см друг от друга и избегайте параллельного расположения – это снижает перекрестные помехи на 40–60%. Используйте экранированные провода для подключения модулей к Arduino, особенно для линий TX/RX и питания. Разделите цепи питания: подключите каждый модуль к отдельному стабилизатору напряжения (например, AMS1117) или используйте ферритовые бусины на линиях VCC для фильтрации высокочастотных шумов. Пример схемы развязки:
- Модуль 1:
VCC→ ферритовая бусина → конденсатор 10 мкФ →GND; - Модуль 2: аналогично, но с конденсатором 0,1 мкФ для подавления ВЧ-помех.
Программные методы позволяют динамически управлять помехами. Реализуйте алгоритм временного разделения каналов: передавайте данные поочередно, используя таймеры Arduino. Пример кода для синхронизации:
unsigned long lastSendTime = 0;
const unsigned long sendInterval = 50; // мс
void loop() {
if (millis() - lastSendTime >= sendInterval) {
if (module1Active) {
sendData(module1);
module1Active = false;
} else {
sendData(module2);
module1Active = true;
}
lastSendTime = millis();
}
}
Для BLE-модулей (например, HM-10) активируйте режим adaptive frequency hopping (AFH) – он автоматически исключает зашумленные каналы. Проверяйте уровень сигнала через AT+RSSI? и корректируйте мощность передачи командой AT+POWE? (значения от 0 до 7, где 7 – максимальная мощность).
Оптимизация энергопотребления при подключении двух модулей

Два Bluetooth-модуля (например, HC-05 и HM-10) в активном режиме потребляют до 30–50 мА каждый. При работе от батареи ёмкостью 2000 мА·ч это сокращает автономность до 20–30 часов. Основные источники потерь: постоянное сканирование, неоптимальные настройки питания и избыточная частота обмена данными.
Переключайте модули в режим низкого энергопотребления (Low Power Mode) при простое. Для HC-05 команда AT+SLEEP снижает ток до 1–2 мА, для HM-10 – AT+PWRM1 (режим сна). Используйте внешние транзисторы (например, IRLML6401) для полного отключения питания модулей, когда они не нужны. Это сокращает потребление до 0 мА в выключенном состоянии.
- Уменьшите интервал сканирования: для HM-10 установите
AT+SCAN1,1000(сканирование каждые 1000 мс вместо 100 мс по умолчанию). - Ограничьте мощность передатчика:
AT+POWE0(0 дБм) вместоAT+POWE3(4 дБм) для HM-10 снижает потребление на 15–20%. - Отключите ненужные сервисы: для BLE-модулей (HM-10) деактивируйте рекламные пакеты, если соединение инициируется только Arduino.
Для модулей с поддержкой BLE (HM-10) применяйте соединения с низким энергопотреблением: установите интервал подключения в 100–200 мс (AT+CONN100,200). Это снижает частоту обмена пакетами, но увеличивает задержку на 50–100 мс – приемлемо для большинства задач мониторинга.
Оптимизируйте питание: запитывайте модули через линейные стабилизаторы с низким падением напряжения (LDO), например, MCP1700 (ток покоя 1,6 мкА). Избегайте импульсных источников – их КПД падает при малых токах нагрузки. Для батарейного питания используйте напряжение 3,3 В вместо 5 В, чтобы исключить потери на преобразователе.
Тестируйте потребление с помощью мультиметра в режиме измерения тока. Подключите его последовательно с модулем и измерьте ток в разных режимах: активный обмен, ожидание, сон. Типичные значения для оптимизированной схемы: 0,5–2 мА в режиме сна, 5–10 мА при периодическом обмене данными, 20–30 мА при непрерывной передаче.
