Среди аналоговых термодатчиков, применяемых в любительской и промышленной электронике, выделяются такие модели как LM35, TMP36 или MCP9700. Благодаря приемлемой точности и линейности преобразования, а также лёгкости эксплуатации, они заслуженно стали одними из самых популярных термосенсоров. В рамках данной статьи предлагается рассмотреть датчик температуры LMT86 как один из альтернативных вариантов вышеуказанным преобразователям.

Цоколёвка
Данный полупроводниковый прибор является представителем семейства сенсоров LMT8x. По своей сути он аналогичен LM35 | TMP36 | MCP9700, а в корпусе TO-92 они все имеют идентичную цоколёвку:
Основные параметры
В зависимости от модификации, сенсоры LM35 | TMP36 | MCP9700, очень грубо говоря, являются взаимозаменяемыми, но с некоторыми оговорками по точности и диапазону измерений. А вот преобразователи серии LMT8x имеют очень важное отличие от вышеуказанных микросхем: у термосенсоров LMT8x коэффициент преобразования является отрицательным, то есть при росте температуры выходное напряжение (Uвых) уменьшается. Это наглядно видно по соответствующим графикам, представленных в datasheet’ах к датчикам:
Серия LMT8x включает в себя 4 модели (ниже представлена сводная таблица), отличающиеся между собой коэффициентом преобразования и диапазоном питания:
Следует сделать важное уточнение: в рамках этой статьи будем экспериментировать конкретно с моделью LMT86LP в корпусе TO-92, а для сравнения возьмём уже вышеупомянутые модели приборов следующих модификаций: LM35DZ/NOPB, TMP36GT9Z и MCP9700-E/TO. Это важно, поскольку в зависимости от модификации параметры преобразователей сильно отличаются. Например, LM35AH имеет погрешность ±0,5 ℃ и диапазон измерения -55…+150 ℃. А вот LM35DZ измеряет с погрешностью ±1,5 ℃ в диапазоне 0…+100 ℃.
Ниже представлена сводная таблица основных параметров рассматриваемых термодатчиков.
По сравнению с рассматриваемыми аналогами, термодатчик LMT86LP отличается более высокой точностью и широким диапазоном измеряемых температур. Также у него самый низкий уровень минимального напряжения питания (2,2 В) и ток потребления (5,4 мкА), что позволяет его использовать в портативных устройствах с батарейным питанием.
Схема включения
На рисунке ниже представлена схема подключения термодатчика к аналого-цифровому преобразователю (АЦП), взятая из документации от производителя:
Для считывания выходного сигнала (Uвых) сенсора можно воспользоваться либо встроенным в микроконтроллер АЦП, либо подключить микросхему внешнего. Чем выше разрядность АЦП, тем выше точность измерений. Но микроконтроллер на плате Arduino UNO располагает всего лишь 10-разрядным преобразователем. Соответственно, дискретность измерений будет примерно 4,8 милливольта, а это соответствует 0,5 градуса. Однако можно несколько повысить точность, варьируя уровнем опорного напряжения Uопорное.
По умолчанию уровень Uопорное равен напряжению питания микроконтроллера (5 В). При необходимости можно включить встроенный источник, который выдаёт 1,1 В (для ATmega328P), если в скетче прописать следующую функцию:
analogReference(INTERNAL);
Для LM35DZ значение Uопорное = 1,1 В подходит идеально, так как оно полностью покрывает диапазон выходного напряжения (0 мВ — 0 ℃, 1000 мВ — 100 ℃). А вот для TMP36 и MCP9700 такой уровень уже будет маловат, поскольку 500 мВ — 0 ℃, а 1750 мВ — 125 ℃. А для LMT86LP — 0 ℃ соответствует Uвых = 2100 мВ.
Чтобы прийти к компромиссу, можно прибегнуть к внешнему источнику Uопорное в виде микросхемы программируемого стабилитрона TL431, у которого точность стабилизации 0,5 %.
При базовой схеме включения TL431 выдаёт 2,5 В. Это значение вполне нам подходит для покрытия всех диапазонов выходных напряжений исследуемых термосенсоров. Для подключения внешнего источника у микроконтроллера есть специальный вывод — AREF (пин №21 для ATmega328P). Чтобы его активировать, в скетч надо добавить соответствующую функцию:
analogReference(EXTERNAL);
Как уже говорилось, в рамках эксперимента будем сравнивать показания LMT86LP с другими преобразователями: TMP36GT9Z, MCP9700-E/TO и LM35DZ/NOPB. В качестве эталонного измерительного канала воспользуемся цифровым модулем SHT30, у которого заявленная производителем погрешность измерений составляет ±0,3 ℃. Ниже представлены схема подключения и фотография собранного макета:

Принцип преобразования
Для того, чтобы преобразовать выходное напряжение датчика в температуру, используется следующая формула:

где Uвых — выходной сигнал в процессе измерений;
Tокр.ср. — измеряемая температура окружающей среды;
Tкоэфф — коэффициент преобразования;
U0℃ — выходной сигнал при 0℃.
Выразим из этой формулы искомую температуру:

Рассмотрим на примерах с разными приборами:
1) LMT86
Исходные данные:
— сигнал на выходе при 0 ℃: U0℃ = 2100 мВ;
— коэффициент преобразования: Tкоэфф = -10,9 мВ/℃;
— измеренный уровень сигнала на выходе сенсора: Uвых = 1874 мВ.
Подставляем значения в формулу, вычисляем искомую величину Tокр.ср.:

