Arduino

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

Введение

LM35 — простой аналоговый датчик температуры, выдающий напряжение, линейно пропорциональное температуре в градусах Цельсия (10 мВ на градус), в отличие от цифрового DHT11/22, использующего собственный протокол передачи готового, уже преобразованного значения. В статье разберём считывание LM35 и сравним два подхода — когда какой датчик предпочтительнее.

Концепция

LM35 подключается напрямую к аналоговому пину — преобразование считанного АЦП-значения в температуру требует простого линейного вычисления, учитывающего опорное напряжение АЦП Arduino (по умолчанию 5В) и коэффициент датчика (10 мВ/°C). Поскольку АЦП Arduino Uno имеет разрешение 10 бит (1024 уровня) при опорном напряжении 5В, шаг одного уровня АЦП соответствует примерно 4.88 мВ, что в пересчёте на температуру LM35 даёт разрешение около 0.49°C на единицу АЦП — заметно грубее, чем заявленная точность самого DHT22.

Пример кода

// firmware/src/main.cpp — LM35 с вычислением температуры из напряжения АЦП
#define LM35_PIN A6

void setup()
{
    Serial.begin(9600);
    delay(100);
    Serial.println("READY");
}

void loop()
{
    static unsigned long lastReadTime = 0;
    static float readings[10];
    static int readingIndex = 0;

    if (millis() - lastReadTime >= 200) {
        const int rawValue = analogRead(LM35_PIN);

        // Напряжение на пине = rawValue * (опорное напряжение / разрешение АЦП)
        const float voltageMv = rawValue * (5000.0 / 1024.0);
        const float temperatureCelsius = voltageMv / 10.0; // 10 мВ на градус Цельсия для LM35

        // Скользящее усреднение последних 10 измерений для снижения шума АЦП
        readings[readingIndex] = temperatureCelsius;
        readingIndex = (readingIndex + 1) % 10;

        float sum = 0;
        for (int i = 0; i < 10; i++) sum += readings[i];
        const float averagedTemperature = sum / 10.0;

        Serial.print("LM35:");
        Serial.println(averagedTemperature, 2);

        lastReadTime = millis();
    }
}

Пояснения к коду

Вычисление температуры выполняется в два шага — сначала перевод «сырого» значения АЦП в реальное напряжение в милливольтах (rawValue * (5000.0 / 1024.0)), затем перевод напряжения в температуру согласно характеристике датчика LM35 (10 мВ на градус, то есть деление на 10) — этот двухшаговый расчёт явно показывает, как именно физическая величина (температура) восстанавливается из абстрактного цифрового значения АЦП, в отличие от DHT-датчиков, где библиотека скрывает аналогичные вычисления внутри себя.

Скользящее усреднение последних 10 измерений (накопление в циклическом массиве readings и пересчёт среднего при каждом новом измерении) компенсирует шум АЦП, упомянутый как подводный камень для LM35 это особенно важно, поскольку, в отличие от показаний DHT-датчиков (уже отфильтрованных внутренней логикой датчика и его библиотеки), сырые показания аналогового АЦП могут заметно «дрожать» от измерения к измерению даже при стабильной реальной температуре.

Подводные камни

  • Разрешение АЦП Arduino Uno (10 бит, около 0.49°C на шаг для LM35) грубее заявленной точности более качественных цифровых датчиков — для задач, требующих высокой точности измерения температуры, LM35 на стандартном Arduino Uno может оказаться менее подходящим выбором, чем цифровой датчик с собственным более точным АЦП внутри (как DHT22, заявляющий точность около ±0.5°C «из коробки», без необходимости в дополнительном программном усреднении компенсирующем грубость внешнего АЦП).
  • Опорное напряжение АЦП Arduino (5В по умолчанию) не идеально стабильно и может незначительно отличаться от точного значения в зависимости от качества питания и конкретной платы — для более точных измерений температуры через LM35 в критичных применениях иногда используют внешний, более стабильный источник опорного напряжения АЦП (analogReference()), что выходит за рамки базового использования датчика в учебном проекте.
  • Неправильная ориентация LM35 при подключении (перепутаны пины питания, земли и выходного сигнала) — типичная ошибка новичков при первом использовании этого датчика, поскольку внешне три вывода датчика выглядят одинаково, и распиновку нужно проверять по конкретной маркировке/datasheet корпуса, а не угадывать; неверное подключение питания может повредить сам датчик.
  • Сравнение результатов LM35 и DHT11/22, измеряющих температуру одного и того же физического места одновременно, может показать заметное расхождение значений — это не обязательно означает поломку одного из датчиков, а может отражать реальную разницу точности и калибровки между разными типами датчиков; для проектов, где совместно используются датчики разных типов, стоит явно понимать ожидаемый уровень расхождения между ними, а не считать любое несовпадение показаний ошибкой.