LM35: подключение к ESP32 и Arduino

Аналоговый термометр

Аналоговый термометр, у которого напряжение на выходе пропорционально температуре: 10 мВ на градус Цельсия. Калибровка не нужна, библиотека не нужна.

Как работает

LM35 выдаёт на выходе 10 мВ на каждый градус: при 25 °C — 0,25 В, при 100 °C — 1,0 В. Достаточно измерить напряжение и умножить на 100: температура = вольты × 100.

Датчик питается от 4 до 30 В, поэтому от 3,3 В он не работает. В базовой схеме он измеряет температуру от +2 °C до +150 °C: для отрицательных значений нужен отрицательный источник питания.

Выводы

ВыводНазначение
VOUTаналоговый выход, 10 мВ на градус
VSпитание, от 4 В (на плату — 5 В)
GNDобщий провод

Подключение к ESP32

LM35ESP32
VOUTGPIO34
VSVIN
GNDGND

Схема из примера «Термометр LM35: 10 мВ на градус».

Термометр LM35: 10 мВ на градус

Открыть пример целиком
Код скетча
// Термометр LM35: на выходе 10 мВ на каждый градус Цельсия.
// 25 °C — 0,25 В, 100 °C — 1 В.
//
// Питание датчика — от 4 В, поэтому он стоит на VIN (5 В), а выход при
// этом остаётся в пределах 1,5 В и безопасен для входа ESP32.
//
// АЦП ESP32 шумит, поэтому берём среднее из шестнадцати замеров. На
// самых малых напряжениях (ниже 0,1 В, то есть ниже 10 °C) АЦП ESP32 ещё
// и нелинеен — для такого диапазона нужна калибровка.

const int LM35 = 34;
const float VREF = 3.3;     // напряжение, которое АЦП считает полной шкалой
const int ADC_FULL = 4095;

void setup() {
  Serial.begin(115200);
}

void loop() {
  long sum = 0;
  for (int i = 0; i < 16; i++) {
    sum += analogRead(LM35);
    delay(2);
  }
  float volts = (sum / 16.0) * VREF / ADC_FULL;
  float celsius = volts * 100.0;     // 10 мВ на градус

  Serial.printf("%.3f В = %.1f °C\n", volts, celsius);
  delay(1000);
}

Подключение к Arduino Uno

LM35Arduino Uno
VOUTA0
VS5V
GNDGND

Схема из примера «Arduino Uno: термометр LM35».

Arduino Uno: термометр LM35

Открыть пример целиком
Код скетча
// Термометр LM35: 10 мВ на каждый градус Цельсия.
//
// Питание от 5 В, выход - на A0. При опорном напряжении 5 В один
// отсчёт АЦП - это около 0,5 °C. Точнее можно, переключив опорное
// напряжение на встроенные 1,1 В (analogReference(INTERNAL)): шаг
// станет около 0,1 °C, но выше 110 °C шкала закончится.

const int LM35 = A0;
const float VREF = 5.0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  long sum = 0;
  for (int i = 0; i < 8; i++) {
    sum += analogRead(LM35);
    delay(2);
  }
  float volts = (sum / 8.0) * VREF / 1023.0;
  float celsius = volts * 100.0;

  Serial.print(volts, 3);
  Serial.print(" В = ");
  Serial.print(celsius, 1);
  Serial.println(" °C");
  delay(1000);
}

В железе

При напряжении ниже 4 В показания LM35 неточны. Выход при этом остаётся в пределах 1,5 В, поэтому на вход ESP32 можно подавать напрямую даже при питании от 5 В. Длинный кабель к датчику может возбуждать выход — в даташите приведена цепочка из резистора и конденсатора для этого случая. Горячий корпус сразу после включения — признак обратной полярности.

Частые ошибки

Другие детали