Руководства · 15 мин чтения

Датчики температуры для Arduino: сравнение 8 моделей

Сравнение датчиков температуры для Arduino: DHT11, DHT22, DS18B20, LM35, NTC, BME280, MAX6675 и MLX90614 по точности, диапазону, подключению, длине кабеля и цене.

Выбор среди разных типов датчиков температуры для Arduino важнее, чем кажется на первый взгляд: DHT11 и DS18B20 в одной комнате могут расходиться на 2 °C, а попытка измерить печь на 300 °C неподходящим датчиком вполне может его расплавить. В любительской электронике царят восемь датчиков температуры: DHT11, DHT22, DS18B20, LM35, NTC-термистор, BME280, MAX6675 (термопара типа K) и MLX90614 (бесконтактный инфракрасный). У каждого свой диапазон измерений, точность, способ подключения и цена. Какой подойдёт, зависит от того, что нужно измерять: воздух в комнате, воду, печь или вращающийся мотор, до которого не дотронуться?

В этом руководстве восемь датчиков стоят рядом в двух больших таблицах: диапазон измерений, точность, разрешение, скорость чтения, интерфейс, напряжение питания, длина кабеля и относительная цена. Дальше ты узнаешь, как работает каждый из них, их сильные и слабые стороны, схемы подключения к Arduino Uno, ESP32 и Raspberry Pi Pico, примеры кода для NTC, MAX6675 и MLX90614, стенд, на котором три датчика соревнуются друг с другом, и какой датчик выбрать для какого проекта. Для большинства этих датчиков у нас есть и подробные уроки; ссылки на них найдёшь в соответствующих разделах.

Модуль датчика температуры и влажности DHT11
Модуль датчика температуры и влажности DHT11
Модуль датчика температуры и влажности DHT22 (AM2302)
Модуль датчика температуры и влажности DHT22 (AM2302)
Водонепроницаемый зонд температуры DS18B20
Водонепроницаемый зонд температуры DS18B20
Модуль датчика температуры, влажности и давления BME280
Модуль датчика температуры, влажности и давления BME280
NTC-термистор
NTC-термистор

На что смотреть при выборе датчика температуры?

Прежде чем сравнивать датчики, нужно правильно понимать термины из даташитов. Чаще всего путают точность и разрешение. Точность показывает, насколько показание близко к реальной температуре; разрешение — это самый маленький шаг, который датчик способен различить. BME280 выдаёт температуру с шагом 0,01 °C, но его точность около ±1 °C; поэтому последние два знака в 23,47 °C на экране полезны для отслеживания мелких изменений, но реальную температуру с такой точностью не показывают. При выборе смотри на эти семь критериев:

  • Диапазон измерений: датчик должен с запасом покрывать самую низкую и самую высокую температуру, которую нужно измерить. DHT11 не видит ниже нуля; для холодильника нужен DS18B20, а для печи — термопара.
  • Точность: для комнатного термометра ±2 °C вполне допустимо, а для аквариума или инкубатора для яиц нужно ±0,5 °C.
  • Интерфейс: аналоговым датчикам нужен пин АЦП; цифровым — один или несколько цифровых пинов и обычно библиотека. Количество свободных пинов на плате определяет, сколько датчиков получится подключить.
  • Длина кабеля: если датчик окажется в 5 метрах от платы, в саду или на дне бака с водой, аналоговым и I2C-датчикам придётся тяжело; 1-Wire и однопроводный протокол DHT гораздо лучше переносят большие расстояния.
  • Время отклика: зонд в стальной гильзе или DHT в пластиковом корпусе замечают резкое изменение температуры только через секунды, а то и минуты; маленький открытый NTC намного быстрее.
  • Дополнительные измерения: если нужна ещё и влажность, справятся DHT22 или BME280; если нужны также давление и высота, BME280 закрывает всё одним модулем.
  • Напряжение питания: на ESP32 и Pico с логикой 3,3 V осторожнее с датчиками вроде LM35, которым нужно не меньше 4 V, и следи, чтобы на вход АЦП не попадало больше 3,3 V.

Сравнительная таблица 8 датчиков температуры

Первая таблица сводит характеристики измерения, вторая — подключение и стоимость. Значения взяты из даташитов; если не указано иное, точность относится к комнатной температуре и ухудшается к краям диапазона.

