1-Wire

1-Wire чаще всего встречается в учебной робототехнике на примере цифрового термометра DS18B20. Несколько таких датчиков можно подключить к одной линии данных и различать по уникальным адресам.
1-Wire использует одну сигнальную линию DQ, но общий GND всё равно обязателен. Линия данных возвращается в высокий уровень через подтягивающий резистор. Обмен начинается с импульса reset, затем устройство отвечает импульсом presence.

Зачем это нужно
Представим робота с несколькими точками контроля температуры: аккумулятор, драйвер моторов, корпус. Если каждый датчик подключать к отдельному цифровому входу, пины быстро закончатся. 1-Wire позволяет посадить несколько совместимых устройств на одну линию DQ.
При этом протокол не рассчитан на большие объёмы данных и очень высокую скорость. Его сильная сторона — простая шина для небольших датчиков с уникальными адресами.
Главная идея
Контроллер задаёт время обмена. Чтобы передать ноль, участник тянет DQ к земле. Чтобы получить единицу, он отпускает линию, а резистор подтягивает её к питанию.

Перед командами контроллер выполняет reset. Если на шине есть устройство, оно отвечает presence. После этого контроллер может выбрать конкретный ROM-код или обратиться ко всем устройствам, если операция это допускает.
Провода и сигналы
| Соединение | Назначение | Что важно |
|---|---|---|
DQ | двунаправленные данные | нужна подтяжка к VDD |
GND | общий ноль | обязателен |
VDD | питание устройства при обычном режиме | напряжение берут из datasheet |
| резистор подтяжки | возвращает DQ вверх | часто начинают с 4,7 кОм, но проверяют по схеме и длине проводов |
Название 1-Wire не означает «один провод вообще». Оно означает одну сигнальную линию данных. Для обычного внешнего питания DS18B20 всё равно нужны DQ, GND и VDD.
Где находятся пины
| Плата | Какой пин использовать | Комментарий |
|---|---|---|
| Arduino Uno | любой свободный цифровой пин, часто D2 | номер указывают в программе |
| Arduino Nano | любой свободный цифровой пин | удобно выбирать пин рядом с GND и питанием |
| ESP32 DevKit | любой подходящий GPIO, например GPIO4 | избегают загрузочных и занятых выводов |
| ESP8266 | свободный GPIO с учётом особенностей загрузки | некоторые пины влияют на старт платы |
В отличие от I2C и SPI, у Arduino Uno нет специальных аппаратных выводов «только для 1-Wire». Протокол обычно реализует библиотека через обычный GPIO.
Подключение устройства к Arduino Uno: DS18B20

| DS18B20 | Arduino Uno | Зачем |
|---|---|---|
DQ | D2 | данные в обе стороны |
GND | GND | общий ноль |
VDD | 5V или 3.3V по датчику и схеме | питание |
резистор 4,7 кОм | между DQ и VDD | подтяжка линии данных |
У разных корпусов и готовых модулей порядок выводов может отличаться. Перед подключением смотрят datasheet или маркировку конкретного модуля.
Пример с несколькими Arduino

