Варианты измерения температуры:
1. термопара
2. терморезистор
3. аналоговый термодатчик
4. цифровой термодатчик
подробнее можно почитать
Вариант использования терморезистора мы мельком рассмотрели .
Сейчас же рассмотрим, как работать с аналоговыми датчиками температуры, на примере LM335.
LM335 – это недорогой (~ 40 рублей) температурный чувствительный элемент с диапазоном от -40 °C до +100°C и точностью в 1°C.
Даташит (datasheet – документация на элемент) на LM335 можно посмотреть
Фактически, LM335 — это с нормированным Температурным Коэффициентом Напряжения (ТКU =10 мВ/K).
Т.е. изменение температуры датчика на 1 градус ведёт к изменению напряжения на 10mV.
Задавая ток через датчик в диапазоне от 0.45mA до 5mA (резистором R1), получаем напряжение на датчике, которое в десятках mV представляет абсолютную температуру в градусах .
Как видим, используются только вторая и третья ножки датчика (если повернуть датчик к себе плоской стороной – то нумерация ножек будет идти слева-направо)
То есть, схему можно представить так:
Сопоставим напряжение на датчике и температуру, припоминая, что
0С = 273.15К
На датчике, при этом будет напряжение 2.7315V
ТКU =10 мВ/K => в 1V будет 100K
-40С = 233.15К
на датчике будет 2.3315V
+100С = 373.15К
на датчике будет 3.7315V
Получается – нам нужно только снять это напряжение на аналоговом входе (например, analog input 0) :)
Однако, функция , возвращает значение от 0 до 1023, причём 1023 соответствует величине Опорного Напряжения, задаваемого функцией и по умолчанию, составляющего 5V.
Т.о., чтобы узнать какое напряжение поступило к нам на вход – нужно выполнить простое преобразование:
double voltage = val*5.0/1024;
, где val – величина, полученная от analogRead
Далее остаётся только перевести это напряжение в градусы, а потом привести из градусов Кельвина в более привычные :
double temp = voltage*100 - 273.15;
в температуру переводим – просто умножая на 100
Код скетча:
//
// работа с температурным датчиком LM335
//
//
int ledpin=13;
int lm335=0;
void setup()
{
Serial.begin(9600);
pinMode(ledpin, OUTPUT);
}
void loop()
{
double val = analogRead(lm335);
Serial.print("Analog 0: ");
Serial.print(int(val));
double voltage = val*5.0/1024;
Serial.print(" : ");
Serial.print(voltage);
double temp = voltage*100 - 273.15;
Serial.print(" : ");
Serial.println(temp);
delay(100);
}
В последнем столбце вывода получаем заветную температуру в градусах Цельсия :)
в статье есть скриншот Arduino IDE — там на мониторе последовательного порта данные так же скачут.
Как видно по коду скетча замеры делаются каждые 100 ms. Эти колебания можно поправить, если ввести дополнительную переменную, в которой суммировать все показания за 1 (или более )секунд и расчитывать среднее значение :)
Комментарии (8)
RSS свернуть / развернутьдетально все расписано, но по существу.
realist
admin
у меня при подключении простого потенциометра данные прыгают в пределах 2-3%
а тут как?
realist
Как видно по коду скетча замеры делаются каждые 100 ms. Эти колебания можно поправить, если ввести дополнительную переменную, в которой суммировать все показания за 1 (или более )секунд и расчитывать среднее значение :)
admin
boa
admin
;)
boa
не могу понять как высчитать из напряжения температуру, поможете?)
DRc
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.