ДатчикДиапазон измеренийТочностьРазрешениеСкорость чтения
DHT110 … +50 °C±2 °C1 °CРаз в секунду
DHT22 (AM2302)−40 … +80 °C±0,5 °C0,1 °CРаз в 2 секунды
DS18B20−55 … +125 °C±0,5 °C (от −10 до +85 °C)0,0625 °C (12 бит)750 мс (12 бит), 94 мс (9 бит)
LM35DZ0 … +100 °C (LM35: −55 … +150 °C)Типично ±0,6 °C, гарантированно ±1,5 °C0,49 °C на Uno (опорное 5 V), 0,11 °C (опорное 1,1 V)Мгновенно (скорость АЦП)
NTC 10 kΩ, B 3950−40 … +125 °C (в стеклянном корпусе ≈ 300 °C)При 25 °C: ±0,25 °C (1%) … ±1 °C (5%)≈ 0,1 °C при комнатной температуре на UnoМгновенно (скорость АЦП)
BME280−40 … +85 °C±0,5 °C (25 °C), ±1 °C (0 … 65 °C)0,01 °CДесятки раз в секунду
MAX6675 + термопара типа K0 … +1023,75 °CНесколько °C (преобразователь ≈ ±2 °C, холодный спай до ±3 °C)0,25 °C≈ 4 раза в секунду (преобразование 0,22 с)
MLX90614Объект −70 … +380 °C, окружающая среда −40 … +125 °C±0,5 °C (около комнатной температуры)0,02 °CНесколько раз в секунду
ДатчикИнтерфейсПитаниеДлина кабеляДоп. измерениеОтносительная цена
DHT11Однопроводный цифровой, 1 пин3–5,5 VДо 20 мВлажностьОчень низкая
DHT22Однопроводный цифровой, 1 пин3,3–6 VДо 20 мВлажностьСредняя
DS18B201-Wire, много датчиков на 1 пине3,0–5,5 VДесятки метровНетНизкая
LM35Аналоговый, 1 пин АЦП4–30 VКороткий, ≈ 1 м (длиннее — с мерами предосторожности)НетНизкая
NTCАналоговый, 1 пин АЦП через делитель3,3 или 5 V через делительНесколько метровНетСамая низкая
BME280I2C (2 пина) или SPIМикросхема 1,71–3,6 V; модуль со стабилизатором 5 VКороткий, меньше 50 смВлажность и давлениеСредняя
MAX6675SPI, 3 пина (только чтение)3,0–5,5 VПровод термопары может тянуться на метрыНетСредняя
MLX90614I2C (SMBus), 2 пинаВерсия на 3 V или 5 V (на модуле может быть стабилизатор)Короткий (I2C); измеряет без контактаТемпература окружающей средыВысокая
По цене картина примерно такая: дешевле всех NTC, за ним идут DHT11, LM35 и DS18B20; DHT22 и BME280 — средний сегмент, модуль MAX6675 с зондом-термопарой стоит чуть дороже, а MLX90614 — самый дорогой в списке. Клоны дешёвых датчиков встречаются очень часто; особенно у DS18B20, LM35 и BME280 клоны могут не дотягивать до точности из даташита. Самый простой способ понять, можно ли доверять своему датчику, — оставить два датчика в одном месте и сравнить их показания.

DHT11 и DHT22: температура и влажность вместе

В пластиковой решётке датчика DHT находятся элемент влажности (резистивный в DHT11, ёмкостный в DHT22), термистор и небольшой контроллер, который превращает показания в цифровые данные. Датчик передаёт результат по одной линии данных 40-битным пакетом: 16 бит влажности, 16 бит температуры и 8-битная контрольная сумма. Этот протокол — не 1-Wire, а собственный однопроводный протокол производителя, поэтому каждому DHT нужен свой пин. DHT11 дешёвый и вполне годится для комнатной температуры, но его диапазон 0–50 °C и погрешность ±2 °C делают его слабым вариантом для улицы и точной работы. При той же схеме подключения DHT22 (AM2302) измеряет от −40 до +80 °C с точностью ±0,5 °C и выдаёт влажность в диапазоне 0–100%; взамен он может делать только одно измерение раз в две секунды. У обоих одна общая слабость — медлительность: изменение они показывают с опозданием, потому что воздух внутри решётки сначала должен уравняться с окружающим. Подключение, установка библиотеки и код — в статье Датчик температуры и влажности DHT11; тот же код работает с DHT22, если поменять одно слово.

Если используется голый 4-выводной DHT, между линией данных и VCC обязательно нужен подтягивающий резистор 10 kΩ; на 3-выводных модулях этот резистор уже стоит на плате. Опрашивать DHT чаще, чем раз в две секунды, бесполезно — нового измерения не будет: библиотека либо вернёт старое значение, либо выдаст nan.

DS18B20: водонепроницаемый, надёжный и много датчиков на одном пине

Водонепроницаемый зонд температуры DS18B20
Водонепроницаемый зонд DS18B20: цифровой датчик в гильзе из нержавеющей стали с трёхпроводным кабелем (красный VDD, чёрный GND, жёлтый — данные).

DS18B20 измеряет температуру внутри микросхемы и передаёт её цифровым числом с выбираемым разрешением от 9 до 12 бит. Он измеряет от −55 до +125 °C, даёт точность ±0,5 °C в диапазоне от −10 до +85 °C, а благодаря протоколу 1-Wire к одному пину данных можно подключить десятки датчиков; у каждого есть уникальный 64-битный адрес, записанный на заводе. Его водонепроницаемая версия-зонд в гильзе из нержавеющей стали вне конкуренции для аквариумов, баков с водой, труб отопления, почвы и морозильников. Требование у него одно — подтягивающий резистор 4,7 kΩ между линией данных и питанием; без него библиотека возвращает −127 °C. В 12-битном режиме одно преобразование занимает 750 мс, поэтому для слежения за быстро меняющейся температурой может понадобиться снизить разрешение. Код для нескольких датчиков и неблокирующее чтение на ESP32 — в статье Датчик температуры DS18B20.

LM35: самый простой аналоговый датчик, без библиотеки

