Компоненты · 13 мин чтения

Датчик температуры LM35 и Arduino: подключение, формула и код

Подключение и распиновка LM35 к Arduino, формула перевода analogRead в °C, разрешение 0,1 °C с опорным 1,1 V, усреднение, код для ESP32 и Pico, LM35 против DS18B20.

LM35 — дешёвый аналоговый датчик температуры с тремя ножками, который напрямую превращает температуру в напряжение в градусах Цельсия. Для работы LM35 с Arduino не нужны ни библиотека, ни сложный протокол: средняя ножка подключается к аналоговому пину, читается через analogRead(), а температура получается формулой в одну строку. Его выход растёт ровно на 10 mV на каждый 1 °C, так что при 25 °C он даёт 250 mV, а при 100 °C — 1 V.

В этом руководстве ты узнаешь, как работает LM35, какая у него распиновка и какую ошибку с перевёрнутым подключением почти каждый делает хоть раз, как вычислить °C из значения analogRead, как сделать показания более чем в четыре раза точнее с внутренним опорным напряжением 1,1 V у Arduino Uno и как успокоить дрожащие значения усреднением. Затем разберёшься, на что обратить внимание на ESP32 и Raspberry Pi Pico с их 3,3 V, как измеряют отрицательные температуры и когда выбирать LM35, а когда DS18B20 или DHT11.

Что такое LM35 и как он работает?

Внутри LM35 два транзистора, работающие при разной плотности тока. Разница их напряжений база-эмиттер меняется прямо пропорционально абсолютной температуре; этот метод называется delta-VBE. Внутренний усилитель усиливает эту крошечную разницу и масштабирует её так, чтобы при 0 °C на выходе было 0 V. Поэтому, в отличие от датчиков на основе шкалы Кельвина вроде LM335, из выхода не нужно вычитать большое постоянное напряжение: температура (°C) = выходное напряжение (mV) / 10. Датчик подстраивается ещё на кристалле при производстве, поэтому не требует дополнительной калибровки, а его выходная характеристика почти идеально прямая; типичная нелинейность всего ±0,25 °C.

ПараметрЗначение
Выход10 mV/°C, 0 V при 0 °C (250 mV при 25 °C, 1000 mV при 100 °C)
Напряжение питания4–30 V
Ток потребленияМеньше 60 µA (типично 56 µA при 5 V)
СамонагревОколо 0,08 °C в неподвижном воздухе
НелинейностьТипично ±0,25 °C
Выходное сопротивление0,1 Ω при нагрузке 1 mA
Ёмкостная нагрузкаДо 50 pF без дополнительных мер
КорпусTO-92 (самый распространённый), TO-220, SOIC-8 и металлический TO-46

LM35 — не одна деталь, а целое семейство. Буквенный суффикс определяет диапазон измерения и гарантированную точность, а Z на конце обозначает пластиковый корпус TO-92. По даташиту в пластиковом TO-92 выпускаются LM35C, LM35CA и LM35D, а большинство деталей, которые продаются в магазинах для радиолюбителей как «LM35», на самом деле LM35DZ. Так что твой датчик, скорее всего, гарантирован только для 0–100 °C и при 25 °C может ошибаться до ±1,5 °C, хотя его типичная погрешность около ±0,6 °C. Какой именно у тебя, подскажет маркировка на корпусе.

МодельДиапазон измеренияГарантированная точность при 25 °CХудший случай на краях диапазона
LM35A−55 … +150 °C±0,5 °C±1 °C
LM35−55 … +150 °C±1 °C±1,5 °C
LM35CA−40 … +110 °C±0,5 °C±1,5 °C
LM35C−40 … +110 °C±1 °C±2 °C
LM35D (LM35DZ)0 … +100 °C±1,5 °C±2 °C

Распиновка LM35 и самая частая ошибка с перевёрнутым подключением

Если повернуть LM35 плоской стороной к себе, ножками вниз, порядок слева направо такой: вывод 1 +Vs (питание), вывод 2 Vout (выход) и вывод 3 GND (земля). Рисунок в даташите — вид снизу, поэтому многие мысленно переворачивают его и подключают наоборот. У модулей LM35 на маленькой плате выводы обычно подписаны VCC (или +), OUT (или S) и GND (или −); в этом случае доверяй надписям на плате.

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

