Цифровой термометр на Arduino и датчике температуры LM35

Содержание

Термометры – это полезные устройства, которые используются человечеством уже долгое время. В этой статье мы спроектируем цифровой термометр на базе платы Arduino Uno и датчика температуры LM35, который будет измерять температуру окружающей среды в режиме реального времени и выводить ее значение на жидкокристаллический (ЖК) дисплей 16×2.

Цифровой термометр на Arduino и датчике температуры LM35: внешний вид

Данное устройство условно можно разделить на три модуля: первый измеряет температуру используя температурный датчик LM35, второй конвертирует измеренное значение температуры в привычную нам шкалу Цельсия (выполняется с помощью Arduino), а третий отображает это значение температуры на ЖК дисплее. Условно весь этот процесс можно представить в виде следующей диаграммы:

Диаграмма работы устройства

Все процессы на этой диаграмме проходят под контролем Arduino. Датчик температуры LM35 используется для измерения окружающей температуры и обеспечивает при изменении температуры на 1 градус изменение напряжения на 10 мВ на своем выходном контакте. Этот факт можно достаточно просто проверить с помощью вольтметра, подсоединив Vcc к pin 1, землю (Ground) к pin 3 и выходное напряжение к контакту pin 2 датчика LM35. К примеру, если напряжение на выходе датчика LM35 равно 250 мВ, то это означает, что температура окружающей среды примерно равна 25 градусам Цельсия.

Arduino считывает выходное напряжение датчика температуры со своего аналогового контакта A0 и выполняет вычисления, направленные на конвертацию этого аналогового значения напряжения в цифровое значение температуры. После проведения вычислений Arduino передает полученное значение температуры на ЖК дисплей 16×2.

Необходимые компоненты

Arduino

В этом проекте мы используем микроконтроллер для контроля всего процесса, который размещен на плате Arduino. Некоторые называют Arduino микроконтроллером, но это не совсем так, потому что Arduino представляет собой операционную систему или начальный загрузчик, который работает на основе микроконтроллера AVR. Если говорить шире, то Arduino – это аппаратная платформа с открытым исходным кодом, которая очень удобна для реализации многих практических проектов в электронике.

Внешний вид платы Arduino Uno

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

LM35 (купить на AliExpress) представляет собой датчик температуры с 3 контактами, который обеспечивает изменение напряжения на своем выходе на 10 мВ при изменении температуры на 1 градус Цельсия. Верхний предел измерения температуры у него составляет около 150 градусов Цельсия. На 1-й контакт датчика подается питающее напряжение, 2-й контакт – выход датчика, а на 3-й подается земля.

Номер контакта Функция Обозначение
1 Питающее напряжение; 5V (+35V to -2V) Vcc
2 Выходное напряжение (+6V to -1V) Output
3 Земля (0V) Ground

Внешний вид датчика температуры LM35 и обозначение его контактов

ЖК дисплей

ЖК дисплеи 16×2 (купить на AliExpress) широко используются в различных проектах поскольку они дешевы, легко доступны, относительно небольшие по размеру и просты в подключении. ЖК дисплей 16×2 имеет 2 строки и 16 столбцов, что означает что он состоит из 16 блоков по 5×8 точек в каждом. Он имеет 16 контактов, из которых 8 контактов для передачи данных (D0-D7) и 3 контакта для управления, которые обозначаются как RS, RW and EN. Остальные контакты используются для подачи питания, контроля яркости и подсветки.

Питание

Плата Arduino уже имеет встроенный модуль подачи питания, поэтому здесь нам необходимо только подсоединить адаптер на 9 или 12 вольт к плате, или можно запитать ее от USB-порта компьютера или ноутбука.

Работа схемы

Схема устройства представлена на следующем рисунке.

Схема цифрового термометра на Arduino и датчике температуры LM35

На представленной схеме ЖК дисплей 16×2 напрямую подсоединен к плате Arduino в 4-битном режиме. Контакты ЖК дисплея с обозначениями RS, EN, D4, D5, D6, D7 подсоединены к цифровым контактам Arduino 7, 6, 5, 4, 3, 2. Датчик температуры LM35 подсоединен к аналоговому контакту A0 платы Arduino.

Исходный код программы

Чтобы написать код программы для нашего цифрового термометра, мы должны написать код для Arduino, датчика температуры LM35 и ЖК дисплея 16×2. Сначала подключим библиотеку для ЖК дисплея, а затем определим контакты данных и управления для подключения ЖК дисплея и датчика температуры.