LM35 напрямую превращает температуру в напряжение: его выход растёт на 10 mV на градус и даёт 250 mV при 25 °C. Библиотека не нужна; результат получается по формуле температура = analogRead × 5.0 / 1024 × 100. Благодаря такой простоте это идеальный первый шаг для знакомства с АЦП. Слабые стороны идут оттуда же: при опорном напряжении 5 V 10-битный АЦП Arduino Uno даёт шаг всего около 0,49 °C, каждое отклонение в 5 V от USB сразу уходит в температуру, а чем длиннее кабель, тем больше помех ловит выход. Большинство LM35 на рынке — это LM35DZ, у которых точность гарантирована только в диапазоне 0–100 °C. К тому же ему нужно не меньше 4 V, так что на ESP32 и Pico его стоит питать от пина 5 V. На платах с 3,3 V практичнее аналоговый TMP36: он работает от 2,7–5,5 V, измеряет от −40 до +125 °C и тоже выдаёт 10 mV/°C, но при 0 °C даёт 500 mV, поэтому формула становится такой: температура = (V − 0.5) × 100. Типичная точность — ±1 °C при 25 °C и ±2 °C во всём диапазоне. Как уменьшить шаг до 0,11 °C с внутренним опорным напряжением 1,1 V, мы пошагово объясняем в статье Датчик температуры LM35, а как работает АЦП, найдёшь в статье об аналого-цифровом преобразовании.

LM35 и DS18B20 выпускаются в одинаковом чёрном корпусе TO-92 и выглядят почти одинаково, но выводы питания у них перевёрнуты. Датчик, подключённый наоборот, за считаные секунды раскаляется так, что не дотронуться. При первом включении потрогай датчик пальцем; если он нагревается, сразу отключи питание и прочитай маркировку на корпусе.

NTC-термистор: самый дешёвый и быстрый датчик

NTC-термистор (Negative Temperature Coefficient, отрицательный температурный коэффициент) — это резистор, сопротивление которого падает с ростом температуры. Самый распространённый в любительских проектах тип — 10 kΩ при 25 °C с коэффициентом B 3950 K. Arduino не умеет напрямую измерять сопротивление, поэтому NTC включают в делитель напряжения вместе с постоянным резистором и читают напряжение в средней точке на аналоговом пине. У этой схемы есть приятное свойство: когда делитель питается от тех же 5 V, что служат опорным напряжением АЦП, измерение получается ратиометрическим, и результат не меняется, даже если питание 4,8 или 5,1 V. Напряжения делителя легко посчитать в утилите делителя напряжения.

Сопротивление NTC меняется с температурой не линейно, а экспоненциально, поэтому, в отличие от LM35, одним множителем результат не получить. На практике используют уравнение с B-коэффициентом: 1/T = 1/T0 + (1/B) × ln(R/R0). Здесь T — температура в кельвинах, T0 = 298,15 К (25 °C), R0 = 10 kΩ, а B = 3950. При комнатной температуре чувствительность очень высокая: по формуле B/T² сопротивление меняется примерно на 4,4% на градус. Поэтому NTC с допуском 1% ошибается при 25 °C всего примерно на ±0,25 °C; но к краям диапазона вступает в игру допуск коэффициента B, и погрешность растёт. Для лучшей точности в широком диапазоне применяют трёхточечное уравнение Стейнхарта — Харта; подробности — в статье NTC-термистор.

C++ (Arduino IDE)
1const int NTC_PIN = A1;          // bölücünün orta noktası / divider midpoint
2const float R_FIXED = 10000.0;   // 5V ile A1 arasındaki direnç / resistor between 5V and A1
3const float R0 = 10000.0;        // NTC'nin 25 °C'deki direnci / NTC resistance at 25 °C
4const float BETA = 3950.0;       // B katsayısı (veri sayfası) / B coefficient (datasheet)
5const float T0 = 298.15;         // 25 °C Kelvin cinsinden / 25 °C in kelvin
6const int SAMPLES = 16;          // ortalama için ölçüm sayısı / samples to average
7
8void setup() {
9  Serial.begin(9600);
10}
11
12void loop() {
13  long sum = 0;
14  for (int i = 0; i < SAMPLES; i++) {
15    sum += analogRead(NTC_PIN);
16    delay(2);
17  }
18  float adc = sum / (float)SAMPLES;
19
20  if (adc < 1.0 || adc > 1022.0) {                    // kopuk ya da kısa devre / open or shorted
21    Serial.println(F("NTC baglantisini kontrol et / Check the NTC wiring"));
22    delay(1000);
23    return;
24  }
25
26  float r = R_FIXED * adc / (1023.0 - adc);           // NTC direnci (ohm) / NTC resistance (ohm)
27  float invT = 1.0 / T0 + log(r / R0) / BETA;         // Beta denklemi / Beta equation
28  float tempC = 1.0 / invT - 273.15;                  // Kelvin -> °C
29
30  Serial.print(F("R: "));
31  Serial.print(r, 0);
32  Serial.print(F(" ohm  Sicaklik / Temp: "));
33  Serial.print(tempC, 1);
34  Serial.println(F(" C"));
35  delay(1000);
36}