Подключение LM35 к Arduino: Uno, ESP32 и Pico

Вывод LM35Arduino UnoESP32Raspberry Pi Pico
1 · +Vs (слева)5V5V / VIN (5 V от USB)VBUS, вывод 40 (5 V от USB)
2 · Vout (посередине)A0GPIO 34 (ADC1)GP26 / ADC0, вывод 31
3 · GND (справа)GNDGNDAGND, вывод 33, или GND, вывод 38
Конденсатор 0,1 µFМежду +Vs и GND, рядом с датчикомМежду +Vs и GND, рядом с датчикомМежду +Vs и GND, рядом с датчиком
Для условий с помехами производитель рекомендует керамический конденсатор 0,1 µF между +Vs и GND прямо у датчика; он маркируется «104», а расшифровать код можно утилитой «Код конденсатора». Выход LM35 без проблем тянет не больше 50 pF ёмкостной нагрузки; несколько метров кабеля превышают это, и выход может начать генерировать. С длинным кабелем поставь последовательно с выходом резистор 2 kΩ или добавь между выходом и GND демпфирующую RC-цепочку из 75 Ω + 1 µF; витая пара тоже заметно снижает наводки.

От analogRead к °C: формула для LM35

Аналого-цифровой преобразователь (АЦП) Arduino Uno 10-битный: он делит диапазон между 0 V и опорным напряжением на 1024 шага и выдаёт число от 0 до 1023. Опорное напряжение по умолчанию 5 V, поэтому каждый шаг равен 5 / 1024 = 4,88 mV. Сначала сырое значение переводят в напряжение, потом напряжение — в температуру: напряжение = raw × 5.0 / 1024 и температура = напряжение × 100. В сумме температура ≈ raw × 0.488. В некоторых примерах вместо 1024 стоит 1023; разница — одна тысячная, она ничтожна на фоне собственной погрешности LM35, но правильное значение — 1024. Чтобы разобраться в АЦП подробнее, загляни в статью об аналого-цифровом преобразовании (АЦП).

Значение analogReadНапряжение (опорное 5 V)Температура
410,200 V20,0 °C
510,249 V24,9 °C
520,254 V25,4 °C
610,298 V29,8 °C
2051,001 V100,1 °C

Присмотрись к таблице: при комнатной температуре АЦП выдаёт всего около 50, а изменение на один шаг сдвигает температуру примерно на 0,5 °C. Поэтому показание прыгает туда-сюда между 24,9 и 25,4; датчик не неисправен, это просто разрешение опорного 5 V. Скоро исправим это внутренним опорным напряжением.

Первое измерение шаг за шагом

  1. Вставь LM35 в макетную плату; повернув его плоской стороной к себе, подключи левую ножку к 5V, а правую — к GND.
  2. Среднюю ножку (Vout) соедини перемычкой с A0. Если есть конденсатор 0,1 µF, поставь его между +Vs и GND.
  3. Подключи Arduino по USB и через несколько секунд потрогай датчик: если он комнатной температуры, всё в порядке; если горячий, подключение перевёрнуто.
  4. Загрузи код ниже и открой монитор порта на скорости 9600 бод.
  5. Зажми датчик между пальцами; значение должно медленно расти, а когда отпустишь — снижаться.
C++ (Arduino IDE)
1const int LM35_PIN = A0;   // LM35 orta bacak (Vout) / LM35 middle leg (Vout)
2
3void setup() {
4  Serial.begin(9600);
5}
6
7void loop() {
8  int raw = analogRead(LM35_PIN);          // 0–1023 ham değer / raw value 0–1023
9  float voltage = raw * 5.0 / 1024.0;      // 5 V referansla volta çevir / convert to volts (5 V reference)
10  float tempC = voltage * 100.0;           // 10 mV/°C: 0,25 V = 25 °C / 0.25 V = 25 °C
11
12  Serial.print(F("Ham / Raw: "));
13  Serial.print(raw);
14  Serial.print(F("  Gerilim / Voltage: "));
15  Serial.print(voltage, 3);
16  Serial.print(F(" V  Sicaklik / Temp: "));
17  Serial.print(tempC, 1);
18  Serial.println(F(" C"));
19  delay(1000);
20}

