Датчик температуры 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 к Arduino: Uno, ESP32 и Pico
| Вывод LM35 | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| 1 · +Vs (слева) | 5V | 5V / VIN (5 V от USB) | VBUS, вывод 40 (5 V от USB) |
| 2 · Vout (посередине) | A0 | GPIO 34 (ADC1) | GP26 / ADC0, вывод 31 |
| 3 · GND (справа) | GND | GND | AGND, вывод 33, или GND, вывод 38 |
| Конденсатор 0,1 µF | Между +Vs и GND, рядом с датчиком | Между +Vs и GND, рядом с датчиком | Между +Vs и GND, рядом с датчиком |
От 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) | Температура |
|---|---|---|
| 41 | 0,200 V | 20,0 °C |
| 51 | 0,249 V | 24,9 °C |
| 52 | 0,254 V | 25,4 °C |
| 61 | 0,298 V | 29,8 °C |
| 205 | 1,001 V | 100,1 °C |
Присмотрись к таблице: при комнатной температуре АЦП выдаёт всего около 50, а изменение на один шаг сдвигает температуру примерно на 0,5 °C. Поэтому показание прыгает туда-сюда между 24,9 и 25,4; датчик не неисправен, это просто разрешение опорного 5 V. Скоро исправим это внутренним опорным напряжением.
Первое измерение шаг за шагом
- Вставь LM35 в макетную плату; повернув его плоской стороной к себе, подключи левую ножку к 5V, а правую — к GND.
- Среднюю ножку (Vout) соедини перемычкой с A0. Если есть конденсатор 0,1 µF, поставь его между +Vs и GND.
- Подключи Arduino по USB и через несколько секунд потрогай датчик: если он комнатной температуры, всё в порядке; если горячий, подключение перевёрнуто.
- Загрузи код ниже и открой монитор порта на скорости 9600 бод.
- Зажми датчик между пальцами; значение должно медленно расти, а когда отпустишь — снижаться.
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 mV | 0,49 °C | 150 °C (предел датчика) |
| 3,3 V (подключено к AREF) | analogReference(EXTERNAL) | 3,22 mV | 0,32 °C | 150 °C (предел датчика) |
| Внутреннее 1,1 V | analogReference(INTERNAL) | 1,07 mV | 0,11 °C | 110 °C |
Опорное 1,1 V не на каждом чипе ровно 1,1 V; по даташиту ATmega328P оно может быть от 1,0 до 1,2 V. Без калибровки это означает ошибку масштаба до 9%. Исправить легко: загрузи код ниже, измерь мультиметром напряжение между пином AREF и GND и запиши значение в константу VREF (например, const float VREF = 1.083;). Это нужно сделать один раз для каждой платы, и результат остаётся верным. Кроме того, код усредняет 32 выборки на каждое показание:
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}Усреднение и снижение шума
Одно измерение 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_0db | 100–950 mV | 10–95 °C |
| ADC_2_5db | 100–1250 mV | 10–125 °C |
| ADC_6db | 150–1750 mV | 15–150 °C |
| ADC_11db (по умолчанию) | 150–2450 mV | 15–150 °C, самое грубое разрешение |
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}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.
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


| Параметр | LM35 (LM35DZ) | DS18B20 | DHT11 |
|---|---|---|---|
| Выход | Аналоговый, 10 mV/°C | Цифровой (1-Wire) | Цифровой (один провод) |
| Диапазон измерения | 0 … +100 °C (LM35: −55 … +150 °C) | −55 … +125 °C | 0 … +50 °C |
| Точность | Типично ±0,6 °C, не хуже ±1,5 °C при 25 °C | ±0,5 °C (−10 … +85 °C) | ±2 °C |
| Питание | 4–30 V | 3,0–5,5 V | 3–5,5 V |
| Влажность | Нет | Нет | Да |
| Библиотека | Не нужна | OneWire + DallasTemperature | DHT 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:
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 — идеальная стартовая деталь для изучения аналоговых измерений, опорных напряжений АЦП и фильтрации сигналов: начинаешь с одной формулы, а потом правильное опорное напряжение, усреднение и калибровка делают измерение таким же надёжным, как термометр. Тот же подход пригодится и для других аналоговых датчиков, например 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
Насколько тепло в твоей комнате и влажный ли воздух или сухой? Датчик DHT11 измеряет температуру и влажность, а Arduino выводит значения на двухстрочный LCD-экран и обновляет их каждые пару секунд. Ес

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

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

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

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

Температура и влажность с 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 — идеально для теплиц, комнат, лабораторий и хранения продуктов.

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