В этой схеме постоянный резистор 10 kΩ стоит между 5V и A1, а NTC — между A1 и GND. С ростом температуры сопротивление NTC, а вместе с ним и напряжение на A1, падает. Код сначала вычисляет сопротивление NTC по «сырому» значению, затем температуру в кельвинах по уравнению с B-коэффициентом и переводит её в градусы Цельсия; усреднение 16 измерений снижает шум АЦП в четыре раза. При комнатной температуре один шаг АЦП на Uno соответствует примерно 0,09 °C, то есть разрешение в пять раз лучше, чем у LM35 с опорным 5 V. На готовых модулях NTC (например, KY-013) сторона, где стоит постоянный резистор, отличается от платы к плате; если при прикосновении к NTC чем-то тёплым показание падает, переверни формулу сопротивления: r = R_FIXED × (1023 − adc) / adc.

BME280: температура, влажность и давление в одном модуле

BME280 от Bosch измеряет температуру, относительную влажность и атмосферное давление на кристалле размером всего 2,5 × 2,5 мм и общается по I2C (адрес 0x76 или 0x77) или SPI. По температуре он даёт разрешение 0,01 °C и точность ±0,5 °C при 25 °C и ±1 °C в диапазоне от 0 до 65 °C; он способен делать десятки измерений в секунду, а во сне потребляет намного меньше 1 µA. Поэтому он идеален для метеостанций на батарейках. Сама микросхема не выдерживает больше 3,6 V: 6-выводные фиолетовые модули обычно рассчитаны только на 3,3 V, а 4-выводные модули со стабилизатором можно подключать к 5 V. При непрерывных измерениях микросхема немного нагревается и может завышать показания на несколько десятых градуса; для метеоизмерений достаточно принудительного режима (forced) с несколькими измерениями в минуту. Как работает шина I2C, объясняем в статье Что такое I2C?.

Некоторые модули, которые продаются как BME280, на самом деле оказываются BMP280, который не измеряет влажность. Внешне они почти одинаковые; надёжный способ отличить — прочитать регистр ID микросхемы: BME280 возвращает 0x60, BMP280 — 0x58. В таком случае пример из библиотеки Adafruit BME280 выводит «Could not find a valid BME280 sensor» (не найден рабочий датчик BME280). Код для чтения ID и решение проблемы — в статье BME280 и BMP280.

MAX6675 и термопара типа K: до 1000 °C

Термопара — это два провода из разных металлов, сваренные на одном конце. Разница температур между сварным спаем (горячим спаем) и местом, где провода подключаются к прибору (холодным спаем), создаёт в проводах крошечное напряжение; у термопары типа K это около 41 µV на градус. АЦП Arduino не способен прочитать такое маленькое напряжение, к тому же нужно знать температуру холодного спая. MAX6675 решает обе задачи сразу: усиливает напряжение термопары, выполняет компенсацию холодного спая, измеряя собственную температуру, и выдаёт результат по SPI с 12-битным разрешением 0,25 °C. Его диапазон — от 0 до +1023,75 °C, и это единственный вариант из списка для мест, где другие датчики не выживут: паяльник, печь для пиццы, мангал, муфельная печь или выхлоп.

Стоит знать и ограничения MAX6675: ниже 0 °C он не измеряет; собственная погрешность преобразователя — около ±2 °C в диапазоне от 0 до 700 °C, и к ней добавляются погрешность компенсации холодного спая до ±3 °C и допуск провода термопары. Так что рассчитывай на общую точность в несколько градусов; в печи на 800 °C такая разница роли не играет. Одно преобразование занимает 0,17–0,22 секунды, поэтому между двумя измерениями выжидай не меньше 250 мс. Если нужны и отрицательные температуры, лучше выбрать более новый MAX31855 (от −200 до +1350 °C, 14 бит). Как работает шина SPI, найдёшь в статье Что такое SPI?. Установи библиотеку MAX6675 library от Adafruit через «Менеджер библиотек» (Library Manager) в Arduino IDE и загрузи код ниже:

C++ (Arduino IDE)
1#include "max6675.h"
2
3const int thermoDO  = 4;    // SO: veri çıkışı / data out
4const int thermoCS  = 5;    // CS: çip seçimi / chip select
5const int thermoCLK = 6;    // SCK: saat / clock
6
7MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);
8
9void setup() {
10  Serial.begin(9600);
11  delay(500);                                   // ilk ölçümü bekle / wait for the first conversion
12}
13
14void loop() {
15  float c = thermocouple.readCelsius();
16  if (isnan(c)) {                               // D2 biti: termokupl açık / bit D2: thermocouple open
17    Serial.println(F("Termokupl takili degil / Thermocouple not connected"));
18  } else {
19    Serial.print(F("Sicaklik / Temp: "));
20    Serial.print(c, 2);
21    Serial.println(F(" C"));
22  }
23  delay(500);                                   // en az 250 ms bekle / wait at least 250 ms
24}
У выводов термопары есть полярность: подключи провода с отметками + и − к винтовым клеммам с такими же отметками на модуле; если их перепутать, показание будет падать по мере нагрева зонда. Не ставь модуль рядом с нагревающимся прибором: MAX6675 корректирует холодный спай по собственной температуре, поэтому любой нагрев платы сразу уходит в измерение. Если зонд не подключён или провод оборван, библиотека возвращает nan.

MLX90614: измерение температуры без контакта

