База знаний · Датчики и модули
DS18B20: термометр на шине 1-Wire
Термометр для воды и улицы: резистор 4,7 кОм, несколько датчиков на одном проводе и загадочные 85 °C.
DS18B20 — цифровой термометр в корпусе с тремя ножками: меряет от −55 до +125 °C с точностью ±0,5 °C (в диапазоне −10…+85 °C) и отдаёт готовые градусы по одному проводу — шине 1-Wire. Главный козырь — герметичная версия: датчик в стальной гильзе на кабеле, который можно опустить в аквариум, бочку или закопать в грядку. Там, где DHT22 боится влаги, DS18B20 просто работает.
Подключение
Одна деталь обязательна: резистор 4,7 кОм между линией данных DQ и питанием. Без него шина 1-Wire не работает — а в комплекте датчика его нет. В магазине: герметичный щуп с метровым кабелем — 212 ₽, «голый» DS18B20+ — 140 ₽, набор резисторов с 4,7 кОм — 230 ₽. У готового Trema-модуля «Цифровой термометр» (259 ₽) обвязка уже на плате — подключается шлейфом без пайки и резисторов.
Осторожно с полярностью: при перепутанных GND и VDD датчик ощутимо греется и может сгореть — если корпус горячий, срочно отключайте питание и проверяйте распиновку.
Скетч
Нужны две библиотеки из каталога: OneWire (сама шина) и DallasTemperature (команды термометра). Ставьте обе — каталог не подскажет, что вторая не живёт без первой. На Uno скетч занимает 5 818 байт.
// Термометр DS18B20 на шине 1-Wire (линия DQ — на выводе 2).
// Нужны библиотеки OneWire и DallasTemperature; DallasTemperature
// сама по себе не работает — OneWire ставится отдельно.
#include <OneWire.h>
#include <DallasTemperature.h>
OneWire oneWire(2);
DallasTemperature sensors(&oneWire);
void setup() {
Serial.begin(9600);
sensors.begin();
}
void loop() {
sensors.requestTemperatures(); // «всем датчикам: измерить!»
float t = sensors.getTempCByIndex(0); // первый датчик на шине
if (t == DEVICE_DISCONNECTED_C) {
// -127 означает «датчик не найден»: провода или резистор 4,7 кОм
Serial.println("Datchik ne nayden");
} else {
Serial.print("t = ");
Serial.print(t);
Serial.println(" C");
}
delay(1000);
}
По умолчанию датчик работает в полном разрешении 12 бит — шаг 0,0625 °C, но одно преобразование длится до 750 мс. Если нужна скорость, разрешение снижают до 9 бит: шаг 0,5 °C, зато ответ за 94 мс.
Несколько датчиков на одном проводе
Фирменный трюк 1-Wire: в каждом DS18B20 с завода зашит уникальный 64-битный адрес, поэтому на одну линию с одним резистором можно повесить хоть десяток датчиков — тёплый пол, аквариум и улица на трёх проводах. Этот скетч находит всех, печатает адреса и температуры (на Uno — 6 158 байт):
// Несколько DS18B20 на ОДНОЙ шине: у каждого датчика зашит
// уникальный 64-битный адрес. Скетч находит все датчики,
// печатает адреса и температуру каждого.
#include <OneWire.h>
#include <DallasTemperature.h>
OneWire oneWire(2);
DallasTemperature sensors(&oneWire);
DeviceAddress addr; // 8 байт уникального адреса
void printAddress(DeviceAddress a) {
for (uint8_t i = 0; i < 8; i++) {
if (a[i] < 16) Serial.print("0");
Serial.print(a[i], HEX);
}
}
void setup() {
Serial.begin(9600);
sensors.begin();
int n = sensors.getDeviceCount();
Serial.print("Datchikov na shine: ");
Serial.println(n);
for (int i = 0; i < n; i++) {
if (sensors.getAddress(addr, i)) {
Serial.print("Datchik ");
Serial.print(i);
Serial.print(": adres ");
printAddress(addr);
Serial.println();
}
}
}
void loop() {
sensors.requestTemperatures();
int n = sensors.getDeviceCount();
for (int i = 0; i < n; i++) {
Serial.print("t");
Serial.print(i);
Serial.print(" = ");
Serial.print(sensors.getTempCByIndex(i));
Serial.print(" C ");
}
Serial.println();
delay(1000);
}
Загадочные 85 и −127
- Ровно 85,0 °C — заводское значение регистра после включения. Датчик отвечает так, когда температуру прочитали раньше, чем он успел её измерить, или когда питание проседает. Это код ошибки, а не жара.
- −127 °C — ответ библиотеки «датчик не найден»: забыли резистор 4,7 кОм, перепутали ножки или оборван провод. Распиновка корпуса TO-92 плоской стороной к вам: GND, DQ, VDD — и не верьте картинке из даташита не глядя: там корпус нарисован «видом снизу».
Про подделки
Почти все дешёвые DS18B20 с маркетплейсов — клоны: исследование counterfeit_DS18B20 не нашло ни одной подлинной микросхемы в закупках герметичных щупов с eBay. Хорошая новость: большинство клонов честно меряет температуру. Плохая: многие не работают в «паразитном» режиме питания (по двум проводам) и врут за пределами комнатных температур. Поэтому подключайте датчик всеми тремя проводами, как на схеме, — этот способ работает у всех.
Частые вопросы
Почему DS18B20 показывает ровно 85 °C?
85,0 °C — заводское значение регистра после включения питания. Если вы читаете температуру раньше, чем закончилось преобразование (до 750 мс при полном разрешении), или питание датчика проседает — получите ровно 85. Это признак ошибки, а не измерение.
Почему DS18B20 показывает −127 °C?
−127 — код «датчик не найден» из библиотеки DallasTemperature. Проверьте резистор 4,7 кОм между DQ и питанием (без него шина не работает), провода и распиновку: у корпуса TO-92 плоской стороной к вам слева направо GND, DQ, VDD — в даташите корпус нарисован снизу, отсюда зеркальные ошибки.
Сколько датчиков DS18B20 можно повесить на один провод?
По даташиту — сколько угодно: у каждого датчика зашит уникальный 64-битный адрес, и библиотека опрашивает их по очереди на одной линии с одним резистором 4,7 кОм. На практике десяток датчиков на нормальном кабеле работает уверенно; ограничивает длина и качество линии.
Читайте также
Обновлено: 21 августа 2026