Каждую секунду код читает сырое значение на A0, переводит его сначала в напряжение, потом в температуру и выводит все три числа в монитор порта. Вывод сырого значения очень помогает при отладке: если оно всегда 0, с Vout не приходит напряжение; если близко к 1023, аналоговый пин случайно соединён с 5 V; если скачет случайно, A0 висит в воздухе. Постоянные строки внутри макроса F() экономят 2 КБ ОЗУ у Uno. Больше советов по монитору порта — в статье о мониторе порта Arduino.

Повышаем разрешение внутренним опорным напряжением 1,1 V

У опорного 5 V две проблемы. Первая — грубое разрешение, которое только что было видно в таблице. Вторая коварнее: 5 V от USB часто оказываются где-то между 4,7 и 5,1 V, а в коде записано 5.0, и разница прямиком попадает в температуру. Например, если плата на самом деле работает от 4,8 V, 25 °C будут показаны как 26 °C, а когда USB-порт компьютера проседает под нагрузкой, температура будто меняется сама. Решение — использовать внутреннее опорное напряжение 1,1 V, встроенное в ATmega328P на Arduino Uno и Nano. После analogReference(INTERNAL) каждый шаг равен 1,1 / 1024 = 1,07 mV, то есть примерно 0,11 °C. Взамен можно измерить не больше 1,1 V, то есть 110 °C, чего для диапазона LM35DZ 0–100 °C и так хватает с запасом.

Опорное напряжениеКомандаОдин шагШаг температурыНаибольшее измеримое значение
5 V (по умолчанию)analogReference(DEFAULT)4,88 mV0,49 °C150 °C (предел датчика)
3,3 V (подключено к AREF)analogReference(EXTERNAL)3,22 mV0,32 °C150 °C (предел датчика)
Внутреннее 1,1 VanalogReference(INTERNAL)1,07 mV0,11 °C110 °C

Опорное 1,1 V не на каждом чипе ровно 1,1 V; по даташиту ATmega328P оно может быть от 1,0 до 1,2 V. Без калибровки это означает ошибку масштаба до 9%. Исправить легко: загрузи код ниже, измерь мультиметром напряжение между пином AREF и GND и запиши значение в константу VREF (например, const float VREF = 1.083;). Это нужно сделать один раз для каждой платы, и результат остаётся верным. Кроме того, код усредняет 32 выборки на каждое показание:

C++ (Arduino IDE)
1const int LM35_PIN = A0;
2const float VREF = 1.1;     // AREF'te ölçtüğün değeri yaz (ör. 1.083) / write the voltage you measured on AREF (e.g. 1.083)
3const int SAMPLES = 32;     // ortalama için ölçüm sayısı / number of samples to average
4
5void setup() {
6  Serial.begin(9600);
7  analogReference(INTERNAL);        // Uno/Nano: 1,1 V dahili referans / 1.1 V internal reference
8  for (int i = 0; i < 5; i++) {     // referans değişti, ilk okumaları at / discard the first readings after switching
9    analogRead(LM35_PIN);
10    delay(10);
11  }
12}
13
14float readTempC() {
15  long sum = 0;
16  for (int i = 0; i < SAMPLES; i++) {
17    sum += analogRead(LM35_PIN);
18    delay(2);
19  }
20  float raw = sum / (float)SAMPLES;       // ortalama ham değer / average raw value
21  return raw * VREF / 1024.0 * 100.0;     // her basamak ~0,107 °C / each step is ~0.107 °C
22}
23
24void loop() {
25  float t = readTempC();
26  Serial.print(F("Sicaklik / Temp: "));
27  Serial.print(t, 2);
28  Serial.println(F(" C"));
29  if (t > 108.0) {
30    Serial.println(F("Uyari: 1,1 V sinirina yakin / Warning: close to the 1.1 V limit"));
31  }
32  delay(1000);
33}
analogReference(INTERNAL) действует на все аналоговые входы платы: если в том же проекте читаешь ещё и потенциометр или фоторезистор, всё выше 1,1 V будет читаться как 1023. Никогда не подавай внешнее напряжение на пин AREF, когда выбрано внутреннее опорное; если хочешь подключить 3,3 V к AREF, нужно вызвать analogReference(EXTERNAL) до первого analogRead, иначе внутренний опорный источник и внешний окажутся закорочены, и микроконтроллер может пострадать. На Arduino Mega эта опция называется INTERNAL1V1; на Leonardo и Micro INTERNAL даёт 2,56 V, а на Uno R4 analogReference(AR_INTERNAL) — это 1,5 V.