MLX90614 — бесконтактный датчик температуры, который с помощью термобатареи (термостолбика) улавливает инфракрасное излучение предметов. Он выдаёт сразу два значения: температуру окружающей среды, то есть температуру собственного корпуса (от −40 до +125 °C), и температуру объекта, то есть поверхности, на которую он смотрит (от −70 до +380 °C). Около комнатной температуры он даёт точность ±0,5 °C и разрешение 0,02 °C; датчик откалиброван на заводе и общается по I2C (SMBus) с адресом 0x5A, а скорость шины не должна превышать 100 kHz. Он идеален, чтобы без прикосновения измерить вращающийся мотор, подшипник, горячую микросхему на плате или сковороду на плите.

У бесконтактного измерения два подвоха. Первый — поле зрения: датчик измеряет среднее по всему, что попадает в его конус обзора. У самой распространённой версии, MLX90614ESF-BAA, поле зрения 90°; это значит, что с расстояния 5 см она усредняет пятно диаметром около 10 см. Чтобы измерить маленький предмет, придвинь датчик ближе или выбери узкоугольную версию, например 35° (BCC) или 5° (BCI). Второй — коэффициент излучения: на заводе датчик настроен на 1,0. У матовой краски, пластика, дерева, кожи и воды коэффициент от 0,9 до 0,98, поэтому результат близок к правильному; а вот блестящие металлические поверхности излучают очень мало и кажутся гораздо холоднее, чем есть. Простое и действенное решение — наклеить на них кусочек матовой чёрной изоленты. Установи библиотеку Adafruit MLX90614 через «Менеджер библиотек» и попробуй этот код:

C++ (Arduino IDE)
1#include <Wire.h>
2#include <Adafruit_MLX90614.h>
3
4Adafruit_MLX90614 mlx = Adafruit_MLX90614();
5
6void setup() {
7  Serial.begin(9600);
8  if (!mlx.begin()) {                           // varsayılan adres 0x5A / default address 0x5A
9    Serial.println(F("MLX90614 bulunamadi / not found"));
10    while (true) delay(10);
11  }
12  Serial.print(F("Emisivite / Emissivity: "));
13  Serial.println(mlx.readEmissivity(), 2);      // fabrika ayarı 1.00 / factory default 1.00
14}
15
16void loop() {
17  Serial.print(F("Ortam / Ambient: "));
18  Serial.print(mlx.readAmbientTempC(), 2);      // sensör gövdesi / sensor body
19  Serial.print(F(" C   Nesne / Object: "));
20  Serial.print(mlx.readObjectTempC(), 2);       // baktığı yüzey / surface in view
21  Serial.println(F(" C"));
22  delay(500);
23}
MLX90614 не видит сквозь стекло: его оптический фильтр пропускает волны 5,5–14 µm, а в этом диапазоне стекло почти непрозрачно. Если направить датчик в окно, измерится стекло, а не улица. Кроме того, если перенести датчик из холодной комнаты в тёплую, несколько минут он может показывать неверно, пока корпус не придёт в равновесие.

Сводка подключения: Arduino Uno, ESP32 и Raspberry Pi Pico

Датчик и пинArduino UnoESP32Raspberry Pi Pico
DHT11 / DHT22: DATAD2GPIO 27GP15
DS18B20: DQ (+ подтяжка 4,7 kΩ)D3GPIO 4GP22
LM35: Vout (питание 5 V)A0GPIO 34 (ADC1)GP26 (ADC0)
NTC: средняя точка делителяA1 (делитель от 5V)GPIO 35 (ADC1, делитель от 3V3)GP27 (ADC1, делитель от 3V3)
BME280: SDA / SCLA4 / A5GPIO 21 / 22GP4 / GP5
MLX90614: SDA / SCLA4 / A5 (та же шина I2C)GPIO 21 / 22GP4 / GP5
MAX6675: SO / CS / SCKD4 / D5 / D6GPIO 19 / 23 / 18GP16 / GP17 / GP18
Питание (VCC)5V (3.3V для 6-выводного BME280)3V3 (5V/VIN для LM35)3V3(OUT) (VBUS для LM35)

ESP32 и Pico работают от 3,3 V; если питать делитель NTC от 3V3, опасное напряжение на вход АЦП не попадёт. На ESP32 подключай аналоговые датчики только к пинам ADC1 (GPIO 32–39), потому что пины ADC2 не работают при включённом Wi-Fi; а вот для двунаправленных линий данных, как у DHT и DS18B20, избегай GPIO 34–39 — эти пины работают только на вход. У BME280 (0x76) и MLX90614 (0x5A) разные адреса, так что они спокойно делят одни и те же два провода I2C. Все пины своей платы найдёшь в утилите распиновки, а цветовые коды подтягивающих резисторов — в утилите цветового кода резисторов.

Сравнительный тест на ESP32: три датчика в одном месте

Разницу между датчиками лучше всего увидеть своими глазами. Код для ESP32 ниже одновременно читает DS18B20, DHT22 и BME280 и показывает результаты тремя отдельными линиями в «Плоттере по последовательному соединению» (Serial Plotter) Arduino IDE. Поставь датчики рядом на макетной плате, не ближе 10 см к ESP32: во время работы ESP32 нагревается и влияет на соседний датчик. Для кода нужны библиотеки OneWire, DallasTemperature, DHT sensor library и Adafruit BME280.

