Подключение датчика температуры LM35 к Arduino

Подключение датчика температуры LM35 к Arduino

Хотите измерять температуру в своём следующем проекте на Arduino? Датчик температуры LM35 — один из самых простых и доступных способов добавить измерение температуры в ваши проекты. Что делает LM35 особенно удобным для начинающих — он достаточно точный, простой в использовании и не требует дополнительных компонентов для работы.

В этом руководстве вы узнаете, как подключить LM35 к Arduino, поймёте принцип его работы и рассмотрите три практических примера — от считывания значений в мониторе последовательного порта до создания автономного цифрового термометра с LCD-дисплеем. С помощью всего нескольких проводов и небольшого фрагмента кода вы сможете начать измерять температуру прямо сейчас!

Давайте начнём!

Датчик температуры LM35

LM35 — это низковольтный, высокоточный датчик температуры от Texas Instruments. Он выдаёт аналоговое напряжение, линейно пропорциональное температуре в градусах Цельсия. В частности, выходное напряжение увеличивается на 10 мВ при каждом повышении температуры на 1°C.

Interfacing LM35 Temperature Sensor with Arduino

LM35 работает от источника питания напряжением от 4 до 30 вольт и потребляет менее 60 мкА тока. Такое чрезвычайно низкое энергопотребление означает, что датчик практически не нагревает сам себя во время работы (менее 0,08°C в неподвижном воздухе). Это важно, потому что если бы датчик сильно нагревался сам по себе, это исказило бы показания температуры и снизило точность.

Что касается точности, LM35 впечатляюще точен. Он обеспечивает типичную точность ±0,5°C при комнатной температуре (25°C) и ±1°C во всём рабочем диапазоне от -55°C до 150°C.

Вот полные характеристики:

Напряжение питания

4V to 30V

Потребляемый ток

60µA

Диапазон температур

−55°C to +155°C

Точность

±0.5°C

Масштабный коэффициент выхода

10mV/°C

Выходное напряжение при 25°C

250mV

Для получения дополнительной информации обратитесь к техническому описанию ниже.

Однако есть один недостаток: если вы хотите измерять отрицательные температуры, LM35 требует отрицательного напряжения смещения, что усложняет схему. Если вам нужно измерять отрицательные температуры, но вы хотите сохранить простоту, датчик TMP36 от Analog Devices может быть лучшим выбором. Он работает с температурами от −40°C до +125°C без какой-либо специальной настройки. Если вас интересует TMP36, вы можете найти специальное руководство `здесь `_.

Принцип работы LM35

LM35 является разновидностью `кремниевого датчика температуры на основе запрещённой зоны `_. Он работает на основе того факта, что прямое напряжение кремниевого диода изменяется предсказуемым образом при изменении температуры.

Вместо простого диода в LM35 используется `транзистор, включённый по схеме диода `_, который по сути является транзистором, подключённым так, чтобы работать как диод, но с лучшими характеристиками.

Вот функциональная блок-схема LM35:

Interfacing LM35 Temperature Sensor with Arduino

Этот компонент обладает особым свойством: при повышении температуры напряжение между базой и эмиттером транзистора (V_BE) уменьшается. Эта зависимость достаточно линейна — напряжение падает с постоянной скоростью по мере роста температуры.

На графике ниже показано, как изменения температуры влияют на ток, протекающий через транзистор.

Interfacing LM35 Temperature Sensor with Arduino

Датчик LM35 обнаруживает эти крошечные изменения напряжения, обрабатывает их и формирует выходной сигнал, линейно пропорциональный температуре. Если вам интересно и вы хотите изучить эту тему подробнее, отличным ресурсом является `Методы измерения температуры на основе диодов `_ от Texas Instruments.

Распиновка датчика LM35

LM35 доступен в различных корпусах, но наиболее распространённым является корпус TO-92, который выглядит как транзистор с тремя выводами. Вот назначение каждого вывода:

Interfacing LM35 Temperature Sensor with Arduino

+Vs — это вывод питания. К нему можно подключить любое напряжение от 4V до 30V.

Vout выдаёт аналоговое напряжение, линейно пропорциональное температуре. Его нужно подключить к аналоговому входному выводу Arduino, например A0.