Усреднение и снижение шума

Одно измерение analogRead может колебаться на шаг-другой из-за наводок на проводах и пульсаций питания. Самый простой и действенный способ — усреднить несколько измерений: случайный шум падает пропорционально квадратному корню из числа выборок, так что усреднение 16 измерений снижает шум вчетверо, а 64 — в восемь раз. Температура меняется медленно, поэтому десятки измерений за несколько миллисекунд ничего не стоят. Для ещё более плавной кривой используй экспоненциальный фильтр: filtered = filtered + 0.1 × (new − filtered). Этот фильтр учитывает лишь 10 процентов каждого нового измерения и хранит в памяти одну переменную. Другие методы, например скользящее среднее и медиану, сравниваем в статье о фильтрации данных датчиков.

  • Отбрасывай первое измерение после смены канала: если читаешь несколько аналоговых датчиков, конденсатор выборки АЦП ненадолго хранит напряжение предыдущего канала; читай тот же пин дважды и игнорируй первый результат.
  • Веди GND датчика прямо к пину GND Arduino: если по тому же проводу земли течёт ток реле, мотора или светодиодной ленты, появляются сдвиги в милливольты, а у LM35 каждые 10 mV — это один градус.
  • Кабель покороче и подальше от силовых проводов: длинные неэкранированные провода работают как антенны; при необходимости используй витую пару или экранированный кабель.
  • Держи датчик подальше от источников тепла: LM35 прямо рядом со стабилизатором напряжения, модулем ESP32 или реле измеряет температуру платы, а не комнаты.
  • Один раз откалибруй смещение: оставь LM35 рядом с надёжным термометром и вычти постоянную разницу в коде.

LM35 с ESP32: питание 3,3 V и линейность АЦП

ESP32 работает от 3,3 V, а даташит LM35 требует питания не ниже 4 V. LM35 с питанием 3,3 V может казаться рабочим при комнатной температуре, но его точность не гарантирована. Правильно питать датчик от пина 5V платы (на некоторых платах VIN), то есть от 5 V с USB. ESP32 это не повредит: даже при самой высокой температуре (150 °C) выход LM35 не превышает 1,5 V. Выход всегда подключай к пину ADC1 (GPIO 32–39), потому что пины ADC2 нельзя использовать при включённом Wi-Fi. Подробную карту пинов своей платы смотри в утилите «Распиновка», а если ESP32 для тебя в новинку, прочитай Что такое ESP32.

Вторая проблема — линейность АЦП ESP32. Он 12-битный (0–4095), но нелинеен на краях: напряжения ниже 100 mV он почти не различает, а отклонение меняется от платы к плате. Поскольку при комнатной температуре LM35 выдаёт всего 200–300 mV, это касается тебя напрямую. Решение в два шага: выбери ослабление под диапазон напряжений LM35 и вместо сырого значения используй analogReadMilliVolts(), которая применяет калибровочные данные, записанные в чип на производстве. Эта функция сразу возвращает милливольты, так что для температуры достаточно разделить результат на 10.