C++ (Arduino IDE)
1#include <OneWire.h>
2#include <DallasTemperature.h>
3#include <DHT.h>
4#include <Wire.h>
5#include <Adafruit_Sensor.h>
6#include <Adafruit_BME280.h>
7
8const int ONE_WIRE_PIN = 4;     // DS18B20 DQ (4,7 kΩ pull-up -> 3V3)
9const int DHT_PIN = 27;         // DHT22 DATA
10
11OneWire oneWire(ONE_WIRE_PIN);
12DallasTemperature ds(&oneWire);
13DHT dht(DHT_PIN, DHT22);
14Adafruit_BME280 bme;            // I2C: SDA GPIO 21, SCL GPIO 22
15bool bmeOk = false;
16
17void setup() {
18  Serial.begin(115200);
19  ds.begin();
20  dht.begin();
21  bmeOk = bme.begin(0x76) || bme.begin(0x77);   // iki adresi de dene / try both addresses
22  if (!bmeOk) Serial.println("BME280 bulunamadi / not found");
23}
24
25void loop() {
26  ds.requestTemperatures();                     // 12 bitte ~750 ms sürer / takes ~750 ms at 12-bit
27  float tDs  = ds.getTempCByIndex(0);           // sensör yoksa -127 / -127 if missing
28  float tDht = dht.readTemperature();           // hata olursa NAN / NAN on error
29  float tBme = bmeOk ? bme.readTemperature() : NAN;
30
31  // Seri Çizici için etiket:değer biçimi / label:value format for the Serial Plotter
32  Serial.printf("DS18B20:%.2f,DHT22:%.1f,BME280:%.2f\n", tDs, tDht, tBme);
33  delay(2000);                                  // DHT22 en fazla 2 sn'de bir / DHT22 at most every 2 s
34}

Сначала подожди несколько минут и посмотри, насколько расходятся линии: разница 0,5–1 °C укладывается в пределы точности этих датчиков. Потом поставь рядом стакан тёплой воды или осторожно подуй на все три. DS18B20 и BME280 реагируют за несколько секунд, а линия DHT22 заметно отстаёт из-за пластиковой решётки. Если BME280 постоянно держится на несколько десятых градуса выше остальных, это микросхема греет сама себя. Этот небольшой эксперимент показывает разницу, о которой не пишут ни в одном даташите. Чтобы записывать показания долго, можно использовать модуль SD-карты или отправлять данные в Google Таблицы.

Измерение температуры на Raspberry Pi Pico с MicroPython

В прошивке MicroPython для Pico модули dht, onewire и ds18x20 уже встроены, поэтому для DHT и DS18B20 не нужно копировать на Pico никаких дополнительных файлов. Кроме того, у микросхемы RP2040 есть внутренний датчик температуры, подключённый к каналу 4 АЦП. Код ниже читает все три вместе:

MicroPython
1from machine import Pin, ADC
2import dht, onewire, ds18x20, time
3
4dht22 = dht.DHT22(Pin(15))                          # DHT22 DATA -> GP15
5ds = ds18x20.DS18X20(onewire.OneWire(Pin(22)))      # DS18B20 DQ -> GP22 (4,7 kΩ pull-up)
6roms = ds.scan()                                    # hattaki sensörler / sensors on the bus
7cpu = ADC(4)                                        # RP2040 dahili sensörü / internal sensor
8
9def cpu_temp():
10    v = cpu.read_u16() * 3.3 / 65535                # ham değer -> volt / raw value -> volts
11    return 27 - (v - 0.706) / 0.001721              # RP2040 veri sayfası formülü / datasheet formula
12
13while True:
14    t_ds = None
15    if roms:
16        ds.convert_temp()                           # ölçümü başlat / start conversion
17        time.sleep_ms(750)                          # 12 bit dönüşüm süresi / 12-bit conversion time
18        t_ds = round(ds.read_temp(roms[0]), 2)
19    try:
20        dht22.measure()
21        t_dht, nem = dht22.temperature(), dht22.humidity()
22    except OSError:                                 # okuma hatası / read error
23        t_dht = nem = None
24    print("DS18B20:", t_ds, "DHT22:", t_dht, "Nem / RH:", nem,
25          "Pico:", round(cpu_temp(), 1))
26    time.sleep(2)

Внутренний датчик измеряет температуру микросхемы, а не комнаты, и небольшие отклонения опорного напряжения АЦП могут сдвинуть результат на несколько градусов. Поэтому для измерения окружающей среды он не предназначен, но удобен, чтобы проверить, не перегревается ли плата. Не забудь подтяжку 4,7 kΩ на линии данных DS18B20: встроенные подтягивающие резисторы Pico слишком слабые для 1-Wire. Если Pico в новинку, начни со статьи Что такое Raspberry Pi Pico?.

Какой датчик температуры для какого проекта?

Проект или задачаРекомендуемый датчикПочему?
Первый проект, комнатный термометрDHT11Самый дешёвый, заодно даёт влажность; для комнаты ±2 °C достаточно
Домашняя и уличная метеостанцияBME280 или DHT22Опускается до −40 °C и даёт влажность; BME280 вдобавок измеряет давление и высоту
Аквариум, бак с водой, вода в котлеВодонепроницаемый зонд DS18B20Гильза из нержавейки, ±0,5 °C, длинный кабель
Холодильник и морозильникDS18B20Измеряет до −55 °C; DHT11 не видит ниже нуля
Измерение во многих точках (комнаты, теплица, трубы)DS18B20Десятки датчиков на одном пине, у каждого свой адрес
Инкубатор для яицDHT22 или BME280±0,5 °C около 37,5 °C плюс контроль влажности
Печь, мангал, паяльникMAX6675 + термопара типа KВыдерживает до 1000 °C
Хотэнд 3D-принтера, аккумуляторная сборкаNTC-термисторМаленький, дешёвый и быстрый; в 3D-принтерах стоят NTC на 100 kΩ в стеклянном корпусе
Мотор, подшипник, печатная плата, движущаяся детальMLX90614Измеряет без контакта
Знакомство с АЦП и аналоговым измерениемLM35 или NTCБиблиотека не нужна, работает по формуле

