Датчики температуры для 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, стенд, на котором три датчика соревнуются друг с другом, и какой датчик выбрать для какого проекта. Для большинства этих датчиков у нас есть и подробные уроки; ссылки на них найдёшь в соответствующих разделах.





На что смотреть при выборе датчика температуры?
Прежде чем сравнивать датчики, нужно правильно понимать термины из даташитов. Чаще всего путают точность и разрешение. Точность показывает, насколько показание близко к реальной температуре; разрешение — это самый маленький шаг, который датчик способен различить. 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 датчиков температуры
Первая таблица сводит характеристики измерения, вторая — подключение и стоимость. Значения взяты из даташитов; если не указано иное, точность относится к комнатной температуре и ухудшается к краям диапазона.
| Датчик | Диапазон измерений | Точность | Разрешение | Скорость чтения |
|---|---|---|---|---|
| DHT11 | 0 … +50 °C | ±2 °C | 1 °C | Раз в секунду |
| DHT22 (AM2302) | −40 … +80 °C | ±0,5 °C | 0,1 °C | Раз в 2 секунды |
| DS18B20 | −55 … +125 °C | ±0,5 °C (от −10 до +85 °C) | 0,0625 °C (12 бит) | 750 мс (12 бит), 94 мс (9 бит) |
| LM35DZ | 0 … +100 °C (LM35: −55 … +150 °C) | Типично ±0,6 °C, гарантированно ±1,5 °C | 0,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 + термопара типа K | 0 … +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 м | Влажность | Средняя |
| DS18B20 | 1-Wire, много датчиков на 1 пине | 3,0–5,5 V | Десятки метров | Нет | Низкая |
| LM35 | Аналоговый, 1 пин АЦП | 4–30 V | Короткий, ≈ 1 м (длиннее — с мерами предосторожности) | Нет | Низкая |
| NTC | Аналоговый, 1 пин АЦП через делитель | 3,3 или 5 V через делитель | Несколько метров | Нет | Самая низкая |
| BME280 | I2C (2 пина) или SPI | Микросхема 1,71–3,6 V; модуль со стабилизатором 5 V | Короткий, меньше 50 см | Влажность и давление | Средняя |
| MAX6675 | SPI, 3 пина (только чтение) | 3,0–5,5 V | Провод термопары может тянуться на метры | Нет | Средняя |
| MLX90614 | I2C (SMBus), 2 пина | Версия на 3 V или 5 V (на модуле может быть стабилизатор) | Короткий (I2C); измеряет без контакта | Температура окружающей среды | Высокая |
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, если поменять одно слово.
DS18B20: водонепроницаемый, надёжный и много датчиков на одном пине

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, а как работает АЦП, найдёшь в статье об аналого-цифровом преобразовании.
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-термистор.
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?.
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 и загрузи код ниже:
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}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 через «Менеджер библиотек» и попробуй этот код:
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}Сводка подключения: Arduino Uno, ESP32 и Raspberry Pi Pico
| Датчик и пин | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| DHT11 / DHT22: DATA | D2 | GPIO 27 | GP15 |
| DS18B20: DQ (+ подтяжка 4,7 kΩ) | D3 | GPIO 4 | GP22 |
| LM35: Vout (питание 5 V) | A0 | GPIO 34 (ADC1) | GP26 (ADC0) |
| NTC: средняя точка делителя | A1 (делитель от 5V) | GPIO 35 (ADC1, делитель от 3V3) | GP27 (ADC1, делитель от 3V3) |
| BME280: SDA / SCL | A4 / A5 | GPIO 21 / 22 | GP4 / GP5 |
| MLX90614: SDA / SCL | A4 / A5 (та же шина I2C) | GPIO 21 / 22 | GP4 / GP5 |
| MAX6675: SO / CS / SCK | D4 / D5 / D6 | GPIO 19 / 23 / 18 | GP16 / 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.
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 АЦП. Код ниже читает все три вместе:
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: маленький предмет измеряется неверно | Поле зрения больше предмета | Придвинь датчик ближе или возьми узкоугольную версию |
Коротко: 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
Насколько тепло в твоей комнате и влажный ли воздух или сухой? Датчик DHT11 измеряет температуру и влажность, а Arduino выводит значения на двухстрочный LCD-экран и обновляет их каждые пару секунд. Ес

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

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

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

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

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

LCD-экран с I2C
Дай своему Arduino собственный экран и заставь его написать первое сообщение. Двухстрочный LCD-экран подключается всего несколькими проводами; в верхней строке появляется приветствие, затем второе соо
Другие статьи
Приложение BlueGrays
Собери эту схему шаг за шагом в телефоне
Схема подключения, код и список деталей на одном экране. 200+ проектов на Arduino, ESP32 и Pico готовы к сборке.
Наведи камеру телефона
Наведи камеру на код — откроется магазин приложений на телефоне.
или открыть магазин