ОслаблениеТочно измеряемый диапазонЭквивалент для LM35
ADC_0db100–950 mV10–95 °C
ADC_2_5db100–1250 mV10–125 °C
ADC_6db150–1750 mV15–150 °C
ADC_11db (по умолчанию)150–2450 mV15–150 °C, самое грубое разрешение
C++ (Arduino IDE)
1const int LM35_PIN = 34;     // ADC1_CH6, Wi-Fi açıkken de çalışır / works while Wi-Fi is on
2const int SAMPLES = 64;      // ortalama için ölçüm sayısı / number of samples to average
3
4void setup() {
5  Serial.begin(115200);
6  analogReadResolution(12);                       // 0–4095
7  analogSetPinAttenuation(LM35_PIN, ADC_2_5db);   // ~100–1250 mV, yani 10–125 °C / i.e. 10–125 °C
8}
9
10void loop() {
11  uint32_t sum = 0;
12  for (int i = 0; i < SAMPLES; i++) {
13    sum += analogReadMilliVolts(LM35_PIN);        // kalibre edilmiş mV / calibrated millivolts
14    delay(1);
15  }
16  float mv = sum / (float)SAMPLES;
17  float tempC = mv / 10.0;                        // 10 mV = 1 °C
18  Serial.printf("Gerilim / Voltage: %.1f mV  Sicaklik / Temp: %.2f C\n", mv, tempC);
19  delay(1000);
20}
Поскольку ниже 100 mV ESP32 надёжно не измеряет при любом ослаблении, показания LM35 на ESP32 ниже 10 °C неверны. Для холодных комнат, улицы или холодильника используй DS18B20. Если в схеме, где есть только 3,3 V, нужен именно аналоговый датчик, хорошая альтернатива — TMP36: он работает от 2,7–5,5 V и при 0 °C выдаёт 500 mV. Распиновка у него такая же, как у LM35, а формула — температура = (mV − 500) / 10.

LM35 с Raspberry Pi Pico и MicroPython

12-битный АЦП Pico находится на пинах GP26, GP27 и GP28; опорным напряжением служит ADC_VREF — отфильтрованная линия 3,3 V. В MicroPython read_u16() масштабирует результат в диапазон 0–65535, так что напряжение = raw × 3.3 / 65535. Теоретическое разрешение 0,8 mV, то есть примерно 0,08 °C, но на практике АЦП Pico немного шумит и даёт небольшие скачки на определённых значениях, так что усреднение и здесь обязательно. Питай LM35 от VBUS (вывод 40), где есть 5 V от USB; если Pico работает не от USB, а от батарей, убедись, что напряжение на VSYS выше 4 V, и питай датчик оттуда. Если Pico у тебя впервые, установку MicroPython найдёшь в статье Что такое Raspberry Pi Pico.

MicroPython
1from machine import ADC, Pin
2import time
3
4# Pin(23, Pin.OUT, value=1)  # yalnız Pico (W değil): regülatör PWM modu, daha az gürültü / Pico (not W) only: SMPS PWM mode, less noise
5lm35 = ADC(26)               # GP26 = ADC0, fiziksel pin 31 / physical pin 31
6VREF = 3.3                   # ADC_VREF'i multimetreyle ölçüp yaz / measure ADC_VREF with a multimeter
7SAMPLES = 64                 # ortalama için ölçüm sayısı / number of samples to average
8
9
10def read_temp_c():
11    total = 0
12    for _ in range(SAMPLES):
13        total += lm35.read_u16()   # 0–65535, 12 bit sonuç 16 bite ölçeklenir / 12-bit result scaled to 16 bits
14    raw = total / SAMPLES
15    volts = raw * VREF / 65535
16    return volts * 100             # 10 mV/°C
17
18
19while True:
20    t = read_temp_c()
21    print("Sicaklik / Temp: {:.2f} C".format(t))
22    time.sleep(1)

В чипе Pico есть и датчик температуры (ADC(4)), но он измеряет температуру самого чипа, а не комнаты, и во время работы обычно завышает на несколько градусов; для комнатной температуры нужен внешний датчик вроде LM35. Чтобы получить более чистые результаты на обычной Pico, можно выставить GP23 в HIGH и перевести стабилизатор питания платы в режим PWM; это уменьшает пульсации на ADC_VREF, но в простое ток потребления чуть растёт. На Pico W этот пин занят беспроводным чипом, поэтому в коде эта строка закомментирована.