В 1-Wire нельзя просто соединить несколько Arduino как равноправные платы и ждать, что они сами договорятся. На шине должен быть один контроллер обмена, а остальные участники должны вести себя как 1-Wire-устройства.
Учебная схема для сравнения с UART, I2C и SPI выглядит так:
| Узел | Роль на шине | Подключение |
|---|---|---|
| Arduino Uno A | контроллер, запускает поиск устройств | D2 к общей линии DQ, GND к общей земле |
| Arduino Uno B | эмулирует 1-Wire-устройство | пин эмулятора к DQ, GND к общей земле |
| Arduino Uno C | эмулирует второе 1-Wire-устройство | пин эмулятора к DQ, GND к общей земле |
резистор 4,7 кОм | подтяжка шины | между DQ и VDD |
Такой опыт уже сложнее, чем подключение настоящих DS18B20: Arduino, которая изображает устройство, должна очень точно выдерживать интервалы протокола. Для этого используют специальные библиотеки эмуляции, например OneWireHub или Arduino-OWI, а не обычную Serial.
Для первого практического опыта лучше собрать ту же топологию с реальными DS18B20: одна Arduino Uno опрашивает несколько устройств на общей линии DQ. Так школьник видит главную идею 1-Wire без борьбы с таймингами эмулятора.
Пример чтения адресов обычно строится так:
#include <OneWire.h>
const byte ONE_WIRE_PIN = 2;
OneWire bus(ONE_WIRE_PIN);
void setup() {
Serial.begin(9600);
}
void loop() {
byte address[8];
bus.reset_search();
while (bus.search(address)) {
for (byte i = 0; i < 8; ++i) {
if (address[i] < 16) {
Serial.print('0');
}
Serial.print(address[i], HEX);
Serial.print(' ');
}
Serial.println();
}
delay(3000);
}
Если преподавателю нужен именно стенд из нескольких Arduino, одна плата остаётся контроллером с таким сканером, а на остальных запускают готовый пример эмуляции DS18B20 из выбранной библиотеки. До занятия этот стенд обязательно проверяют логическим анализатором: ошибка в микросекундах выглядит для контроллера как пропавшее устройство.
Частые ошибки
| Ошибка | Что произойдёт |
|---|---|
нет подтяжки DQ | линия не возвращается в высокий уровень |
забыли GND | контроллер не видит корректные уровни |
| перепутали выводы DS18B20 | датчик не отвечает или может быть повреждён |
| длинные провода без проверки | фронт становится медленным, появляются пропуски |
| читают температуру без CRC | можно принять повреждённые данные |
| паразитное питание подключили «по памяти» | операция измерения может срываться |
Что запомнить про 1-Wire
- Одна сигнальная линия не отменяет общий
GND. DQнужна подтяжка к питанию.- Транзакция начинается с
resetи ответаpresence. - Несколько устройств различаются ROM-кодами.
- На Arduino Uno 1-Wire обычно реализуют через библиотеку на обычном цифровом пине.
Практика
- Подключите один DS18B20 к Arduino Uno на
D2и подпишитеDQ,GND,VDD. - Добавьте второй датчик на ту же линию
DQ. - Выведите ROM-коды датчиков в Serial Monitor.
- Для продвинутого стенда замените один настоящий датчик Arduino-эмулятором и проверьте, что контроллер видит новый ROM-код.
- Нарисуйте, где стоит подтягивающий резистор.
Проверьте себя
- Почему 1-Wire не означает отсутствие
GND? - Зачем нужен резистор между
DQиVDD? - Что такое
presence? - Почему несколько DS18B20 можно различать на одной линии?
- Почему несколько Arduino на 1-Wire нельзя подключать как несколько равноправных контроллеров обмена?
Сначала ответьте без подсказки. Ответ можно считать полным, если вы:
- формулируете основную мысль своими словами;
- называете важные условия, ограничения или меры безопасности;
- для схемы, кода или расчёта показываете ход решения и ожидаемый результат.
Если один из пунктов объяснить не получается, найдите соответствующую главу статьи, перечитайте её и повторите ответ.
Словарь статьи
- 1-Wire — адресная шина с одной сигнальной линией и общим проводом.
- DQ — линия данных 1-Wire.
- ROM-код — уникальный 64-битный идентификатор устройства.
- Presence — ответ устройства после импульса сброса контроллера.
- Паразитное питание — режим, в котором устройство получает энергию через линию данных.
Связанные темы
- UART — две линии данных для прямого обмена.
- I2C — общая адресная шина с
SDAиSCL. - SPI — синхронный обмен с отдельным выбором устройства.
- Сравнение протоколов — как выбрать интерфейс.
- Отладка обмена — как проверять уровни и временные сигналы.
Источники
- Analog Devices. DS18B20 Programmable Resolution 1-Wire Digital Thermometer.
- Analog Devices. 1-Wire Search Algorithm.
- Analog Devices. 1-Wire Communication Through Software.
- Arduino Docs. Arduino Uno Rev3.
- OneWireHub. Arduino Libraries entry.