В документации от производителя приводится таблица преобразования, что довольно удобно для проверки:
2) TMP36 и MCP9700
U0℃ = 500 мВ;
Tкоэфф = 10 мВ/℃;
Uвых = 731 мВ.

3) LM35DZ
U0℃ = 0 мВ;
Tкоэфф = 10 мВ/℃;
Uвых = 234 мВ.

Скетч для Arduino
Ниже представлен подробно прокомментированный полный листинг скетча. Для уменьшения разброса показаний при работе АЦП воспользуемся методом вычисления среднего арифметического.
#include <Arduino.h>
#include <Wire.h>
#include "Adafruit_SHT31.h"
Adafruit_SHT31 sht31 = Adafruit_SHT31();
int data_A0;
int data_A1;
int data_A2;
int data_A3;
float temp_TMP36;
float temp_MCP9700;
float temp_LM35;
float temp_LMT86;
float temp_SHT30;
long amount_data_A0;
long amount_data_A1;
long amount_data_A2;
long amount_data_A3;
long arithmetic_mean_A0;
long arithmetic_mean_A1;
long arithmetic_mean_A2;
long arithmetic_mean_A3;
float voltage_ref = 2.5; // уровень опорного напряжения
void setup() {
analogReference(EXTERNAL); // активация входа AREF для подключения внешнего источника опорного напряжения
Serial.begin(9600); // подключаем монитор порта
if (! sht31.begin(0x44)) { // Set to 0x45 for alternate i2c addr
Serial.println("Couldn't find SHT31");
while (1) delay(1);
}
}
void loop() {
temp_SHT30 = 0;
temp_SHT30 = sht31.readTemperature(); // показания температуры с датчика SHT30
amount_data_A0 = 0;
amount_data_A1 = 0;
amount_data_A2 = 0;
amount_data_A3 = 0;
// сбор данных с каналов АЦП
for (int i = 0; i < 100; i = i + 1) {
amount_data_A0 = amount_data_A0 + analogRead(0);
amount_data_A1 = amount_data_A1 + analogRead(1);
amount_data_A2 = amount_data_A2 + analogRead(2);
amount_data_A3 = amount_data_A3 + analogRead(3);
}
// вычисляем среднее арифметическое значение по каждому каналу
arithmetic_mean_A0 = amount_data_A0 / 100;
arithmetic_mean_A1 = amount_data_A1 / 100;
arithmetic_mean_A2 = amount_data_A2 / 100;
arithmetic_mean_A3 = amount_data_A3 / 100;
// осуществляем преобразование отсчётов в градусы Цельсия для каждого датчика
temp_TMP36 = (arithmetic_mean_A0 * voltage_ref) / 1023.0; // преобразование отсчётов в напряжение
temp_TMP36 -= 0.5; // убираем смещение ноля
temp_TMP36 /= 0.01; // учитываем коэффициент преобразования
temp_MCP9700 = (arithmetic_mean_A1 * voltage_ref) / 1023.0; // преобразование отсчётов в напряжение
temp_MCP9700 -= 0.5; // убираем смещение ноля
temp_MCP9700 /= 0.01; //учитываем коэффициент преобразования
temp_LM35 = (arithmetic_mean_A2 * voltage_ref) / 1023.0; // преобразование отсчётов в напряжение
temp_LM35 /= 0.01; //учитываем коэффициент преобразования, смещение ноля отсутствует
temp_LMT86 = (arithmetic_mean_A3 * voltage_ref) / 1023.0; // преобразование отсчётов в напряжение
temp_LMT86 = 2.1 - temp_LMT86; // убираем смещение ноля
temp_LMT86 /= 0.0109; //учитываем коэффициент преобразования
// вывод температуры на монитор порта
Serial.print("TMP36: ");
Serial.print(temp_TMP36);
Serial.println(F(" °C"));
Serial.print("MCP9700: ");
Serial.print(temp_MCP9700);
Serial.println(F(" °C"));
Serial.print("LM35: ");
Serial.print(temp_LM35);
Serial.println(F(" °C"));
Serial.print("LMT86: ");
Serial.print(temp_LMT86);
Serial.println(F(" °C"));
Serial.print("SHT30: ");
Serial.print(temp_SHT30);
Serial.println(F(" °C"));
Serial.println(" ");
Serial.println("--------------------");
Serial.println(" ");
delay(3000);
}
Далее представлен скриншот монитора порта, в котором отображены результаты измерений температуры воздуха в жилом помещении после часа выдержки тестируемых термодатчиков во включённом состоянии:

Положим, что SHT30 является наиболее достоверным измерительным каналом. Следовательно, по полученным данным можно сделать вывод, что наиболее близкие к истине значения показали LM35DZ и LMT86LP. Иные сенсоры показали значения, которые укладываются в заявленные производителями погрешности, что вполне приемлемо для бытовых нужд и приложений, в которых не требуется особая точность измерений.
Выводы
Аналоговый термодатчик LMT86 является достойной альтернативой сенсорам типа LM35, TMP36 или MCP9700. Данный преобразователь выгодно отличается от указанных аналогов: относительно невысокая стоимость, широкий рабочий диапазон (-50…+150 ℃), сравнительно высокая точность (±0,7 ℃), подходит для работы в портативных приборах с батарейным питанием (ток потребления 5,4 мкА, минимальное Uпит = 2,2 В). Благодаря отрицательному коэффициенту преобразования, данный прибор также может применяться как альтернатива термисторам.