Измерение отрицательных температур с LM35

В базовой схеме LM35 измеряет только от 2 °C до 150 °C: его выходной каскад умеет отдавать ток, но почти не умеет его принимать, поэтому выход не может опуститься ниже земли. Для отрицательных температур в даташите два варианта. Первый — подключить выход к отрицательному питанию через резистор (R = Vs / 50 µA; 100 kΩ для −5 V); в проектах на Arduino он используется редко, потому что отрицательного питания нет. Второй — схема с однополярным питанием: вывод GND у LM35 поднимают примерно на 1 V над землёй двумя последовательными диодами (например, 1N4148), между выходом и землёй ставят резистор 18 kΩ, затем выход читают на A0, а вывод GND датчика — на A1. Температура равна (напряжение A0 − напряжение A1) × 100. Чтобы на выводах самого LM35 в этой схеме оставалось не меньше 4 V, питай +Vs не от 5 V, а от VIN (например, от адаптера на 9 V) и используй опорное 5 V. Помни, что распространённый LM35DZ ниже 0 °C не гарантирован; если отрицательные показания нужны часто, с DS18B20 хлопот гораздо меньше.

LM35, DS18B20 или DHT11

Датчик температуры DS18B20
Датчик температуры DS18B20
Датчик температуры и влажности DHT11
Датчик температуры и влажности DHT11
ПараметрLM35 (LM35DZ)DS18B20DHT11
ВыходАналоговый, 10 mV/°CЦифровой (1-Wire)Цифровой (один провод)
Диапазон измерения0 … +100 °C (LM35: −55 … +150 °C)−55 … +125 °C0 … +50 °C
ТочностьТипично ±0,6 °C, не хуже ±1,5 °C при 25 °C±0,5 °C (−10 … +85 °C)±2 °C
Питание4–30 V3,0–5,5 V3–5,5 V
ВлажностьНетНетДа
БиблиотекаНе нужнаOneWire + DallasTemperatureDHT sensor library
Время измеренияМгновенно, выход непрерывныйДо 750 мс при 12 битахНе чаще 1 измерения в секунду
С ESP32 и PicoС питанием 5 V; учитывай ограничения АЦПНапрямую от 3,3 VНапрямую от 3,3 V
Несколько датчиков на одном пинеНет, каждому по аналоговому пинуДаНет
Водонепроницаемая версияНет, герметизировать придётся самостоятельноЗонд из нержавеющей сталиНет

Коротко: если нужен простой термометр, который быстро реагирует, не требует библиотеки, занимает один аналоговый пин и работает на Arduino с 5 V, LM35 идеален; к тому же это самый наглядный датчик для изучения аналоговых измерений и опорных напряжений АЦП. Если кабель длинный, нужны отрицательные температуры, датчик опускается в жидкость или работаешь с платами на 3,3 V, такими как ESP32 и Pico, лучше выбрать DS18B20. Если нужна ещё и влажность, используй DHT11 или его более точного собрата DHT22. Более широкое сравнение, включающее NTC-термисторы, BME280 и другие, — в статье Сравнение датчиков температуры для Arduino.

Идеи проектов с LM35

Самый популярный проект с LM35 — термостат, который включает вентилятор, когда температура превышает заданное значение. Главное здесь — гистерезис: если вентилятор включается при 30 °C и выключается при 28 °C, реле не будет щёлкать каждую секунду, пока температура колеблется у порога, и его контакты не изнашиваются. Вентилятором можно управлять через модуль реле на D7:

C++ (Arduino IDE)
1const int LM35_PIN = A0;
2const int RELAY_PIN = 7;          // röle modülünün IN pini / relay module IN pin
3const float ON_TEMP = 30.0;       // bu değerde fan açılır / fan turns on here
4const float OFF_TEMP = 28.0;      // bu değerde fan kapanır / fan turns off here
5const float VREF = 1.1;           // ölçtüğün AREF değeri / your measured AREF value
6bool fanOn = false;
7
8float readTempC() {
9  long sum = 0;
10  for (int i = 0; i < 32; i++) {
11    sum += analogRead(LM35_PIN);
12  }
13  return (sum / 32.0) * VREF / 1024.0 * 100.0;
14}
15
16void setup() {
17  Serial.begin(9600);
18  pinMode(RELAY_PIN, OUTPUT);
19  digitalWrite(RELAY_PIN, LOW);
20  analogReference(INTERNAL);      // 1,1 V referans / 1.1 V reference
21  analogRead(LM35_PIN);           // ilk okumayı at / discard the first reading
22  delay(10);
23}
24
25void loop() {
26  float t = readTempC();
27  if (!fanOn && t >= ON_TEMP) fanOn = true;      // eşik aşıldı / threshold exceeded
28  if (fanOn && t <= OFF_TEMP) fanOn = false;     // yeterince soğudu / cooled down enough
29  digitalWrite(RELAY_PIN, fanOn ? HIGH : LOW);   // aktif-HIGH röle varsayıldı / assumes an active-HIGH relay
30  Serial.print(t, 1);
31  Serial.println(fanOn ? " C  fan ON" : " C  fan OFF");
32  delay(1000);
33}
  • Термостат вентилятора с регулировкой: объедини код выше с DC-вентилятором и реле и повышай или понижай порог двумя кнопками.
  • Цифровой термометр с LCD: показывай температуру на I2C LCD или OLED-дисплее вместе с минимумом и максимумом за день.
  • Сигнализация перегрева: включай зуммер и светодиод, когда слишком сильно нагреваются блок питания, зарядное устройство или мотор 3D-принтера.
  • Комнатный термометр с Wi-Fi: показывай температуру, измеренную ESP32, на веб-странице, которую открываешь на телефоне.
  • Управление теплицей и инкубатором: собери систему, которая управляет нагревателем и вентилятором по температуре; подробности в статье о проекте умной теплицы.
  • Регистратор температуры: записывай показание на SD-карту каждую минуту и строй суточную кривую температуры в Excel.

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

СимптомВероятная причинаРешение
Датчик раскаляется так, что не потрогатьПерепутаны +Vs и GNDСразу отключи питание; если смотреть на плоскую сторону, порядок должен быть +Vs, Vout, GND
Значение всегда 0На датчик не приходит питание, или Vout подключён не к тому пину, что в кодеИзмерь мультиметром 5 V между +Vs и GND и проверь, что Vout идёт на A0
Значения скачут случайноA0 висит в воздухе, или плохой контакт в макетной платеЗамени перемычку и переставь датчик в другой ряд макетной платы
Значение скачет шагами по 0,5 °CРазрешение опорного 5 VИспользуй analogReference(INTERNAL) и усреднение
Значение прыгает при переключении реле или мотораПадение напряжения и помехи на общей землеВеди GND датчика прямо к Arduino и добавь конденсатор 0,1 µF
Показывает на 2–3 °C больше реальной температурыДатчик стоит рядом со стабилизатором или модулем ESP32Вынеси датчик на кабеле подальше от платы
Другие аналоговые датчики показывают 1023Опорное INTERNAL ограничивает все аналоговые входы до 1,1 VЧитай другие датчики с опорным 5 V или дели их напряжение
На холоде ESP32 показывает бессмыслицуАЦП ESP32 не измеряет точно ниже 100 mVНиже 10 °C используй DS18B20
Простой способ проверить точность LM35 — оставить его на несколько минут рядом с надёжным термометром; если разница постоянна (например, всегда на 0,8 °C больше), вычти её в коде как смещение. Если измеряешь поверхность, приклей датчик вместе с ножками к поверхности небольшой каплей эпоксидки; по данным производителя, LM35 тогда очень точно следует за температурой поверхности. Если датчик опускается в жидкость, обязательно изолируй его ножки: ток утечки между мокрыми ножками заставляет показания уплывать.

