Сравнение протоколов

UART, I2C, 1-Wire и SPI решают похожую задачу: передают цифровые данные между платами и модулями. Но подключаются они по-разному. Поэтому протокол выбирают не по названию, а по задаче: сколько устройств, сколько доступно пинов, какая нужна скорость и как далеко идут провода.
Универсально лучшего протокола нет. Для сервисного порта удобен UART, для набора небольших датчиков часто подходит I2C, для нескольких DS18B20 — 1-Wire, для дисплеев и памяти — SPI. Финальный выбор всегда проверяют на конкретных платах, пинах и модулях.

Главная идея
Протокол описывает не только байты, но и способ соединения:
провода и уровни -> правила обмена -> команды конкретного устройства
Например, SPI говорит, где такт и где данные, но не говорит, какую команду отправить TFT-дисплею. I2C говорит, как отправить адрес, но сам адрес зависит от микросхемы и перемычек модуля.
Сравнение по проводам
| Признак | UART | I2C | 1-Wire | SPI |
|---|---|---|---|---|
| Основные сигналы | TX, RX | SDA, SCL | DQ | SCK, MOSI, MISO, CS |
Общий GND | нужен | нужен | нужен | нужен |
| Несколько устройств | неудобно без доп. схемы | удобно по адресам | удобно по ROM-кодам | удобно, но нужен отдельный CS |
| Такт | нет отдельной линии | SCL | временные слоты | SCK |
| Типичная задача | консоль, Bluetooth, GPS | датчики, OLED, RTC | DS18B20 | дисплей, память, быстрый датчик |
Фразы вроде «двухпроводная шина» обычно считают только сигнальные линии. Питание и GND всё равно нужны, если устройство не получает их другим предусмотренным способом.
Где искать пины на платах

На Arduino Uno многие пины запоминаются быстро: UART на D0/D1, I2C на A4/A5, SPI на D10-D13. Но на Arduino Mega, ESP32, ESP8266 и других платах номера могут отличаться.
| Протокол | Arduino Uno | ESP32 DevKit в Arduino core |
|---|---|---|
| UART | D0/RX, D1/TX | UART0 обычно связан с USB; дополнительные UART можно назначать на GPIO |
| I2C | A4/SDA, A5/SCL | часто GPIO21/SDA, GPIO22/SCL, но можно переназначать |
| 1-Wire | любой свободный цифровой пин, часто D2 | свободный GPIO, например GPIO4 |
| SPI | D13/SCK, D11/MOSI, D12/MISO, D10/SS | часто VSPI: 18/SCK, 23/MOSI, 19/MISO, 5/SS |
Если плата не Uno, не стоит переносить схему «по памяти». Открывают pinout именно этой платы и проверяют, не занят ли выбранный вывод загрузкой, USB, flash-памятью или другим модулем.
Как выбирать

- Определите участников обмена: одна плата и один модуль или целая группа устройств.
- Посчитайте доступные пины: хватит ли отдельных
CS, нужны лиSDA/SCL, есть ли свободный UART. - Проверьте уровни:
5 В,3,3 В, необходимость преобразователя. - Оцените объём данных: один байт состояния, строка команд, поток пикселей или блок памяти.
- Соберите короткий тест и проверьте сигнал логическим анализатором.
Быстрый выбор для робота
| Задача | Обычно удобно | Почему |
|---|---|---|
| отправить команды с Bluetooth HC-06 | UART | модуль уже отдаёт TX/RX |
| подключить BME280 и OLED | I2C | два сигнальных провода на несколько адресов |
| поставить несколько датчиков температуры DS18B20 | 1-Wire | одна линия данных и уникальные ROM-коды |
| обновлять TFT-дисплей | SPI | выше скорость и явный выбор устройства |
| связать Arduino с компьютером через адаптер | UART через USB-TTL | простой поток байтов для отладки |
Что может испортить выбор
| Проблема | Где часто встречается |
|---|---|
| не хватает пинов | SPI с несколькими устройствами |
| одинаковые адреса | I2C-модули одной модели |
| длинные провода и медленный фронт | I2C и 1-Wire |
занятые D0/D1 | UART на Arduino Uno |
| неверный режим такта | SPI |
| разные логические уровни | любые протоколы между 5 В и 3,3 В |
Что запомнить
- UART прост для прямого обмена, но не адресует много устройств сам по себе.
- I2C экономит пины, но требует адресов и подтяжек.
- 1-Wire удобен для нескольких простых датчиков на одной линии.
- SPI быстрый, но требует больше сигнальных линий.
- Реальная надёжность зависит от схемы, проводов, питания и настроек.
Практика
- Для робота с дисплеем, BME280, DS18B20 и Bluetooth-модулем выберите протокол для каждого устройства.
- Нарисуйте схему соединений и подпишите каждый провод.
- Отдельно отметьте, где нужны подтяжки, а где отдельный
CS. - Для выбранной платы найдите реальные номера пинов в pinout.
Проверьте себя
- Почему нельзя выбрать протокол только по максимальной скорости?
- Чем адрес I2C отличается от линии
CSв SPI? - Какой протокол удобен для нескольких DS18B20?
- Почему для UART на Arduino Uno часто возникают конфликты с USB?
Сначала ответьте без подсказки. Ответ можно считать полным, если вы:
- формулируете основную мысль своими словами;
- называете важные условия, ограничения или меры безопасности;
- для схемы, кода или расчёта показываете ход решения и ожидаемый результат.
Если один из пунктов объяснить не получается, найдите соответствующую главу статьи, перечитайте её и повторите ответ.
Словарь статьи
- Протокол — правила формирования и обмена сообщениями.
- Топология — способ соединения участников и линий связи.
- Адрес — число, по которому контроллер выбирает устройство на общей шине.
- Пропускная способность — объём данных, который канал передаёт за единицу времени.
- Логический уровень — диапазон напряжения, который вход распознаёт как
LOWилиHIGH.
Связанные темы
- UART — линии
TX/RX, HC-06 и обмен между Arduino. - I2C —
SDA/SCL, подтяжки и адреса. - 1-Wire —
DQ, ROM-коды и DS18B20. - SPI —
SCK,COPI,CIPO,CSи старые обозначения линий. - Отладка обмена — как проверять выбранный интерфейс.
Источники
- Arduino Docs. Arduino Uno Rev3.
- Espressif. Arduino-ESP32 Serial communication.
- Espressif. Arduino-ESP32 I2C API.
- Espressif. Arduino-ESP32 SPI API.
- Analog Devices. DS18B20 Programmable Resolution 1-Wire Digital Thermometer.