GND — это вывод заземления.

Подключение датчика температуры LM35 к Arduino

Подключение LM35 к Arduino предельно просто. Нужно соединить всего три провода: два для питания и один для сигнала.

Начните с подключения вывода +Vs датчика LM35 к выводу 5V на Arduino. Затем подключите вывод GND к любому из выводов GND Arduino. Наконец, подключите вывод Vout к A0 (или любому другому аналоговому входному выводу) на Arduino.

Вот краткая справочная таблица подключений:

LM35Arduino
+Vs5V
GNDGND
VoutA0

Вот схема подключения LM35:

Interfacing LM35 Temperature Sensor with Arduino

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

Как считывать показания датчика температуры LM35

После подачи питания на LM35, вывод Vout сразу начинает выдавать аналоговое напряжение. Это напряжение изменяется пропорционально (линейно) температуре. В частности, при каждом повышении температуры на 1°C напряжение увеличивается на 10 милливольт (мВ), или 0,01 вольт (В). Например, при 0°C датчик выдаёт 0V; при 25°C — 0,25V; а при 100°C — 1,00V.

Эту зависимость наглядно видно на графике напряжения от температуры ниже.

Interfacing LM35 Temperature Sensor with Arduino

Для считывания этого аналогового напряжения с помощью Arduino используется функция analogRead() в коде. Однако эта функция не возвращает фактическое напряжение напрямую. Вместо этого она возвращает число, представляющее напряжение.

Arduino имеет 10-битный аналого-цифровой преобразователь (АЦП). Он преобразует входные напряжения от 0 до опорного напряжения АЦП в целые числа от 0 до 1023. Это всего 1024 различных возможных значений.

Interfacing LM35 Temperature Sensor with Arduino

Чтобы преобразовать число, полученное от analogRead(), обратно в фактическое напряжение, используйте эту формулу:

Vout = (значение analogRead) × (опорное напряжение АЦП / 1024)

Опорное напряжение АЦП зависит от типа платы Arduino, которую вы используете. По умолчанию оно составляет 5 вольт (на платах Arduino с питанием 5V) или 3,3 вольта (на платах Arduino с питанием 3,3V).

Таким образом, формулы принимают вид:

  • Для 5-вольтовых плат Arduino (например, популярной Arduino UNO): Vout = (значение analogRead) × (5 / 1024)

  • Для 3,3-вольтовых плат Arduino (например, Arduino Pro Mini): Vout = (значение analogRead) × (3.3 / 1024)

Когда у вас есть фактическое напряжение, преобразовать его в температуру легко. Помните, LM35 выдаёт 10 мВ (или 0,01 В) на каждый градус Цельсия.

Это означает, что для вычисления температуры нужно разделить напряжение на 0,01:

Температура (°C) = Vout / 0.01

или, ещё проще:

Температура (°C) = Vout × 100

Давайте рассмотрим реальный пример. Допустим, вы используете Arduino UNO (5-вольтовая плата), и функция analogRead() вернула значение 100. Вот как вы найдёте температуру:

  1. Сначала вычислите напряжение: Vout = 100 × (5 / 1024) = 0,488 В

  2. Теперь преобразуйте напряжение в температуру: Температура = 0,488 × 100 = 48,8°C

Итак, температура составляет около 48,8 градусов Цельсия.

Пример 1 для Arduino — Считывание температуры с LM35

В этом примере мы будем считывать данные о температуре с датчика LM35 и отображать результаты в градусах Цельсия (°C) и Фаренгейта (°F) в мониторе последовательного порта.

// Define the analog pin, the LM35's Vout pin is connected to
#define sensorPin A0

void setup() {
  // Begin serial communication at 9600 baud rate
  Serial.begin(9600);
}

void loop() {
  // Get the voltage reading from the LM35
  int reading = analogRead(sensorPin);

  // Convert that reading into voltage
  // Replace 5.0 with 3.3, if you are using a 3.3V Arduino
  float voltage = reading * (5.0 / 1024.0);

  // Convert the voltage into the temperature in Celsius
  float temperatureC = voltage * 100;

  // Print the temperature in Celsius
  Serial.print("Temperature: ");
  Serial.print(temperatureC);
  Serial.print("°C  |  ");

  // Print the temperature in Fahrenheit
  float temperatureF = (temperatureC * 9.0 / 5.0) + 32.0;
  Serial.print(temperatureF);
  Serial.println("°F");

  delay(1000);  // wait a second between readings
}