Идеи проектов с датчиками температуры

  • Умная теплица: измеряй температуру и влажность воздуха с DHT22, а температуру почвы — зондом DS18B20; управляй вентилятором и поливом через модуль реле. Полный проект смотри в статье проект умной теплицы.
  • Обогреватель для аквариума с термостатом: держи воду в пределах 25–26 °C с водонепроницаемым DS18B20; задай гистерезис 0,5 °C, чтобы реле не щёлкало при каждом крошечном изменении.
  • Метеостанция на батарейках: объедини BME280 с режимом глубокого сна ESP32 и измеряй раз в десять минут, чтобы система месяцами работала от батареек.
  • Термометр для печи для пиццы или мангала: выводи температуру печи крупными цифрами на OLED-дисплей с помощью MAX6675 и зонда типа K.
  • Бесконтактная сигнализация перегрева мотора: следи за температурой поверхности мотора или стола 3D-принтера с MLX90614 и включай зуммер при превышении порога.
  • Домашняя автоматизация: отправляй температуру каждой комнаты с ESP32 в Home Assistant по MQTT и управляй отоплением по этим данным.
  • Сторож морозильника: с DS18B20 включай тревогу, если внутри морозильника становится теплее −12 °C, и показывай значение на LCD-дисплее с I2C.

Частые ошибки и как их исправить

СимптомВероятная причинаРешение
DHT: nan или «Failed to read from DHT sensor!» (не удалось прочитать датчик)В коде указан не тот тип (DHT11/DHT22), нет подтяжки или чтение слишком частоеИсправь тип, добавь подтяжку 10 kΩ, выжидай 2 секунды между измерениями
DS18B20: −127 °CДатчик не найден: нет подтяжки, плохой кабель или не тот пинПоставь 4,7 kΩ между DQ и VCC, проверь соединения
DS18B20: всегда 85 °CЧтение до окончания преобразования или недостаточное питаниеВыжидай время преобразования, подай питание прямо на VDD
LM35: аномально высокое значение, датчик нагреваетсяВыводы питания подключены наоборотСразу отключи питание и исправь порядок выводов
LM35 или NTC: значение постоянно скачетШум АЦП, длинный кабель, нестабильное питание от USBУсредняй показания, добавь конденсатор 0,1 µF, укороти кабель
NTC: при нагреве температура падаетОриентация делителя не совпадает с кодомПереверни формулу сопротивления
BME280: «Could not find a valid BME280 sensor» (датчик не найден)Неверный адрес (0x76/0x77) или микросхема на самом деле BMP280Смени адрес, прочитай ID микросхемы (0x60 / 0x58)
BME280 или DHT: на 1–3 °C вышеСамонагрев, ESP32 или стабилизатор рядомОтодвинь датчик от платы, читай реже, введи поправку
MAX6675: nanТермопара не подключена или провод оборванПроверь винтовые клеммы и зонд
MAX6675: при нагреве значение падаетПерепутана полярность термопарыПоменяй местами провода + и −
MLX90614: блестящий металл кажется очень холоднымНизкий коэффициент излученияНаклей матовую чёрную изоленту или задай коэффициент излучения
MLX90614: маленький предмет измеряется неверноПоле зрения больше предметаПридвинь датчик ближе или возьми узкоугольную версию
Какой бы датчик ни был выбран, главный источник ошибки часто не сам датчик, а место, где он стоит. Датчик на прямом солнце, вплотную к стабилизатору напряжения или ESP32 или запертый в закрытой коробке измеряет температуру своего окружения, а не комнаты. Отодвинь датчик от платы, поставь его туда, где есть движение воздуха, один раз сравни с термометром, которому доверяешь, и исправь постоянную разницу в коде. Чтобы сгладить скачущие значения, загляни в методы из статьи фильтрация данных датчиков.

Коротко: DHT22 или BME280 для комнат и погоды, DS18B20 для воды и холодных мест, LM35 или NTC для знакомства с аналоговым измерением и быстрого отклика, MAX6675 для высоких температур и MLX90614 для поверхностей, до которых не дотронуться, — вот правильные отправные точки. Если хочется познакомиться и с другими видами датчиков, загляни в руководство по датчикам Arduino. В приложении BlueGrays есть пошаговые схемы и код для таких проектов, как «Температура и влажность с DHT11», «Измерение температуры с NTC и LCD-дисплеем 2x16», «Температура и влажность с DHT22 на ESP32 (с LCD-дисплеем)», «Регистратор температуры на ESP32» и «Умная станция полива».

Частые вопросы

Какой датчик температуры для Arduino самый точный?

Среди любительских датчиков самые точные варианты около комнатной температуры — DS18B20, DHT22, BME280 (при 25 °C) и MLX90614, все с точностью ±0,5 °C. DS18B20 выделяется в проводных и водонепроницаемых измерениях, DHT22 или BME280 — когда нужна ещё и влажность. Какой бы датчик ни был выбран, точность заметно вырастет, если один раз сравнить его с надёжным термометром и исправить смещение в коде.

Что купить: DHT11 или DHT22?

Если нужно лишь примерно следить за температурой и влажностью в комнате, DHT11 достаточно. Если нужна работа на улице, температуры ниже нуля или точность ±0,5 °C, бери DHT22: он измеряет от −40 до +80 °C и точнее показывает влажность. Оба работают с одной библиотекой и одним кодом; в скетче меняется только тип датчика.

Как измерить температуру воды с Arduino?

Лучший датчик для воды — водонепроницаемый зонд DS18B20 в гильзе из нержавеющей стали. Зонд опускают в воду, а провод данных подключают к цифровому пину Arduino с подтягивающим резистором 4,7 kΩ. Кабель и его соединения обычно не рассчитаны на долгое пребывание в горячей воде, поэтому в воду опускай только стальной наконечник.

Может ли Arduino измерять высокие температуры, например 500 °C?

Да. С термопарой типа K и модулем MAX6675 можно измерять от 0 примерно до 1024 °C. Наконечник термопары помещают внутрь печи, а модуль MAX6675 должен оставаться вдали от жара. Всегда проверяй, на какую температуру рассчитаны оболочка и кабель купленного зонда.

Можно ли собрать бесконтактный термометр на Arduino?

С MLX90614 можно собрать бесконтактный инфракрасный термометр, подключённый к Arduino; стандартная версия даёт точность ±0,5 °C около комнатной температуры. Для температуры тела нужна версия медицинской точности (±0,2 °C) и правильное расстояние измерения, и даже тогда такая сборка не заменяет медицинский прибор. При измерении следи, чтобы целевая поверхность полностью заполняла поле зрения датчика.

Почему датчик температуры завышает показания?

Самая частая причина — источник тепла рядом с датчиком: ESP32, стабилизатор напряжения или солнечный свет. Датчики вроде BME280 к тому же слегка нагреваются сами при непрерывных измерениях. Отодвинь датчик на 10–15 см от платы, читай его реже, а оставшуюся постоянную разницу исправь в коде, сравнив с термометром, которому доверяешь.

Все проекты
Температура и влажность с DHT11
#55Средний

Температура и влажность с DHT11

Насколько тепло в твоей комнате и влажный ли воздух или сухой? Датчик DHT11 измеряет температуру и влажность, а Arduino выводит значения на двухстрочный LCD-экран и обновляет их каждые пару секунд. Ес

4.7(47)
73
Измерение температуры с NTC и LCD-дисплеем 2x16
#44Новичок
Premium

Измерение температуры с NTC и LCD-дисплеем 2x16

Измерь температуру вокруг с помощью датчика, похожего на крошечную бусинку. Эта деталь, NTC, при нагреве легче пропускает электричество; Arduino читает это изменение, по формуле переводит его в градус

4.5(33)
44
Температура и влажность с DHT22 на ESP32 (с LCD-дисплеем)
#117Средний

Температура и влажность с DHT22 на ESP32 (с LCD-дисплеем)

Этот проект измеряет температуру и влажность воздуха датчиком DHT22 и в реальном времени показывает данные на I2C LCD 16x2. Данные читаются с датчика по однопроводному протоколу через библиотеку Adafruit DHT. Проект служит основой для IoT-метеостанций, умного дома или систем мониторинга среды в теплицах. Связь с DHT22 идёт через пин GPIO 4 у ESP32.

4.8(38)
56
Регистратор температуры на ESP32 (DHT22 + DS1307 RTC + microSD + OLED)
#144Продвинутый
Premium

Регистратор температуры на ESP32 (DHT22 + DS1307 RTC + microSD + OLED)

Собери на ESP32 регистратор температуры с отметками времени! Каждую минуту читай температуру и влажность с DHT22, бери реальное время из DS1307 RTC и записывай всё на карту microSD в формате CSV. OLED показывает текущую температуру (крупным шрифтом), влажность в процентах, время и счётчик записей. Файл /temp_log.csv на SD-карте открывается в Excel, Google Sheets или Python pandas — идеально для теплиц, комнат, лабораторий и хранения продуктов.

4.7(7)
12
Часы, календарь и метеостанция на матрице (MAX7219, DS1307)
#85Средний
Premium

Часы, календарь и метеостанция на матрице (MAX7219, DS1307)

Табло с бегущей строкой для стола или стены, которое по очереди показывает время, дату и погоду в комнате. На светодиодном дисплее 8x32 сначала видна температура в градусах Цельсия и Фаренгейта, затем

5.0(50)
66
Умная станция полива
#83Продвинутый
Premium

Умная станция полива

Садовник, который сам поливает растения, чтобы они не засохли, пока ты в отпуске. Датчик влажности почвы измеряет, насколько влажная земля; когда она сохнет, Arduino на несколько секунд включает водян

5.0(42)
57
LCD-экран с I2C
#32Новичок
Premium

LCD-экран с I2C

Дай своему Arduino собственный экран и заставь его написать первое сообщение. Двухстрочный LCD-экран подключается всего несколькими проводами; в верхней строке появляется приветствие, затем второе соо

4.8(53)
70