LM35 — идеальная стартовая деталь для изучения аналоговых измерений, опорных напряжений АЦП и фильтрации сигналов: начинаешь с одной формулы, а потом правильное опорное напряжение, усреднение и калибровка делают измерение таким же надёжным, как термометр. Тот же подход пригодится и для других аналоговых датчиков, например NTC-термистора. В приложении BlueGrays есть проекты вроде измерения температуры с NTC и LCD, температуры и влажности с DHT11, температурной станции на ESP32 с LCD и регистратора температуры, каждый с пошаговой схемой и готовым кодом.

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

Какое напряжение нужно LM35 и работает ли он от 3,3 V?

По даташиту LM35 нужно питание 4–30 V. От 3,3 V он при комнатной температуре обычно всё ещё что-то показывает, но точность не гарантирована. На ESP32 и Pico питай датчик от пина 5 V (VIN или VBUS); его выход никогда не превышает 1,5 V, так что его можно подключать прямо к аналоговому входу на 3,3 V.

Почему мой LM35 греется?

В нормальной работе LM35 потребляет всего около 60 µA и нагревает сам себя меньше чем на 0,1 °C; если он горячий на ощупь, почти всегда перепутаны выводы питания и GND. Если смотреть на плоскую сторону, правильный порядок слева направо — +Vs, Vout, GND. Сразу отключи питание: датчик, долго подключённый наоборот, может повредиться навсегда.

Какая формула температуры у LM35?

На Arduino Uno с опорным 5 V температура (°C) = analogRead × 5.0 / 1024 × 100, то есть примерно analogRead × 0.488. С внутренним опорным 1,1 V множитель становится 1.1 / 1024 × 100 ≈ 0.107. На ESP32 достаточно разделить результат analogReadMilliVolts() на 10.

Может ли LM35 измерять отрицательные температуры?

В базовой схеме LM35 измеряет только от 2 °C до 150 °C. Для отрицательных значений нужно подтянуть выход к отрицательному питанию через резистор или поднять вывод GND двумя диодами и измерять разницу двумя аналоговыми входами; кроме того, датчик должен быть версией, рассчитанной на минусовые температуры, например LM35 или LM35C. На практике для температур ниже нуля гораздо проще DS18B20.

Что лучше: LM35 или DS18B20?

В проекте на Arduino с 5 V и коротким кабелем LM35 очень удобен: ему не нужна библиотека, и он показывает температуру мгновенно. Для длинных кабелей, отрицательных температур, измерений в жидкостях, нескольких датчиков на одном пине или плат на 3,3 V цифровой DS18B20 даёт более точные и надёжные результаты. При комнатной температуре LM35A и DS18B20 примерно одинаково точны, а распространённый LM35DZ немного отстаёт.

Почему показание LM35 всё время меняется?

С опорным 5 V каждый шаг АЦП равен примерно 0,5 °C, поэтому значение скачет между двумя шагами, а на результат влияют ещё и пульсации напряжения USB. Перейди на опорное 1,1 V через analogReference(INTERNAL), усредняй 16–64 измерения и поставь конденсатор 0,1 µF на выводы питания датчика. Если рядом есть реле или мотор, веди GND датчика прямо к Arduino.

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

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

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

4.7(47)
73
Измерение освещённости с LDR
#11Новичок

Измерение освещённости с LDR

Хочешь увидеть яркость своей комнаты в виде числа? LDR — маленькая деталь, реагирующая на свет, — измеряет освещённость вокруг, а Arduino каждые полсекунды выводит значение на экран компьютера. Закрой

4.6(81)
139
Измерение освещённости модулем LDR на ESP32
#113Новичок

Измерение освещённости модулем LDR на ESP32

Наблюдение в мониторе порта в реальном времени за сырым значением ADC модуля LDR и относительным процентом освещённости, вычисленным по опорным значениям темноты и света. Этот процент — не измерение в люксах. Учит логике калибровки модуля. Идеально выполнить его перед проектом 10, потому что он нужен для определения порога.

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

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

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

4.5(33)
44
Цифровой вольтметр с LCD-дисплеем
#56Средний
Premium

Цифровой вольтметр с LCD-дисплеем

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

4.5(27)
36
Температура и влажность с 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
LCD-экран с I2C
#32Новичок
Premium

LCD-экран с I2C

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

4.8(53)
70