После запуска скетча попробуйте приложить палец к датчику или слегка подуть на него. Вы должны увидеть небольшое повышение температуры.

Interfacing LM35 Temperature Sensor with Arduino

Объяснение кода

Сначала мы указываем Arduino, какой аналоговый вывод подключён к LM35 — в данном случае аналоговый вывод 0.

#define sensorPin A0

В функции setup() мы инициализируем последовательную связь.

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

В функции loop() мы считываем напряжение, поступающее от датчика LM35, с помощью функции analogRead().

int reading = analogRead(sensorPin);

Далее мы используем формулы, рассмотренные ранее, для преобразования аналогового значения в напряжение, а затем в температуру.

float voltage = reading * (5.0 / 1024.0);

float temperatureC = voltage * 100;

После вычисления температуры в градусах Цельсия мы выводим её в монитор последовательного порта.

Serial.print("Temperature: ");
Serial.print(temperatureC);
Serial.print("°C  |  ");

Мы также хотим видеть температуру в градусах Фаренгейта, поэтому преобразуем значение из Цельсия в Фаренгейт и выводим его в монитор последовательного порта.

float temperatureF = (temperatureC * 9.0 / 5.0) + 32.0;
Serial.print(temperatureF);
Serial.println("°F");

Пример 2 для Arduino — Повышение точности

Датчик LM35 обычно даёт достаточно хорошие показания температуры с точностью около ±0,5°C при 25°C. Хотя мы не можем улучшить внутреннюю точность датчика, мы можем улучшить точность считывания его выходного сигнала Arduino.

Вот в чём проблема: выходное напряжение LM35 изменяется от 0V до 1V, что соответствует температурам от 0°C до 100°C. Однако аналого-цифровой преобразователь (АЦП) Arduino Uno работает с диапазоном по умолчанию от 0V до 5V и разбивает этот диапазон на 1024 шага. Это означает, что лишь около 205 из этих шагов попадают в диапазон LM35 (0V–1V), обеспечивая разрешение около 4,9 милливольт на шаг, что примерно равно 0,5°C на шаг. Это неплохо, но не идеально — особенно учитывая, что это совпадает с погрешностью датчика, а значит, любой шум измерения делает показания нестабильными.

Interfacing LM35 Temperature Sensor with Arduino

Есть ещё одна проблема: АЦП Arduino использует напряжение питания платы в качестве опорного напряжения. Если Arduino питается через USB, напряжение может немного колебаться и не быть точно 5V, что делает показания температуры ещё менее точными.

К счастью, Arduino Uno имеет встроенное решение. Он предоставляет внутреннее опорное напряжение 1,1V, которое не зависит от напряжения питания. Используя это более стабильное опорное напряжение, мы можем сделать показания более точными. Для активации добавьте команду analogReference(INTERNAL); в секцию setup кода.

После включения внутреннего опорного напряжения АЦП Arduino работает в более узком диапазоне напряжений — от 0V до 1,1V вместо 0V–5V. Это означает, что те же 1024 шага теперь распределены по гораздо более узкому диапазону, обеспечивая более высокое разрешение. Теперь каждый шаг равен примерно 1,07 милливольт, что означает улучшение разрешения до примерно 0,1°C на шаг. Это делает показания гораздо более стабильными и надёжными.

Interfacing LM35 Temperature Sensor with Arduino

Вот обновлённый код:

// Define the analog pin, the LM35's Vout pin is connected to
#define sensorPin A0

void setup() {
  // Initialize serial communication
  Serial.begin(9600);

  // Use 1.1 V reference for ADC measurements
  analogReference(INTERNAL);
}

