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

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

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

ardu_temp_tmp35

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

  • напряжение питания: от 2,7 до 5,5 В;
  • погрешность: 2 градуса;
  • измеряемая температура: от 10°C до 125°C
  • потребляемый ток: 50 мкА.
Компоненты для урока "Ардуино: датчик температуры LM35" на shop.robotclass.ru
В корзину
В корзину
В корзину
В корзину
В корзину

Подключение

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

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

tmp_1

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

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

tmpx1_bb

Принципиальная схема

tmpx1_схема

Вот так должна выглядеть собранная схема.

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

Программа

Подключив датчик температуры к Ардуино, начинаем писать программу. Первое что мы сделаем, это выведем необработанный сигнал с аналогового входа в последовательный порт, для того чтобы просто понять, как меняется значение на входе 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

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

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

Теперь добавим в программу некое действие, которое будет совершаться если температура упадет ниже заданного нами порога. Пусть этот порог будет равен 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 градусов, включать вытяжку!

К размышлению

В современных устройствах всё чаще применяют цифровые датчики температуры, например, известный в среде DIY датчик DS18B20. Он легко подключается к Ардуино с помощью только одного сигнального провода — one wire. Модуль с таким датчиком есть и у RobotClass:

Датчик температуры DS18B20

О том как его подключать и использовать в своих проектах узнаем на уроке про DS18B20.


Изменено:

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

  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 умеют считывать аналоговый сигнал, в том числе и с аналоговых датчиков.

    • Виталий, можно использовать АЦП плату с I2C интерфейсом, тогда появляется возможность подвесить дополнительные датчики.
      Так же можно воспользоваться сдвиговым регистром для многократного увеличения цифровых выходов.

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

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

  5. Странное название у данной статьи «датчик температуры LM35», при этом сам датчик там не упоминается, хотя является очень удобным:
    «Серия LM35 это прецизионные интегральные датчики температуры, у которых выходное напряжение пропорционально температуре по шкале Цельсия.»
    т.е. это означает, что нет необходимости что-то там пересчитывать после измерения (я про это — temp = ( raw/1023.0 )*5.0*1000/10;).

    • Ничего странного здесь нет. LM35 и TMP35 — аналоги. Оба датчика действительно дают напряжение пропорциональное температуре.
      Формула же служит для преобразования значения АЦП (0..1024) в градусы Цельсия. В статье популярно написано, откуда она берется.

  6. Вопрос, как правильно считать температуру при использовании питания 3,3В ??

  7. #include
    #include
    #include
    #include

    // If using software SPI (the default case):
    #define OLED_MOSI 11
    #define OLED_CLK 12
    #define OLED_DC 9
    #define OLED_CS 8
    #define OLED_RESET 10
    Adafruit_SSD1306 OLED(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
    int raw = 0;
    float temp = 0;
    float t = 0;

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

    float temperature() {
    raw = analogRead(A0);
    temp = ( raw/1023.0 )*5.0*1000/10;
    return temp;
    }
    void loop() {

    t = temperature();

    // text display tests
    OLED.setTextSize(1);
    OLED.setTextColor(WHITE);
    OLED.setCursor(35,15);
    OLED.print(«Temp: «);
    OLED.print(t);
    OLED.print(» C;»);
    OLED.display();
    OLED.clearDisplay();
    delay(1000);

    }

  8. Доброго времени суток, попробовал повторить проект но столкнулся с проблемкой. В порт передаются значения в в районе 400°С (напряжение — 4..4,1 В) хотя на комнатном термометре +25. На изменение внешней температуры не реагирует. Использую датчик LM335Z купленный в магазине. В описание к нему дана другая распиновка (вид снизу: ADJ, V+, V-), попробовал подключить его по данной схеме — данные стали нормальные (ближе к нормальным) но очень сильно греется и очень вяло реагирует на смену температуры (прижимал к эмалированной чашке с кипятком и кусками льда колебания не более 5°С)

  9. Такая проблема, при подключении как в первом варианте, стабильно выводит значение 500(т.е. максимальное значение АЦП — 1023). значит ли это что Датчик неисправен? или проблема в другом?

    • Проверьте подключение, ноги не перепутали? Датчик сам не греется?

  10. здравствуйте! у меня на мониторе порта выходит следующее:
    64,3
    0
    0
    0

    не подскажите в чем проблема?
    спасибо

  11. Сделал все четко по речепту, но мне датчик выдает непонятные данные
    181.33
    168.13
    160.80
    156.40
    153.96
    150.54
    147.12
    145.65
    144.67
    143.21
    143.21
    142.72
    142.23
    141.25
    141.74

  12. Плата Arduino UNO, датчик LM35DT, при подключении крайних контактов к 5V и земле плата выключается, как и при коротком замыкании, от 3.3 V или с резистором работает нормально, но показания с выхода разнятся в зависимости от падения напряжения на датчике. Бракованный датчик?

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

  13. Arduino uno,датчик LM35DZ из старого набора arduino.Делал всё по инструкции пробывал 3 разных скетча,но суть у них одна и везде одно и тоже датчик выдает какие то случайные значения не имеющие отношения к температуре <> Меня местами плюс и минус ничего не меняется датчик не греется как проверить датчик?))

  14. The LM35 device is rated to operate over a −55°C to 150°C temperature range
    * — LM35 Precision Centigrade Temperature Sensors

    Как быть с отрицательной температурой?

  15. Приемник на Arduino Nano совместно с nRF24L01 отсылает телеметрию, датчик LM35DZ. На А3 измеряется напряжение 12в через делитель. На А2 измеряется температура . Почему при подаче на пин А3 напряжения, показания температуры начинают хаотически расти? При отключенном напряжении на делителе температура в норме. Милливольтметр, подключенный к пину А2, показывает, что напряжение не растет. В чем может быть проблема? Подскажите пожалуйста.

    • Попробуйте поставить конденсатор 100нф между A3 и землей. Вероятно на линии 12В у вас какой то вч шум, может от импульсника.

      • Поставил. Подключил к делителю на А3 аккумуляторы 4, 9 и 12 В. Картина та же. Пока на делитель ничего не подается — показания температуры стабильны. Как подключаю на делитель напряжение-начинается хаос. И чем большее напряжение, тем больше разброс термометра.

Добавить комментарий для Евгений Отменить ответ

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.