0. Начало
1. Цифровой ввод — кнопка
2. Аналоговый вывод — Fading
3. Аналоговый ввод – потенциометр
4. Аналоговый ввод – осциллограф
5. Генерация звука – пьезоизлучатель
6. Фоторезистор
7. Сенсор на светодиоде
8. Общение с Arduino — программирование работы с COM-портом
9. Аналоговый датчик температуры – LM335
Варианты измерения температуры:
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) 🙂
Однако, функция analogRead, возвращает значение от 0 до 1023, причём 1023 соответствует величине Опорного Напряжения, задаваемого функцией analogReference и по умолчанию, составляющего 5V.
Т.о., чтобы узнать какое напряжение поступило к нам на вход – нужно выполнить простое преобразование:
double voltage = val*5.0/1024;
, где val – величина, полученная от analogRead
Далее остаётся только перевести это напряжение в градусы, а потом привести из градусов Кельвина в более привычные градусы Цельсия:
double temp = voltage*100 - 273.15;
в температуру переводим – просто умножая на 100
Код скетча:
// // работа с температурным датчиком LM335 // // int lm335=0; void setup() { Serial.begin(9600); } 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); }
В последнем столбце вывода получаем заветную температуру в градусах Цельсия 🙂
читать далее: 10. Подключаем мышку PS/2
Ссылки
1. Измерение температуры
2. Аналоговые датчики температуры и Arduino
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1244775272
http://www.yarst.org/T1.htm
По теме
Arduino, термины, начало работы
КМБ для начинающих ардуинщиков
Состав стартера (точка входа для начинающих ардуинщиков)
0 комментариев на «“Практическое программирование Arduino/Freeduino — Аналоговый датчик температуры – LM335”»
отличный пост.
детально все расписано, но по существу.
спасибо 🙂
на сколько скачут показания такого датчика?
у меня при подключении простого потенциометра данные прыгают в пределах 2-3%
а тут как?
в статье есть скриншот Arduino IDE — там на мониторе последовательного порта данные так же скачут.
Как видно по коду скетча замеры делаются каждые 100 ms. Эти колебания можно поправить, если ввести дополнительную переменную, в которой суммировать все показания за 1 (или более )секунд и расчитывать среднее значение 🙂
Говорят в 328 чипе свой датчик температуры есть:code.google.com/p/tinkerit/wiki/SecretThermometer
только
=)
😉
приобрелhttp://www.seeedstudio.com/depot/temperature-sensor-with-steel-head-p-78.html?cPath=84_89 SEN118A2B
не могу понять как высчитать из напряжения температуру, поможете?)
Объясните, пожалуйста.
http://www.robocraft.ru/uploads/images/b/8/3/a/1/7718e2e105.png
http://www.robocraft.ru/uploads/images/4/4/8/2/1/8f07aae017.jpg
Как так может быть?
Вы случаем датчик не перевернули, когда контакты подписывали?
Всё правильно=)
А… ясно, понятно
Зачем в приведенном коде скетча ledPin = 13? и его инициализация на выход?
Спасибо, пофиксил!