После получения аналогового значения напряжения на аналоговом входе A0 мы считываем это значение и сохраняем его в переменной с помощью команды float analog_value=analogRead(analog_pin) . После этого мы преобразуем его в цифровое значение температуры по следующей формуле:

float Temperature=analog_value*factor*100

где factor=5/1023, analog_value – аналоговое значение напряжение с выхода датчика температуры.

То есть получаем код вида:

Символ градуса формируем используя стандартный метод с помощью следующего кода:

Далее представлен полный исходный код программы нашего цифрового термометра.

Видео, демонстрирующее работу термометра

Похожие статьи

Комментарии

Цифровой термометр на Arduino и датчике температуры LM35 — 79 комментариев

Комментарий перенес в указанную Вами статью.

Конвертацию уровней сделать самому проблематично. В программе строка,

if (level230) level=level+26; //увеличиваем значение MCP41010 на 2 ступени

судя по комментарию, должна увеличить Level на 2 ступени, но увеличение происходит на 26 ступеней. 2 ступени резистора должны соответствовать 26 ступеням MCP41010, т.е. level должен равняться 2 при изменении MCP41010 на 26 ступеней, что и должно отображаться в мониторе порта, а отображается изменение на 26. Если в этой строке заменить 26 на 2, то это будет неверно. Значение level должно быть максимально 19 и изменение на 1 уровень должно изменять значение MCP41010 на 13, но выводиться как одна ступень. Нужно какое-то дополнительное преобразование 13 в 1 то ли переменной, то ли функцией. В этом проблема для меня.

https://disk.yandex.ru/i/25NPsG6VfnxxnQ
Можете ли подключить такой индикатор для показаний температуры и 19 уровней? Если нет, то какой другой?

Ну если ссылку на статью дадите где такой индикатор к Ардуино подключают, то могу попробовать сделать это для вас.
Про преобразование уровней вы меня что то совсем запутали, я даже и не знаю что вам еще предложить. Можно попробовать использовать функцию map, с ее помощью можно, к примеру, преобразовать диапазон 1-19 в диапазон 1-255 и наоборот, но не знаю, поможет вам это или нет. Ну или в сети вы не можете найти информацию по поводу того какая функция преобразования вам нужна?

Наверное, нужно всё-таки 1-19 в 1-255, т.к. от температуры меняются уровни — 1 уровень соответствует изменению 13 ступеней MCP41010.
Если 1-19 в 1-255 или 1-255 в 1-19 с помощью функции map, то будет соблюдаться регулировочное соотношение 13 к 1 или 1 к 13? Если да, то давайте попробуем.

Я ваш комментарий последний удалил, а ссылки из него себе сохранил. Вроде пример с arduino-technology.ru достаточно простой. Попробуете сначала его у себя запустить?
Новая версия программы
https://disk.yandex.ru/d/c7_V0FRjJPAYmA
В ней я добавил конвертирование уровней

В примере с arduino-technology.ru нет датчика DS18B20.

Да вы просто попробуйте чтобы этот пример заработал, чтобы на индикатор выводились какие-нибудь значения. Если он у вас заработает, то я его код интегрирую в нашу основную программу

Я понял суть проблемы, попробуйте эту программу:
https://disk.yandex.ru/d/eAUg1B4RqGwnlw
И давайте наше общение перенесем в комментарии к этой статье, а то здесь уже очень много комментариев

Делайте так, как считаете нужным. Мои комментарии тоже приходят постепенно, сначала думалось так, а потом по-другому. Это нормальный творческий процесс.

Попробуйте эту программу — https://disk.yandex.ru/d/-YUDOTB0eGPvXA
Поэкспериментируйте там с границами температуры. Все комментарии я вам там подписал

https://disk.yandex.ru/d/o_hh2axMcgXP2g
Уровни должны быть от 0 до 19, т.е. не сделан перерасчет 13 к 1. Температура больше 27.5, но меньше 30 — ступени не уменьшаются.

Температура больше 27.5, но меньше 30 — ступени не уменьшаются — это потому что уровень и так уже уменьшился до 0. Ведь меньше 0 он быть не может? Я специально поставил условие чтобы так было. Или нужно как то по другому? Просто когда вы задержку увеличите до 3-х минут, возможно такой ситуации уже наблюдаться не будет, не?
По поводу шага изменения уровней вы меня что то уже совсем запутали. Ну если вам не подходит шаг 26, который сейчас в программе установлен, вы же можете изменить его на любой другой который вам подходит. Я вам могу этот шаг даже отдельной переменной сделать чтобы вам удобнее было его менять и экспериментировать с ним

Возможно при 3-х минутной задержке такого и не будет. Кстати, где в скетче эта задержка устанавливается? Можно попробовать охлаждать DS18B20.
Про шаг изменения уровней. Сделайте конвертацию 13 уровней в 1, чтобы в мониторе порта было не 26, а 2, как на резисторе в котле.

Задержка устанавливается в следующей строке
delay(2000); // задержка
Это задержка на 2000 мс, то есть на 2 секунды.
Конвертацию уровней вы можете тоже легко самостоятельно поправить, в программе сейчас для этого всего две строки:
level=level+26;
и
level=level-26;
Можете сами изменить это значение 26 на то, что вам нужно

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

Скетч не с Вашего сайта. Как в Вашем скетче с датчиком BMP180 сделать целый поправочный коэффициент при считывание значения температуры с датчика?

То есть нужно установить еще предел температуры сверху, при достижении которого котел должен отключаться? Что в этом случае делать с уровнем потенциометра?
Если вы один раз в программе собираетесь использовать поправочный коэффициент на температуру, то можно это сделать как вы написали — times = bmp.readTemperature()-2;
Если в нескольких местах, то лучше завести отдельную переменную для хранения значения поправочного коэффициента — просто в этом случае если вы захотите его поменять, то это будет сделать гораздо проще

У Вас на сайте есть статья про двухканальный термостат, в котором задается две температуры, нижняя и верхняя. По аналогии с этим задаются пределы, к примеру 26,5 — 27,5 градусов. В этих пределах изменение уровня MCP41010 не происходит, т.е. этим пределам соответствует определенный уровень MCP41010, аналогия с выставленным уровнем резистора (у которого 19 ступеней) вручную в котле. Отличие только в том, что при выходе температуры за пределы, не нужно вручную устанавливать другой уровень резистора, это будет делать автоматически программа через MCP41010, но ступенчато, к примеру, изменением на две ступени резистора, которые соответствуют 26 уровням MCP41010, т.е. программа выдает не 26 уровней регулировки, а два, соответствующих 26 ступеням MCP41010, с периодической проверкой заданных пределов температуры. Если температура меньше заданных пределов, то прибавляются еще две ступени, соответствующие 26 ступеням MCP41010. Если температура по каким-либо причинам будет больше заданных пределов, то по две ступени вниз. При заданной максимальной температуре, к примеру 30 градусов, уровень MCP41010 делается нулевым.

Как завести отдельную переменную для хранения значения поправочного коэффициента?

Завести такую переменную не сложно, например, const int popravka = 2;
Ту статью про двухканальный термостат не я писал, а предыдущий админ сайта. Давайте я вам в программе тогда сделаю два уровня: 26,5 и 27,5 градусов, и 30 градусов верхний предел. Все эти уровни сделаю отдельными переменными, поэтому вы сами потом сможете их легко менять. Так подойдет?

Отдельная переменная для хранения значения поправочного коэффициента нужна для другого скетча с BMP280.

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

Да и этот поправочный коэффициент я вам легко в программу внесу. Я вам могу сделать то, о чем в предыдущем комментарии написал, а вы поэкспериментируете со всеми этими границами и сделаете вывод что еще нужно в программе написать. Я никогда раньше ни с чем таким не сталкивался, что вы хотите сделать, поэтому сразу готового решения "под ключ" я вам не могу предложить. Все это и вынуждает меня двигаться маленькими шагами в вашей задаче

Знаки больше и меньше не отобразились, поэтому весь абзац с заменой их словами.
Для начала такой алгоритм: при "первоначальном" включении котла MCP41010 на минимуме и с помощью реле его минимум (50 Ом) шунтируется на 0, задается температура для DS18B20 кнопками () в пределах +25 — 28 градусов (нужен индикатор), например +27 (гистерезис плюс минус 0.5 градуса), далее шунтирующее реле отключается и начинается изменение сопротивления MCP41010 по 2 ступени, которые соответствуют перерассчитанным уровням резистора котла и сравнение с заданной температурой, через 3 минуты к примеру, если меньше +27, то происходит увеличение на две ступени до достижения соответствия заданной температуре. Если больше +27, то происходит уменьшение на две ступени до достижения соответствия заданной температуре вплоть до минимума сопротивления MCP41010 и включения шунтирующего реле для отключения контура отопления.

MCP41010 будет вместо переменного сопротивления в плате управления котла. Поэтому приведен перерасчет уровней. Включение в режиме потенциометра.
Переменным резистором с 19 уровнями управления устанавливается температурный режим контура отопления, который управляется датчиком от нагрева воды в котле: при достижении определенной температуры на датчике нагрев отключается, при снижении температуры — включается, и так циклически; чем на больший уровень выставлен резистор, тем дольше нагрев. Установка ручная. Также в котле есть возможность подключения внешнего термостата, но он будет производить регулировку в зависимости от установленного уровня переменного резистора, который устанавливается вручную. Поэтому подумалось об автоматике.
О соответствии уровней MCP41010 определенной температуре сказать не могу.
Для начала такой алгоритм: при "первоначальном" включении котла MCP41010 на минимуме и с помощью реле его минимум (50 Ом) шунтируется на 0, задается температура для DS18B20 кнопками () в пределах +25 — 28 градусов (нужен индикатор), например +27 (гистерезис плюс минус 0.5 градуса), далее шунтирующее реле отключается и начинается изменение сопротивления MCP41010 по 2 ступени, которые соответствуют перерассчитанным уровням резистора котла и сравнение с заданной температурой через 3 минуты к примеру, если +27, то происходит уменьшение на две ступени до достижения соответствия заданной температуре вплоть до минимума сопротивления MCP41010 и включения шунтирующего реле для отключения контура отопления. Если будет взаимовлияние температуры внешнего датчика DS18B20 и внутреннего датчика котла, то можно попробовать управление через внешний термостат, управление которого осуществляется по двум проводам с помощью реле или оптопары.

Давайте я тогда напишу вам программу, в которой заранее установленной температурой будет 27 градусов, если измеренная температура будет меньше 27 градусов, то на 2 ступени будет увеличиваться значение MCP41010, если больше 27 градусов, то на 2 ступени будет уменьшаться значение MCP41010. Это будет делаться с задержкой в 2 секунды. Ступени, насколько я понимаю, здесь это преобразованные 256 уровней в 19 ступеней. Так подойдет вам для теста?

Хорошо. Да, ступени — это преобразование 256 уровней в 19 ступеней или 13 к 1.

Попробуйте эту программу — https://disk.yandex.ru/d/Y8TpmFMb_l20fQ.
Для изменения на 2 ступени я просто добавлял или отнимал от уровня потенциометра значение 26. Если вам нужна немного другая логика этого процесса, пишите, внесем изменения. Также с заранее определенными значением температуры и уровня потенциометра можете поэкспериментировать, я там оставил комментарии в программе где их нужно менять

Оцените — https://disk.yandex.ru/d/D2KA4OrpA8PhXw
1 вариант — foto_27 и foto2_27 — температура в скетче 27;
2 вариант — foto3_30, foto4_30 и foto5_30 — температура в скетче 30;
3 вариант — foto6_30_0, foto7_30_0, foto8_30_0 и foto_30_0 — температура в скетче 30 и начальный уровень MCP41010 = 0.
(повышение температуры от пальцев рук)
В 1-ом варианте между Level = -236 и Level = -262 большой скачок при небольшом увеличении температуры.
Во 2-ом варианте между Level = 232 и Level = 258 также большой скачок при одинаковой температуре.
В 3-ем варианте тоже есть подобные скачки.
Почему выбрано значение 26?

Вопрос по другой теме. В скетче с датчика BMP280 выводится температура в целых числах без десятых так:
times = bmp.readTemperature();

Температура показывает значение больше на 2 градуса. Как правильно ввести поправочный коэффициент? Так: times = bmp.readTemperature()-2;
или нужно задавать это через переменную. Если через переменную, то как это написать?

Ну почему происходят большие скачки напряжения при небольшом изменении уровня потенциометра — этого я, к сожалению, не знаю. Никогда просто с такими потенциометрами не работал. А уровни меняются правильно, по алгоритму как вы написали.
Значение 26 выбрано потому что вы сами писали что на 1 ступень приходится 13 уровней, то есть 2 ступени эквивалентно 26 уровням. Но это легко поменять если вас эта цифра не устраивает.
В каком скетче с датчиком BMP280? У меня на сайте есть статья с датчиком BMP180, а вот BMP280 я вот что то не помню


Источник: microkontroller.ru