База знаний · Датчики и модули

DS18B20: термометр на шине 1-Wire

Термометр для воды и улицы: резистор 4,7 кОм, несколько датчиков на одном проводе и загадочные 85 °C.

DS18B20 — цифровой термометр в корпусе с тремя ножками: меряет от −55 до +125 °C с точностью ±0,5 °C (в диапазоне −10…+85 °C) и отдаёт готовые градусы по одному проводу — шине 1-Wire. Главный козырь — герметичная версия: датчик в стальной гильзе на кабеле, который можно опустить в аквариум, бочку или закопать в грядку. Там, где DHT22 боится влаги, DS18B20 просто работает.

Подключение

UNO / NANOлюбая классика 5 ВDS18B20плоской стороной к вамGND · DQ · VDD5VVDDпитание 3–5,5 В2DQшина 1-WireGNDGNDобщий провод4,7 кОм
Ножки TO-92 плоской стороной к себе, слева направо: GND, DQ, VDD — на рисунке в даташите корпус показан «видом снизу», отсюда частые зеркальные ошибки. У герметичного щупа провода цветные: красный — питание, чёрный — земля, жёлтый — данные. Резистор 4,7 кОм между DQ и питанием обязателен и в комплект не входит.

Одна деталь обязательна: резистор 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