void loop() {
  // Get the voltage reading from the LM35
  int reading = analogRead(sensorPin);

  // Convert that reading into voltage
  float voltage = reading * 1.1 / 1024.0;

  // Convert the voltage into the temperature in Celsius
  float temperatureC = voltage * 100;

  // Print the temperature in Celsius
  Serial.print("Temperature: ");
  Serial.print(temperatureC);
  Serial.print("°C  |  ");

  // Print the temperature in Fahrenheit
  float temperatureF = (temperatureC * 9.0 / 5.0) + 32.0;
  Serial.print(temperatureF);
  Serial.println("°F");

  delay(1000);  // wait a second between readings
}

После загрузки скетча на Arduino попробуйте запустить эту версию и сравнить с предыдущим примером. Вы, скорее всего, заметите, что в первом примере температура могла скакать почти на 1°C между показаниями, тогда как эта версия обеспечивает гораздо более стабильный и последовательный результат.

Interfacing LM35 Temperature Sensor with Arduino

Объяснение кода

Этот скетч похож на предыдущий. Однако есть два важных отличия.

Во-первых, в секции setup кода мы используем функцию analogReference(INTERNAL) для изменения опорного напряжения аналоговых измерений Arduino. Вместо использования стандартных 5 вольт мы указываем Arduino использовать внутреннее опорное напряжение 1,1 вольт.

analogReference(INTERNAL);

Во-вторых, поскольку мы изменили опорное напряжение с 5V на 1,1V, нам также необходимо скорректировать формулу преобразования аналогового значения в напряжение. Поэтому вместо умножения на 5 мы теперь умножаем на 1,1:

float voltage = reading * 1.1 / 1024.0;

Пример 3 для Arduino — Автономный термометр с LM35 и I2C LCD

Иногда вам может потребоваться отображать показания температуры в реальном времени без использования компьютера. Например, если вы создаёте маленький термометр или систему мониторинга температуры, которая показывает предупреждение при выходе температуры за безопасные пределы, использование монитора последовательного порта будет не очень удобным. В таком случае символьный LCD-дисплей 16×2 — отличное решение.

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

Если вы ещё не работали с I2C LCD-дисплеями, рекомендуется бегло просмотреть краткое руководство ниже.

Interfacing LM35 Temperature Sensor with Arduino

Схема подключения

На этой схеме показано, как именно всё подключить:

Interfacing LM35 Temperature Sensor with Arduino

Код Arduino

Скетч ниже считывает температуру с LM35 и затем отображает её непосредственно на LCD-экране. Код почти такой же, как в предыдущем примере, за исключением того, что на этот раз вместо вывода в монитор последовательного порта мы отправляем значения температуры на I2C LCD, чтобы видеть их в реальном времени без необходимости в компьютере.

// Include the LiquidCrystal_I2C library
#include <LiquidCrystal_I2C.h>

// Create a new instance of the LiquidCrystal_I2C class
LiquidCrystal_I2C lcd(0x3F, 16, 2);

// Define a custom degree character
byte Degree[] = {
  B00111,
  B00101,
  B00111,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000
};

// Define the analog pin, the LM35's Vout pin is connected to
#define sensorPin A0

void setup() {
  // Use 1.1 V reference for ADC measurements
  analogReference(INTERNAL);

  // Start the LCD and turn on the backlight
  lcd.init();
  lcd.backlight();

  // Create a custom character
  lcd.createChar(0, Degree);
}

void loop() {
  // Get the voltage reading from the LM35
  int reading = analogRead(sensorPin);

  // Convert that reading into voltage
  float voltage = reading * 1.1 / 1024.0;

  // Convert the voltage into the temperature in Celsius
  float temperatureC = voltage * 100;

  // Print the temperature on the LCD;
  lcd.setCursor(0, 0);
  lcd.print("Temperature:");
  lcd.setCursor(0, 1);
  lcd.print(temperatureC, 1);
  lcd.write(0);  // print the custom degree character
  lcd.print("C ");

  // Print the temperature in Fahrenheit
  float temperatureF = (temperatureC * 9.0 / 5.0) + 32.0;
  lcd.print(temperatureF, 1);
  lcd.write(0);  // print the custom degree character
  lcd.print("F ");

  delay(1000);  // wait a second between readings
}

Когда скетч запущен, LCD-дисплей покажет текущую температуру:

Interfacing LM35 Temperature Sensor with Arduino