как подвязать датчик температуры к ардуино

Про АйТи и около айтишные темы

[Arduino] Несколько датчиков температуры DS18B20

Собрал схему на Arduino UNO с тремя датчиками температуры DS18B20 подключенных последовательно через подтягивающий резистор на 4,7 кОм.

Залил скетч для опроса всех датчиков на шине 1-Wire:

Тестовая схема заработала, в консоле появились значения (с точностью до сотых) температуры со всех трех датчиков DS18B20. Следующая стадия испытания была в среде с минусовой температурой. На тот момент на улице был плюс, поэтому пришлось прибегнуть к помощи морозилки.

Засунул один из датчиков в морозильную камеру и включил режим супер-заморозка (до –32 градусов Цельсия). Значения температуры стало стремительно падать, перевалило через 0 и продолжало падать. В этот момент я отвлекся на 20 минут, чтобы не ждать возле холодильника. Но когда вернулся к стенду увидел, что датчик показывает –127 градусов. Вот и первый баг, т.к. морозилка не могла выдать такую температуру.

Опытным путем выяснил, что баг проявляется при температуре меньше –15,75°. Следующее значение уже -127°. Начал грешить на китайский датчик DS18B20, но его замена ошибку не исправила.

Проблема была в библиотеке DallasTemperature. Скачал другую версию библиотку с этого сайта — http://www.hacktronics.com/Tutorials/arduino-1-wire-tutorial.html. Хотя версия новой библиотеки совпадала с моей, но различия имелись.

Вот обе версии библиотеки DallasTemperature, выложил на Яндекс.Диск:

1. DallasTemperature.zip – с этой библиотекой нормально отображается минусовая температура (https://yadi.sk/d/DsfPqoqsd7g8f)

2. DallasTemperature (-127).zip – с этой библиотекой при температуре меьше -16 датчик показывает -127. (https://yadi.sk/d/g9SMy6fMd7gMS).

Хотите поблагодарить автора за эту заметку? Вы можете это сделать!

Arduino: Делаем самостоятельно датчик температуры

Температура является едва ли не основным измеряемым параметром в промышленной и хозяйственной деятельности. Вместе с тем, мало просматривается экономически обоснованных реализации датчиков температуры даже в диапазоне -50 +50 Град С , столь обычном и привычным для многих применений. Известны на рынке датчики DS18B20 фирмы Dallas , заявленная точность которых около 0,5 Град. Эти датчики были рассчитаны на построение микросетей (MicroLAN) с осуществлением адресного опроса каждого датчика со стороны микроконтроллерного устройства по протоколу 1-Wire. Однако, реализаций таких сетевых решений, когда линию связи делили бы десяток и более таких устройств, практически не встречается. Аналогична ситуация и температурными датчиками протокола I 2 C фирмы Philips, например такими, как LM75. Все это вызывает определенное недоверие к проработанности схемотехники указанных датчиков температуры. Что же делать, если необходимо иметь несколько точек измерения температуры, опрашиваемых с помощью микроконтроллера?

В эпоху аналоговых электронных термометров нередко можно было встретить схемы с диодными датчиками температуры. Уместно, к примеру, привести схему из справочника радиолюбителя [1 ] . В ней, в качестве датчика температуры, используется обычный кремниевый диод, а точность измерения, при этом, составляет 0,3 Град.

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

В качестве Ардуино устройства используем плату TE-MINI328 , от московской компании «Терраелектроника» , которая на проверку оказалась совместима с Ардуино серии Nano.https://www.terraelectronica.ru/catalog_info.php?CODE=1041000

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

Практически в каждой реализации платы Ардуино имеется вывод источника опорного напряжения встроенного АЦП. Этот источник имеет уровень напряжения 1,1В у ардуино нано. Для других плат он может быть другим , например 2,54В, что зависит в общем от типа используемого микроконтроллера. Этот источник стабильного напряжения можно использовать как раз для питания температурного датчика, хотя и следует иметь в виду его относительно небольшой выходной ток.

Платформа Ардуино удобна тем, что на ней легко реализуются базовые принципы структурного программирования: наследование, полиморфизм и инкапсуляция. В качестве прародителя целесообразно взять готовую работающую программу (Sketch) и , на ее основе, дополнить необходимым функционалом, который может присутствовать также во встроенном пакете библиотек. В качестве базы в данном примере была использована программа выложенная в открытый доступ коллегами из фирмы OLIMEX (Болгария) , которая реализует часы реального времени на базе микросхемы PCF8563, являющаяся наиболее дешевой из однокристальных часов реального времени (https://www.olimex.com/Products/Duino/AVR/OLIMEXINO-328/resources/OLIMEXINO_328_MOD_RTC_Demo.zip) [2]. Далее эта программа была дополнена функцией работы с LCD индикатором известной системы команд HD44780 c четырех проводной шиной команд/данных (имеется во встроенной библиотеке Ардуино). Имея в системе этот индикатор, нам легче будут в дальнейшем провести калибровку нашего температурного датчика, и наблюдать за температурой и временем даже не используя монитор последовательного порта, который встроен в среду Ардуино.

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

РИС 2

Для изготовления диодного температурного датчика возьмем популярный импортный диод 1N4148, хотя подойдут и аналогичные отечественные, например КД521 или Д220. По нашим наблюдениям хорошей линейностью вольт- температурной характеристикой обладают и многие германиевые диоды, например Д9, у которых падение напряжения при прямом смещении оказывается раза в 2 меньше, чем у кремниевых. Поскольку работать диодный датчик будет в области малых токов, примерно 100 МкА, следует тщательно изолировать проводные выводы с помощью виниловой трубки, торцы которой следует оплавить, например, с помощью промышленного фена или загермитизировать силиконовым герметиком или применив клеевый пистолет. Воспользоваться можно и термоусадочной трубкой соответствующего диаметра. Все это необходимо для того, чтобы вода ни в коем случае не могла попасть внутрь изоляции, что неизбежно привело бы к искажениям результатов измерений. Также в расчет следует взять и тот факт, что диоды со стеклянным корпусом могут реагировать на попадание света внутрь корпуса, отчего определенным преимуществом будут обладать экземпляры с корпусом, покрытым черной краской (например КД503 Д220 и т.п.) Как указывалось выше для Ардуино Nano уровень опорного напряжения составляет 1,1 В. Поскольку падение напряжения на кремниевом диоде при комнатной температуре и току смещения 100МкА составляет прмерно 500мВ диапазон использования встроенного АЦП микроконтроллера ATMega328 , перекрывает диапазон температур от -50 до +50 Град С, так как падение напряжения на диоде не выйдет за пределы 0—1,1 В. Правда точность измерений в этом случае лучше чем 1 град ожидать не приходится. Для указанной схемы питания датчика, вольт- температурная характеристика будет иметь вид рис2. Т.е. , с повышением температуры, падение напряжения уменьшается. Зависимость температуры Т от напряжения Ud очевидно описывается уравнением вида:

Фото 1

, а Ud –есть отсчет АЦП для этой температуры . Получим, в результате, два уравнения вида 1.1, для разных измеренных температур. Разрешая пару этих уравнений относительно неизвестных А и В – получаем нужные нам калибровочные значения, которые будем использовать в программе для перевода отсчета АЦП к значению реальной температуры. Вышесказанное закрепим теперь практическим примером:

1. Помещаем датчик в среду с температурой Т1 (19,9 ГрадС)и записываем значение цифрового отсчета Ud1 (450)

2. Помещаем датчик в среду с температурой Т2 (-2,8 ГрадС) и записываем значение цифрового отсчета Ud2 (503) для этой температуры

3. Получив систему линейных уравнений : Т1=A-B*Ud1 и T2=A-B*Ud2

Разрешая их относительно неизвестных A и B получаем А=0,46, а В=229,5

Теперь несложно вычислить реальную температуру при любом полученном цифровом значении Ud по формуле 1.1. Ниже приведен фрагмент скетча где этот момент явно виден в моменте перехода переменной gett от целочисленного значения к значению с плавающей точкой.

Возникает попутно интересный вопрос: Можно ли эту процедуру вычисления калибровочных коэффициентов А и В провести и без использования Ардуино? Если в распоряжении имеется лишь цифровой тестер, то наверное да. При этом следует учесть, максимальному цифровому отсчету Udmax равному 1024 (для десяти разрядного АЦП AVR микроконтроллера будет соответствовать уровень опорного напряжения (1,1V) . Откуда следует вычислить поправку к показаниям тестера для вычисления соответствующих значений Ud.

Аналогично следует поступить и с другими диодными датчиками температуры (Коэффициенты А и В для каждого экземпляра будут очевидно отличаться!) , если предполагается их использование, например, на соседних каналах аналогового ввода А1, А2, А3, А4, А5. При необходимости расширить группу температурных датчиков выше числа аналоговых каналов у Ардуино (обычно 6) возможно применение аналоговых мультиплексоров.

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

При работе с другими видами Ардуино необходимо руководствоваться DataSheets применяемого микроконтроллера в части использования АЦП, где последний, необходимо настроить на работу с выбранным каналом аналогового ввода, с использованием встроенного источника опорного напряжении, к которому предполагается подключение блокировочного конденсатора. Кстати такой конденсатор, емкостью 0,1 МкФ необходимо установить также параллельно диодному датчику, т.к. при малых токах диоды имеют свойство формировать «белый шум» из-за которого показания будут искажаться и «прыгать».

РИС 4 (плата Ардуино на схеме не показана)

А как поступать если от от датчика потребуется точность выше одного градуса, например, для измерения температуры внутри инкубатора или в качестве медицинского термометра ?

В этих случаях неплохим решением может быть последовательное соединение подобных диодов, что неизбежно приведет к увеличению крутизны вольт –температурной характеристики температурного датчика, и , следовательно, разрешению по температуре. Не следует забывать, что в некоторых моделях микроконтроллеров предусмотрена настройка АЦП для работы с дифференциальным входом при одновременном увеличении коэффициента усиления входного усилителя, что может и должно привести передаточную характеристику схемы в желаемую область интереса. При отсутствии подобных опций можно применить внешний дифференциальный усилитель на отдельной специализированной микросхеме (например LM358 и т.п.), который, скорее всего, может быть общим для всех температурных каналов. Можно, наконец, настроить АЦП на работу с напряжением питания (+5В или + 3В) в качестве опорного , сделав датчик из нескольких, последовательно соединенных кремниевых диодов. Правда, подключать эту «гирлянду» лучше все же не напрямую к питающему напряжению, а лишь к той его части, что подводится к выводу для питания АЦП и развязана, как правило, индуктивно-емкостным фильтром.

Полностью скетч проекта приведен во вложении. Его реализация привела к идее изготовления универсального измерительного прибора на платформе Ардуино, что достигалось бы сменой датчиковых элементов (плат) с помощью встроенного разъема МРН22-2. См. Фото2,3. и рис4 Часы реального времени понадобятся при превращении такого прибора в логгер измеряемых данных с привязкой ко времени измерений и выгрузки, например, на ПК целью последующего анализа. Показание датчика температуры на индикаторе – в нижней строке справа, а уровня поля – на верхней строке справа. Получается весьма современный прибор, ведь входное сопротивление канала АЦП AVR микроконтроллеров составляет 100Мом, а это почти как у современных мультиметров!

ФОТО 2

Фото 3

1. Чистяков Н.И. Справочная книга радиолюбителя-конструктора М. «Радио и связь» (1990)

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

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