Ардуино: датчик температуры LM35

Еще один полезный прибор, который часто используется в современных устройствах — это датчик температуры. Даже в вашем компьютере есть сразу несколько датчиков температуры, с помощью которых система следит за перегревом ключевых компонентов — процессора, видеокарты, блока питания, и прочих узлов. Самый же популярный пример использования датчика температуры дома — термостат. Это устройство, которое постоянно следит за температурой воздуха, и регулирует подачу энергии в систему отопления. Смежный пример — котел для нагрева воды.

В нашем уроке мы используем датчик TMP35. Вместо него можно использовать любой другой похожий датчик: TMP35, TMP37, LM35, LM335 и подобные. Выглядит датчик как обычный транзистор:

ardu_temp_tmp35

Можно легко спутать, так что рекомендую всегда внимательно читать маркировку на таких устройствах (да и вообще сначала всегда читайте, потом подключайте :). Конкретно этот датчик имеет следующие характеристики:

  • напряжение питания: 2.7-5.5В;
  • погрешность: 2 градуса;
  • измеряемая температура: от 10°C до 125°C
  • потребляемый ток: 50мкА.

1. Подключение

Датчик TMP35 имеет три вывода (три ноги). Если посмотреть на датчик со стороны этих выводов и срезом вверх, как показано на рисунке,

то слева будет  — положительный контакт питания (+2.7 — 5.5В),
по центру — выход на контроллер,
и справа — отрицательный контакт питания (земля).

tmp_1

Датчик аналоговый, а значит на его выходе мы имеем не 0 или 1, а напряжение в диапазоне от 0 до 5 вольт. Следовательно, мы должны вспомнить раздел про аналого-цифровое преобразование (АЦП) сигналов в Arduino. Держа в уме, что у Ардуино Уно есть шесть аналоговых входов (A0-A5), подключаем наш датчик по следующей схеме:

tmpx1_bb

И в виде принципиальной схемы:

tmpx1_схема

Внешний вид макета

DSC_0022

2. Программа

Подключив датчик температуры к Ардуино, начинаем писать программу. Первое что мы сделаем, это выведем необработанный сигнал с аналогового входа в последовательный порт, для того чтобы просто понять, как меняется значение на входе A0. Нам понадобится простая программа:

int raw = 0;
float temp = 0;

void setup() {
  Serial.begin(9600);
  pinMode( A0, INPUT );
}

void loop() {
  raw = analogRead(A0);
  temp = ( raw/1023.0 )*5.0*1000/10;
  Serial.println(temp);
  delay(1000); 
}

Внимание, математика! В программе можно заметить выражение:

temp = ( raw/1023.0 )*5.0*1000/10;

Оно необходимо для того, чтобы преобразовать аналоговый сигнал датчика в градусы Цельсия. Дело тут вот в чем. Все аналоговые датчики имеют важную характеристику — отношение количества вольт к единице измеряемой величины. Например, в спецификации к нашему датчику tmp35 написано, что каждый градус измеряемой температуры, соответствует 10 милливольтам напряжения на выходе. Исходя из этих рассуждений, прочитанное с помощью analogRead значение мы сначала преобразуем к количеству Вольт:

 вольты = (значение АЦП / 1023) * 5

Такая процедура называется нормировкой. Здесь 1023 — максимальное значение, которое может вернуть нам 10-битный АЦП, встроенный в Ардуино Уно.
5 — рабочее напряжение АЦП.

Затем преобразуем эти вольты в градусы Цельсия:

градусы = (вольты * 1000) / 10

Превращаем вольты в милливольты (*1000), и делим на 10 ( то самое число из спецификации! ).

В общем, даже если ничего не понятно, загружаем программу на Ардуино и наблюдаем за температурой окружающего воздуха. Например, у нас в лаборатории датчик оценил температуру следующим образом:

ph_temp_1

Вполне себе правдивое значение. А теперь поднесем прибор к открытому окну (на улице зима -10°C):

ph_temp_2

Работает! Датчик незамедлительно регистрирует снижение температуры.

3. Делаем термостат

Теперь добавим в программу некое действие, которое будет совершаться если температура упадет ниже заданного нами порога. Пусть этот порог будет равен 15°C. Самое простое, что мы можем сделать — это зажигать на Ардуино штатный светодиод #13. Получается такая вот программа:

int raw = 0;
float temp = 0;

void setup() {
  pinMode( A0, INPUT );
}

void loop() {
  raw = analogRead(A0);
  temp = ( raw/1023.0 )*5.0*1000/10;
  if (temp < 15)
    digitalWrite(13, HIGH);
  else
    digitalWrite(13, LOW);
  delay(1000); 
}

Кто-то забыл закрыть окно — температура резко опустилась ниже 15 — светодиод зажигается. Закрываем окно, активно дышим — светодиод гаснет. А теперь представьте, что вы зажигаете не светодиод, а подаете сигнал на реле, которое включает обогреватель в комнате. Получается готовый термостат!

Немного изменив программу можно отслеживать не понижение, а превышение заданного уровня. Например, удобно будет следить за температурой внутри, скажем, серверной, и при увеличении температуры до 40 градусов, включать вытяжку!


Изменено:

Ардуино: датчик температуры LM35: 9 комментариев

  1. Собрал все согласно схеме. Вроде работает, но если подключить светодиод к выходу 13 он светит тускло и при подключении реле оно не срабатывает. Подскажите что не так?

  2. Разобрался. Вот рабочий скетч на подключение реле
    int raw = 0;
    int Relay = 13;

    float temp = 0;

    void setup() {
    pinMode( A0, INPUT );
    pinMode(Relay, OUTPUT);
    }

    void loop() {
    raw = analogRead(A0);
    temp = ( raw/1023.0 )*5.0*1000/10;
    if (temp < 15)
    digitalWrite(Relay, HIGH);
    else
    digitalWrite(Relay, LOW);
    delay(1000);
    }

  3. Добрый день! сколько максимально можно использовать темп.датчиков+реле?

    • Если это Arduino Uno, то на ней всего 20 выводов общего назначения, к которым можно подключить реле или любые другие цифровые устройства. Из этих 20, 6 умеют считывать аналоговый сигнал, в том числе и с аналоговых датчиков.

  4. У меня почему то постоянно разные цифры скачут, то не так?, Raw выдает:
    1023
    1023
    1023
    1023
    892
    745
    574
    389
    134
    0
    0
    0
    0
    0
    0
    0

    • Возможно датчик неверно подключен, или битый. На датчик нужно смотреть со стороны ног! Картинка с распиновкой в уроке именно для этого угла обзора. Кстати, если датчик сильно греется — это еще один показатель того, что он неверно подключен.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>