Подключение датчика температуры LM35 к Arduino
Хотите измерять температуру в своём следующем проекте на Arduino? Датчик температуры LM35 — один из самых простых и доступных способов добавить измерение температуры в ваши проекты. Что делает LM35 особенно удобным для начинающих — он достаточно точный, простой в использовании и не требует дополнительных компонентов для работы.
В этом руководстве вы узнаете, как подключить LM35 к Arduino, поймёте принцип его работы и рассмотрите три практических примера — от считывания значений в мониторе последовательного порта до создания автономного цифрового термометра с LCD-дисплеем. С помощью всего нескольких проводов и небольшого фрагмента кода вы сможете начать измерять температуру прямо сейчас!
Давайте начнём!
Датчик температуры LM35
LM35 — это низковольтный, высокоточный датчик температуры от Texas Instruments. Он выдаёт аналоговое напряжение, линейно пропорциональное температуре в градусах Цельсия. В частности, выходное напряжение увеличивается на 10 мВ при каждом повышении температуры на 1°C.
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:
Этот компонент обладает особым свойством: при повышении температуры напряжение между базой и эмиттером транзистора (V_BE) уменьшается. Эта зависимость достаточно линейна — напряжение падает с постоянной скоростью по мере роста температуры.
На графике ниже показано, как изменения температуры влияют на ток, протекающий через транзистор.
Датчик LM35 обнаруживает эти крошечные изменения напряжения, обрабатывает их и формирует выходной сигнал, линейно пропорциональный температуре. Если вам интересно и вы хотите изучить эту тему подробнее, отличным ресурсом является `Методы измерения температуры на основе диодов `_ от Texas Instruments.
Распиновка датчика LM35
LM35 доступен в различных корпусах, но наиболее распространённым является корпус TO-92, который выглядит как транзистор с тремя выводами. Вот назначение каждого вывода:
+Vs — это вывод питания. К нему можно подключить любое напряжение от 4V до 30V.
Vout выдаёт аналоговое напряжение, линейно пропорциональное температуре. Его нужно подключить к аналоговому входному выводу Arduino, например A0.
GND — это вывод заземления.
Подключение датчика температуры LM35 к Arduino
Подключение LM35 к Arduino предельно просто. Нужно соединить всего три провода: два для питания и один для сигнала.
Начните с подключения вывода +Vs датчика LM35 к выводу 5V на Arduino. Затем подключите вывод GND к любому из выводов GND Arduino. Наконец, подключите вывод Vout к A0 (или любому другому аналоговому входному выводу) на Arduino.
Вот краткая справочная таблица подключений:
| LM35 | Arduino | |
| +Vs | 5V | |
| GND | GND | |
| Vout | A0 |
Вот схема подключения LM35:
После подключения вы можете использовать его для измерения температуры воздуха или приложить датчик к твёрдой поверхности (например, к металлическому радиатору) для измерения температуры его поверхности. Просто убедитесь, что датчик касается или находится рядом с тем, что вы хотите измерить.
Как считывать показания датчика температуры LM35
После подачи питания на LM35, вывод Vout сразу начинает выдавать аналоговое напряжение. Это напряжение изменяется пропорционально (линейно) температуре. В частности, при каждом повышении температуры на 1°C напряжение увеличивается на 10 милливольт (мВ), или 0,01 вольт (В). Например, при 0°C датчик выдаёт 0V; при 25°C — 0,25V; а при 100°C — 1,00V.
Эту зависимость наглядно видно на графике напряжения от температуры ниже.
Для считывания этого аналогового напряжения с помощью Arduino используется функция analogRead() в коде. Однако эта функция не возвращает фактическое напряжение напрямую. Вместо этого она возвращает число, представляющее напряжение.
Arduino имеет 10-битный аналого-цифровой преобразователь (АЦП). Он преобразует входные напряжения от 0 до опорного напряжения АЦП в целые числа от 0 до 1023. Это всего 1024 различных возможных значений.
Чтобы преобразовать число, полученное от 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. Вот как вы найдёте температуру:
Сначала вычислите напряжение: Vout = 100 × (5 / 1024) = 0,488 В
Теперь преобразуйте напряжение в температуру: Температура = 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
}
После запуска скетча попробуйте приложить палец к датчику или слегка подуть на него. Вы должны увидеть небольшое повышение температуры.
Объяснение кода
Сначала мы указываем 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 на шаг. Это неплохо, но не идеально — особенно учитывая, что это совпадает с погрешностью датчика, а значит, любой шум измерения делает показания нестабильными.
Есть ещё одна проблема: АЦП Arduino использует напряжение питания платы в качестве опорного напряжения. Если Arduino питается через USB, напряжение может немного колебаться и не быть точно 5V, что делает показания температуры ещё менее точными.
К счастью, Arduino Uno имеет встроенное решение. Он предоставляет внутреннее опорное напряжение 1,1V, которое не зависит от напряжения питания. Используя это более стабильное опорное напряжение, мы можем сделать показания более точными. Для активации добавьте команду analogReference(INTERNAL); в секцию setup кода.
После включения внутреннего опорного напряжения АЦП Arduino работает в более узком диапазоне напряжений — от 0V до 1,1V вместо 0V–5V. Это означает, что те же 1024 шага теперь распределены по гораздо более узкому диапазону, обеспечивая более высокое разрешение. Теперь каждый шаг равен примерно 1,07 милливольт, что означает улучшение разрешения до примерно 0,1°C на шаг. Это делает показания гораздо более стабильными и надёжными.
Вот обновлённый код:
// 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 между показаниями, тогда как эта версия обеспечивает гораздо более стабильный и последовательный результат.
Объяснение кода
Этот скетч похож на предыдущий. Однако есть два важных отличия.
Во-первых, в секции 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-дисплеями, рекомендуется бегло просмотреть краткое руководство ниже.
Схема подключения
На этой схеме показано, как именно всё подключить:
Код 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-дисплей покажет текущую температуру: