Подключение датчика температуры TMP36 к Arduino
Один из самых простых и недорогих способов добавить измерение температуры в ваш проект на Arduino — это использовать датчик температуры TMP36. Эти датчики довольно точны и не требуют внешних компонентов для работы. Так что с несколькими подключениями и небольшим кодом Arduino вы сможете измерять температуру в кратчайшие сроки!
Датчик температуры TMP36
TMP36 — это низковольтный прецизионный датчик температуры в градусах Цельсия, производимый компанией Analog Devices. Это микросхема, которая выдаёт выходное напряжение, линейно пропорциональное температуре в °C, и поэтому очень проста в использовании с Arduino.
Датчик температуры TMP36 довольно точен, никогда не изнашивается, работает в различных условиях окружающей среды и не требует внешних компонентов. Кроме того, датчик TMP36 не требует калибровки и обеспечивает типичную точность ±1°C при +25°C и ±2°C в диапазоне температур от -40°C до +125°C.
Датчик может питаться от источника 2.7В до 5.5В и потребляет всего 50мкА во время активного преобразования температуры, обеспечивая очень низкий саморазогрев (менее 0.1°C в неподвижном воздухе). Кроме того, предусмотрена функция отключения для снижения потребляемого тока до менее чем 0.5мкА.
Вот полные характеристики:
Напряжение питания |
2.7В до 5.5В |
|---|---|
Потребляемый ток |
50мкА |
Диапазон температур |
-40°C до 125°C |
Точность |
±2°C |
Масштабный коэффициент выхода |
10мВ/°C |
Диапазон выходного напряжения |
0.1В (-40°C) до 1.75В (125°C) |
Выходное напряжение при 25°C |
750мВ |
Для получения дополнительной информации обратитесь к техническому описанию ниже.
Принцип работы
TMP36 использует твердотельную технологию для измерения температуры. Он использует тот факт, что падение напряжения между базой и эмиттером (прямое напряжение — Vbe) `транзистора с диодным подключением `_ уменьшается с известной скоростью при повышении температуры. Путём точного усиления этого изменения напряжения легко генерировать аналоговый сигнал, прямо пропорциональный температуре.
Эта линейная зависимость между прямым напряжением и температурой является причиной использования транзисторов с диодным подключением в качестве устройств для измерения температуры. По сути, именно так и измеряется температура, хотя за годы в эту технику были внесены некоторые улучшения. Более подробную информацию об этой технике можно найти `здесь `_.
Хорошая новость в том, что все эти сложные вычисления выполняются внутри TMP36. Он просто выдаёт напряжение, линейно пропорциональное температуре.
Как измерить температуру
TMP36 прост в использовании — просто подключите левый вывод к питанию (2.7-5.5В), а правый вывод — к земле (при условии, что плоская сторона датчика обращена к вам). Тогда средний вывод будет выдавать аналоговое напряжение, прямо пропорциональное (линейно) температуре в °C. Это легко увидеть на характеристике выходного напряжения от температуры. Обратите внимание, что аналоговое выходное напряжение не зависит от напряжения питания.
Для преобразования напряжения в температуру просто используйте базовую формулу:
Temp (°C) = (Vout – 0.5) * 100
Так, например, если выходное напряжение равно 1В, это означает, что температура составляет (1 – 0.5) * 100 = 50 °C
Хотите узнать, как выведена эта формула?
Перед вычислением показания температуры мы вычитаем 0.5В из выходного напряжения, потому что TMP36 имеет смещение 500мВ. Это смещение позволяет датчику измерять отрицательные температуры.
Теперь для преобразования этого напряжения в температуру мы просто умножаем его на 100, потому что TMP36 имеет масштабный коэффициент 10мВ/°C. Проще простого.
Тестирование датчика TMP36
Протестировать TMP36 довольно просто — просто подключите левый вывод к источнику питания 2.7-5.5В (две батарейки AA отлично подходят), а правый вывод — к земле (при условии, что плоская сторона датчика обращена к вам). Теперь подключите мультиметр в режиме измерения постоянного напряжения к земле и среднему выводу. При комнатной температуре (25°C) напряжение должно быть около 0.75В.
Попробуйте слегка сжать пластиковый корпус датчика, чтобы увидеть повышение температуры.
Или попробуйте коснуться датчика кубиком льда (в полиэтиленовом пакете, чтобы ваша схема не контактировала с водой) и наблюдайте за падением температуры.
Распиновка датчика TMP36
TMP36 выпускается в трёх различных форм-факторах, но наиболее распространённый тип — это 3-выводный корпус TO-92, который выглядит как транзистор. Давайте рассмотрим его распиновку.
+Vs — вывод питания датчика, напряжение может быть от 2.7В до 5.5В.
Vout — вывод, который выдаёт аналоговое напряжение, прямо пропорциональное (линейно) температуре. Его следует подключить к аналоговому (АЦП) входу.
GND — вывод заземления.
Подключение датчика температуры TMP36 к Arduino
Подключить TMP36 к Arduino очень просто. Нужно подключить всего три вывода: два для питания и один для считывания показаний датчика.
Датчик может питаться от выхода 3.3В или 5В. Положительное напряжение подключается к «+Vs», а земля — к «GND». Средний вывод «Vout» — это аналоговый выходной сигнал датчика, который подключается к аналоговому входу A0 Arduino.
Ниже приведена схема подключения для экспериментов с TMP36:
Для измерения температуры воздуха оставьте датчик на открытом воздухе или прикрепите его к объекту, температуру которого хотите измерить, например, к радиатору.
Чтение аналоговых данных температуры
Как видно на схеме подключения выше, выход TMP36 подключён к одному из аналоговых входов Arduino. Значение этого аналогового входа можно прочитать с помощью функции analogRead().
Однако функция analogRead() не возвращает непосредственно выходное напряжение датчика. Вместо этого она преобразует входное напряжение между 0 и опорным напряжением АЦП (технически это рабочее напряжение, т.е. 5В или 3.3В, если вы его не меняли) в 10-битные целые значения в диапазоне от 0 до 1023. Для обратного преобразования этого значения в выходное напряжение датчика используйте формулу:
Vout = (показание АЦП) * (5 / 1024)
Эта формула преобразует число 0-1023 из АЦП в 0-5В
Если вы используете 3.3В Arduino, используйте формулу:
Vout = (показание АЦП) * (3.3 / 1024)
Эта формула преобразует число 0-1023 из АЦП в 0-3.3В
Затем для преобразования вольт в температуру используйте формулу:
Temperature (°C) = (Vout – 0.5) * 100
Код Arduino — простой термометр
Следующий скетч показывает быстрый способ считывания датчика температуры TMP36 и может служить основой для более практических экспериментов и проектов. Он просто считывает значение с TMP36 через аналоговый порт A0 и выводит текущую температуру (в °C и °F) в монитор последовательного порта. Загрузите его в Arduino.
// Define the analog pin, the TMP36'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 TMP36
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 - 0.5) * 100;
// Print the temperature in Celsius
Serial.print("Temperature: ");
Serial.print(temperatureC);
Serial.print("\xC2\xB0"); // shows degree symbol
Serial.print("C | ");
// Print the temperature in Fahrenheit
float temperatureF = (temperatureC * 9.0 / 5.0) + 32.0;
Serial.print(temperatureF);
Serial.print("\xC2\xB0"); // shows degree symbol
Serial.println("F");
delay(1000); // wait a second between readings
}
Вы должны увидеть следующий вывод в мониторе последовательного порта.
Объяснение кода:
Скетч начинается с определения пина Arduino, к которому подключён вывод Vout датчика.
#define sensorPin A0
В функции setup мы инициализируем последовательное соединение с компьютером.
void setup() {
Serial.begin(9600);
}
В основном цикле мы сначала считываем аналоговый сигнал с TMP36 с помощью функции analogRead().
int reading = analogRead(sensorPin);
Далее мы используем формулы, рассмотренные ранее в статье, для преобразования аналогового показания в напряжение, а затем в температуру.
float voltage = reading * (5.0 / 1024.0);
float temperatureC = (voltage - 0.5) * 100;
Затем результаты выводятся в монитор последовательного порта.
Serial.print("Temperature: ");
Serial.print(temperatureC);
Serial.print("\xC2\xB0"); // shows degree symbol
Serial.print("C | ");
Полученное значение температуры — в градусах Цельсия (°C). Оно преобразуется в градусы Фаренгейта (°F) по простой формуле и выводится в монитор последовательного порта.
T(°F) = T(°C) x 9/5 + 32
float temperatureF = (temperatureC * 9.0 / 5.0) + 32.0;
Serial.print(temperatureF);
Serial.print("\xC2\xB0"); // shows degree symbol
Serial.println("F");
Улучшение точности датчика TMP36
Поскольку мы не настраивали опорное напряжение (ARef), используемое для аналогового входа (по умолчанию аналоговое опорное напряжение на 5В платах Arduino составляет 5 вольт), максимальное разрешение, которое мы получаем от АЦП, составляет 5/1024 = 4.88мВ или 0.49°C.
Для лучших результатов использование опорного напряжения 3.3В вместо 5В в качестве ARef будет более точным и менее шумным. При опорном напряжении 3.3В мы получаем разрешение 3.3/1024 = 3.22мВ или 0.32°C.
Для использования вывода 3.3В в качестве аналогового опорного напряжения подключите его к входу AREF (Analog Reference) вот так.
Также нужно внести некоторые изменения в код. Ниже выделены строки, которые нужно добавить/изменить:
// Define the analog pin, the TMP36's Vout pin is connected to
#define sensorPin A0
// Tie ARef to 3.3V
#define aref_voltage 3.3
void setup() {
// Begin serial communication at 9600 baud rate
Serial.begin(9600);
// If you want to set the aref to something other than 5v
analogReference(EXTERNAL);}
void loop() {
// Get the voltage reading from the TMP36
int reading = analogRead(sensorPin);
// Convert that reading into voltage
float voltage = reading * (aref_voltage / 1024.0);
// Convert the voltage into the temperature in Celsius
float temperatureC = (voltage - 0.5) * 100;
// Print the temperature in Celsius
Serial.print("Temperature: ");
Serial.print(temperatureC);
Serial.print("\xC2\xB0"); // shows degree symbol
Serial.print("C | ");
// Print the temperature in Fahrenheit
float temperatureF = (temperatureC * 9.0 / 5.0) + 32.0;
Serial.print(temperatureF);
Serial.print("\xC2\xB0"); // shows degree symbol
Serial.println("F");
delay(1000); // wait a second between readings
}
Вы должны увидеть следующий вывод в мониторе последовательного порта.
Как видите, точность можно немного улучшить, но для большинства проектов этого будет недостаточно.
Альтернативой TMP36 является использование цифрового датчика температуры, такого как DS18B20, который выпускается в таком же корпусе. Цифровые датчики температуры обладают лучшей помехозащищённостью, что полезно, когда датчик расположен на расстоянии или в электрически зашумлённой среде.
Проект Arduino — автономный термометр с TMP36 и I2C LCD
Иногда у вас возникает идея, где нужно отображать показания температуры в реальном времени и показывать предупреждение, когда температура выходит за указанный диапазон. Тогда вам, вероятно, понадобится символьный ЖК-дисплей 16x2 вместо монитора последовательного порта.
В этом примере мы подключим I2C LCD к Arduino вместе с TMP36.
Подключение I2C LCD довольно простое, как видно из схемы ниже. Если вы не знакомы с символьными I2C LCD 16x2, рекомендуется прочитать (хотя бы просмотреть) руководство ниже.
Следующая схема показывает, как всё подключить.
Следующий скетч выводит значения температуры на символьный I2C LCD 16x2. Код аналогичен первому примеру, за исключением того, что значения выводятся на 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 TMP36's Vout pin is connected to
#define sensorPin A0
void setup() {
// 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 TMP36
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 - 0.5) * 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: