Подключение датчика температуры DS18B20 к микроконтроллеру. Датчик температуры Arduino DS18B20 Dallas 18b20 подключение

В процессе изучения микроконтроллеров рано или поздно возникает необходимость измерения такого метеорологического параметра окружающей среды, как ее температура. Современный мировой рынок электронных комплектующих предлагает широкий ассортимент датчиков температуры. Основные отличия между ними состоят в диапазоне измеряемой температуры, напряжении питания, области применения, габаритных размерах, способах преобразования температуры, интерфейсом для взаимодействия с пользовательской управляющей системой. Так исторически сложилось, что на текущий момент одним из самых популярных температурных датчиков является датчик DS18 B20 корпорации Dallas Semiconductor. О нем следующее повествование.

DS18 B20 – цифровой датчик температуры с программируемым разрешением преобразования.

Отличительные особенности:

1) Использование интерфейсной шины данных 1-Wire для взаимодействия с управляющей системой;
2) Наличие уникального 64-битного последовательного идентификационного кода, расположенного во внутренней ROM-памяти и предназначенной для многоточечных систем, где необходимо адресовать конкретный датчик;
3) Напряжение питания составляет 3-5,5В, что позволяет использовать его не только в 5-вольтовых системах, но и в 3,3 (большинство микроконтроллеров);
4) Диапазон измеряемой температуры составляет -55…+125 о С;
5) Точность в ±0,5 о С, правда это верно только для диапазона -10…+85 о С;
6) Разрешение преобразования определяется пользователем и составляет 9…12 бит;
7) Имеет внутренние регистры триггеров верхнего и нижнего порогов срабатывания с вырабатыванием сигнала тревоги для систем, использующих термостатическую логику работы;
8) Эти датчики программно совместимы с DS1822 и широко применяются в промышленных термостатических регуляторах, индустриальных системах, в потребительской электронике и других термочувствительных системах.

Описание и принцип работы устройства:

В своей статье я опишу пример работы с датчиком, выполненном в корпусе TO-92.

Выглядит он таким образом:

Внутри эта штуковина устроено очень просто, взгляните сами:

Рассмотрим поподробнее эту блок-схему.

Однако питание таким способом вносит некоторые ограничения на временные параметры датчика. Удержание линии данных некоторое время разрядит конденсатор, что приведет к обесточиванию линии INTERNAL Vdd, а соответственно и датчика в целом. Поэтому в неиспользуемое время на линии DQ должен поддерживаться высокий логический уровень. Следует отметить одно важное замечание. При операциях преобразования температуры и копирования данных из Scratchpad в EEPROM (в один из регистров), потребляемый линией INTERNAL Vdd ток может достигать 1,5мА, что непосильно внутреннему конденсатору, а на резисторе подтяжки будет большое падение напряжения, что недопустимо скажется на работе устройства в целом. Для этого необходимо организовать линии DQ схему мощной подтяжки, реализуемой по вот такой схеме:

После выдачи команды Convert T или Copy Scratchpad необходимо включить мощную подтяжку MOSFET-транзистором линии DQ не позднее 10мкс(макс.), как утверждают разработчики датчика, после чего выждать время преобразования (Tconv) или время передачи данных (Twr=10мс), причем в это время никаких действий при включенной мощной подтяжке на линии DQ быть не должно!

Про стандартное питание нужно мало что сказать, ведь тут все просто, и даже MOSFET не нужен вовсе:

Подсистема «64-BIT ROM AND 1-Wire PORT» содержит в себе уникальный 64-битный последовательный идентификационный код, расположенный в энергонезависимой памяти ROM, также в этом узле расположен интерфейс взаимодействия с управляющей системой 1-Wire. Подсистема «Memory Control Logic» осуществляет передачи данных между подсистемой интерфейса 1-Wire и памятью типа Scratchpad, которая, в свою очередь, имеет доступ к регистрам температурного датчика, регистрам установки верхнего и нижнего порогов срабатывания сигнала тревоги, конфигурационному регистру и регистру генератора 8-битноой контрольной суммы для защиты системы от неправильных данных.

При включении питания по умолчанию датчик имеет разрешение преобразования 12 бит, и сразу входит в режим пониженного энергопотребления. Для инициирования преобразования ведущее устройство должно передать команду Convert T . После преобразования температуры в цифровой код, этот код располагается в Scratchpad-памяти в виде двухбайтного слова, и датчик снова переходит в энергосберегающий режим.

Преобразование температуры.

Теперь разберемся, как преобразуется температура в датчике. По сути, внутри самого температурного сенсора располагается АЦП, и выходные данные, расположенные в регистре температуры, переносятся в Scratchpad-память. Данные о температуре имеют следующий формат:

Флаг S – флаг знака, используется для указания знака числа (S=0 – число, содержащееся в битах 10-0 положительно, и S=1, если число, содержащееся в тех же битах отрицательно, т.е. в данном случае температура представляется в дополнительном коде (коде дополнения до двух)).

При настройке на разрешение преобразования 12 бит все 12 бит (bit 11- bit 0) задействованы и содержат достоверные данные. При настройке на разрешение 11 бит содержимое бита 0 не следует принимать в расчет, при настройке на 10 бит не следует принимать в расчет биты 0 и 1 и т.д.

Сигнал тревоги – функция термостата.

Для этого предусмотрено 2 8-битных регистра, Th и Tl. В Th содержится значение верхнего порога температуры, а в Tl – соответственно нижнего. Если температура выше значение Th или ниже Tl устанавливается флаг тревоги. Этот флаг тревоги обнаруживается ведущим устройством посредством выдачи команды Alarm Search на линию DQ. Флаг тревоги обновляется при после каждой операции преобразования температуры. Кстати, только биты с 11 по 4-й регистра температуры используются в сравнении с регистром Th или Tl, отсюда следует, что функция термостата работает только для целых значений температуры. Регистры физически являются EEPROM памятью, поэтому они сохраняют свои значения при выключении питания. Сами регистры аналогичны регистру температуры, только они 8-битные, флаг S имеет абсолютно такое же значение, как и в предыдущем случае:

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

Формат этой памяти такой:

Младшие 8 бит отводятся для обозначения семейства, и содержат значение 0х28.Следующие 48 бит содержат уникальный серийный номер устройства. Самый старший байт содержит значение контрольной суммы CRC, рассчитываемой для младших 56 бит ROM-памяти.

Организация памяти.

Память датчика состоит из пространства памяти блокнотного типа (Scratchpad) и EEPROM-памяти для хранения данных конфигурации и значений регистров верхнего и нижнего порогов сигнала тревоги.

При выключении питания данные байта 2, 3 и 4 сохраняют свое значение в EEPROM. Ну а при включении, значение в них остаются неизменными. Байт 0 и 1 содержат значение преобразованной температуры, байты 5, 6, 7 зарезервированы для внутреннего использования и не могут быть доступны пользователю для его нужд.

8-й байт содержит значение, генерируемое встроенной логикой формирования CRC-кода для байтов с 0 по 7, что сводит к минимуму возможность ошибочного определения температуры в конечном итоге.

Следует отметить, что если функция термостата не используется, то регистры Th и Tl могут использоваться как память общего назначения – в них вы можете хранить любую информацию.

Данные записываются в байты 2, 3 и 4 начиная с младшего бита байта 2 при помощи команды Write Scratchpad . Для проверки целостности записанных данных, можно их прочитать, для чего необходимо передать датчику команду Read Scratchpad , после чего ведущее устройство должно принимать данные начиная с младшего бита байта 0.

Для сохранения данных старшего, младшего регистров термостата а так же регистра конфигурации в EEPROM-памяти, ведущее устройство должно передать датчику команду Copy Scratchpad .

Как отмечалось ранее, данные, уже записанные в EEPROM, при выключении питания сохраняются. Но при включении питания из соответствующих EEPROM-ячеек значения автоматически загружаются в соответствующие регистры памяти scratchpad. Удобно, не правда ли?:)

Кроме всего, данные, записанные в EEPROM, в любое время могут быть перезаписаны в scratchpad-память. Это необходимо например для того, когда вы изменили конфигурацию в процессе работы, а потом вам надо встать на «штатный режим работы», т.е. вернуть ту конфигурацию работы, которая была до изменения содержимого регистров памяти scratchpad. Вот собственно для этого ведущее устройство должно передать датчику команду Recall E 2 .

В регистре конфигурации пользователем могут определяться только 2 бита: R0 и R1. Эти биты определяют разрешение преобразования температуры, и по дефолту установлены в 1, что и определяет изначальную настройку на 12-битное разрешение преобразования.

Все возможные конфигурации этих битов и соответствующие разрешения представлены в таблице ниже. Следует отметить, что чем больше разрешение преобразования, тем больше время преобразования, например, для 12-битного разрешение время преобразования составляет 750мс (макс.).

Взаимодействие с управляющей системой.

DS18B20, как отмечалось ранее, для связи с ведомым устройством используют интерфейсную шину данных 1-Wire. Поэтому для его подключения управляющая система должна обеспечивать выход с открытым стоком или с Hi-Z состоянием линии.

Внутренняя конфигурация интерфейса датчика показана ниже:

В неактивном состоянии (в состоянии простоя) линия DQ подтянута резистором к «+» питания. Таким образом между транзакциями (передачами данных) эта линия всегда должна удерживаться в этом состоянии. Если по какой-либо причине транзакции должны быть приостановлены, линия DQ должна удерживаться в высоком логическом уровне, если эта передача дальше будет возобновлена. В процессе остановки транзакции мы сколько угодно долго можем держать линию DQ в высоком логическом уровне, начиная с 1мкс. Но, если шина данных будет удержана в низком логическом уровне дольше 480мкс, произойдет полный сброс всех датчиком, присутствующих на этой шине.

Последовательность операций для обмена.

Каждый раз при обращении управляющей системы к датчику должна быть соблюдена следующая последовательность действий:

1) Инициализация;
2) Команда ROM (за которым следует необходимый обмен данными);
3) Функциональная команда датчика (за которой следует необходимый обмен данными).

Если какой либо шаг при обращении к датчику отсутствует – датчик не будет реагировать. Исключение составляют команды Search ROM [ F 0 h ] и Alarm Search [ ECh ] , после их выполнения мастер должен вернуться к первому шагу управляющей последовательности.

Итак. Все транзакции начинаются с инициализации. Эта операция сопровождается выработкой ведущим устройством импульса сброса, на который ведомые устройства (в данном случае датчик(-и)) передают ведущему импульс присутствия, которые дают ему знать, что датчики подключены и готовы к работе.

Вообще интерфейсная шина 1-Wire, реализуемая в датчике, определяет несколько типов сигналов на линии данных: импульс сброса, импульс присутствия, запись 0, запись 1, чтение 0, чтение 1. Все эти операции реализует ведущее устройство, за исключением импульса присутствия. Его формирует только датчик(-и).

Итак, для начала ведущее устройство переходит в режим передатчика и устанавливает линию DQ в 0 на время не менее 480мкс (выделено жирным черным цветом). Это сбрасывает датчик. Затем линию необходимо отпустить, и перевести ведущее устройство в режим приемника, при этом подтягивающий резистор установит линию данных в высокий логический уровень (выделено тонким черным цветом). После того, как датчик почует нарастающий фронт, датчик выждет время 15-60мкс и своим аппаратным интерфейсом сбросит линию данных в 0, и будет ее держать в течение 60-240мкс. По истечении этого времени датчик отпустит линию и она установится в уровень логической 1 в течение не менее 480мкс после обнаружения датчиком импульса сброса.

Теперь поговорим о том, как осуществляется процесс передачи данных. Вообще, передачи бита. Дело в следующем. Берется отрезок времени, и в течение этого времени мастер смотрит, что там у нас на линии, допустим 1 – значит записали 1, если 0 – значит записали ноль. Но это только абстрактное объяснение. На самом деле там есть некоторые нюансы, связанные с временными рамками всего этого дела.

Смотрим картинки:

Все начинается с того, что ведущий должен опустить линию данный в низкий логический уровень, и с этого момента начинается слот записи/чтения 1/0, длящийся от 60 до 120мкс. Между слотами записи/чтения линия данных обязательно должна установиться в 1 на время, не меньшее времени восстановления (1мкс). Для организации слота записи 0 необходимо все время слота держать линию данных в 0, если же необходимо записать в датчик 1, то сначала сбрасываем линию данных в 0, затем ждем не менее 1мкс и отпускаем линию в 1, в течение слота записи 1 (60-120мкс) будет записана 1 в датчик (см. верхний правый рисунок).

Собственно говоря, если в течение 15-60мкс после старта будет обнаружена 1 на линии данных, то запишется 1, а если в течение 60-240мкс обнаружится 0 – то и запишется 0.

Чтение данных сопровождается ведущим устройством, когда он сбрасывает линию, ждет не менее 1мкс, и в течение 15мкс смотрит, что на линии творится: если остался 0, то датчик передает 0, если переключилась в 1, - то и передалась 1.

Команды.

ROM-команды.

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

SEARCH ROM

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

READ ROM

Эта команда используется только тогда, когда на шине имеется лишь один датчик. Это позволяет ведущему устройству считать содержимое 64 бит ROM-памяти не используя команду ее поиска. А если же вы попробуете использовать эту команду при подключенном количестве датчиков, более 1, все они начнут передавать содержимое этой памяти, что приведет к нежелательным последствиям.

MATCH ROM

Это команда соответствия ROM. Мастер выпускает 64 бита соответствующей памяти ROM подключенного к шине датчика, и там уже определяется, что с ним делать (измерить температуру, и т.д.). Другие датчики на шине будут в это время ждать своей очереди.

SKIP ROM

Это команда пропуска ROM. Не принимает в расчет адрес какого-либо конкретного датчика на шине, а обращается сразу ко всем. После этой команды, можно выдать, например, команду преобразования температуры, и все датчики начнут преобразование. Однако вывести команду чтения памяти после вызова этой команды приведет к непредсказуемым результатам (потому что сразу все датчики будут передавать данные). Значит, только при одном подключенном датчике возможна такая ситуация.

ALARM SEARCH

Эта команда идентична первой в этой таблице за исключением того, что осуществляет поиск датчиков на шине с установленным флагом тревоги.

Функциональные команды.

Эти команды осуществляют функциональные операции каких либо процессов, например, запуск операции преобразования температуры, копирование памяти и т.д. Всего команд 6, разрядность каждой 8бит.

CONVERT T

Запуск преобразования температуры. После выполнения этой команды 2-байтные данные заносятся в регистр температуры.

WRITE SCRATCHPAD

Записывает данные в регистры 2-4 начиная со второго, младшим битом вперед. Во время передачи данные в три регистра необходимо следить, чтобы мастер не сбросил датчики, потому что возможна потеря данных.

READ SCRATCHPAD

Инициирует процесс передачи данных всех регистров памяти scratchpad, начиная с младшего бита байта 0 и заканчивая старшим битом байта 8 (CRC).

COPY SCRATCHPAD

Эта команда копирует содержимое регистров байта 2, 3 и 4 в соответствующие EEPROM-ячейки.

RECALL E 2

Эта команда копирует данные из EEPROM в соответствующие места в блокнотной памяти scratchpad. Как отмечалось ранее, при включении питания эта операция происходит автоматически.

READ POWER SUPPLY

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

Принципиальная схема устройства:

Сборочный чертеж печатной платы (извиняюсь за качество, делал лишь бы работало, для отладки):

Не забудьте правильно отзеркалить плату

Поскольку это макетка, я вытащил ее из старого проекта, поэтому на плате, приведенной выше – немного не то, что у меня (на своей я сейчас убрал все лишнее и оно стало точь-в-точь как на рисунках выше).

Вот что вышло у меня:

Получился этакий бутерброд

Исходный код программы был написан в среде разработки . Я не старался использовать максимум готовых библиотек avr-gcc компилятора, а писал все, как говорится, «от руки». Моя цель – это не демонстрация виртуозного владения Си, а всего лишь пример, написанный за час, способный предоставить новичкам общее представление по работе с датчиком.
Устройство предназначено для использования в комнате, поэтому не предусматривает измерение отрицательных температур.

Скачать исходники и печатную плату LAY вы можете ниже

Все дополнительные вопросы, пожелания жду по адресу: [email protected]

Вам необходимо измерить температуру в неблагоприятной для микросхем среде?

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

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

Разрешение показаний настраивается и может составлять от 9 до 12 бит. Меньше разрешение - выше скорость преобразования.

Подключение

Герметичный датчик на основе микросхемы DS18B20 можно подключить двумя способами:

По трём проводам: питание (красный), земля (чёрный) и сигнал (белый).

По двум проводам: земля и сигнал. В этом случае датчик изредка может давать неверные показания, которые легко исключить из конечного результата фильтрацией.

Независимо от способа подключения, сигнальный провод необходимо соединить с питанием через резистор 4,7 кОм. При подключении только одного датчика, подойдёт и резистор на 10 кОм.

Для подключения датчика к Arduino или к макетной плате удобно будет использовать нажимной клеммник.

Для подключения 1-Wire устройств к Arduino существует готовая библиотека, а для работы именно с DS18B20 существует библиотека-надстройка от Майлса Бёртона.

Характеристики:
  • Напряжение питания: 3.0..5.5 В
  • Диапазон температур: -55°C..+125°C
  • Точность показаний температуры: 0.5 °С
  • Шаг показаний: 0.0625 °С
  • Интерфейс: 1-Wire
  • Длинна провода: 1 метр
  • Потребляемый ток: 1мА

В двух предыдущих статьях мы рассмотрели и . В этой статье мы рассмотрим схему подключения одного или нескольких датчиков к микроконтроллеру и программирование работы МК с датчиком (датчиками) по шине 1-Wire с внешним питанием

Типовая схема подключения датчиков DS18B20 к микроконтроллеру:


Как видно из схемы, датчик DS18B20 (или датчики) подключаются к микроконтроллеру, если они имеют общее питание, тремя проводниками:
— вывод №1 — общий провод (масса, земля)
— вывод №2 — он же DQ , по которому происходит общение между МК и DS18B20, подключается к любому выводу любого порта МК. Вывод DQ обязательно должен быть «подтянут» через резистор к плюсу питания
— вывод №3 — питание датчика — +5 вольт
Если в устройстве используется несколько датчиков температуры, то их можно подключить к разным выводам порта МК, но тогда увеличится объем программы. Датчики лучше подключать как показано на схеме — параллельно, к одному выводу порта МК.
Напомню о величине подтягивающего резистора:
«Сопротивление резистора надо выбирать из компромисса между сопротивлением используемого кабеля и внешними помехами. Сопротивление резистора может быть от 5,1 до 1 кОм. Для кабелей с высоким сопротивлением жил надо использовать более высокое сопротивление. А там где присутствуют промышленные помехи – выбирать более низкое сопротивление и использовать кабель с более большим сечением провода. Для телефонной лапши (4 жилы) для 100 метров необходим резистор 3,3 кОм. Если вы применяете «витую пару» даже 2 категории длина может быть увеличена да 300 метров»

Программирование работы микроконтроллера с датчиком DS18B20

Как происходит общение датчика DS18B20 с микроконтроллером мы рассмотрим используя даташит датчика и программу Algorithm Builder.

Последовательность операций общения
ОЧЕНЬ ВАЖНО следовать установленной последовательности (которая состоит из трех пунктов) каждый раз при обращении к DS18B20:
1. Инициализация
2. Команда ROM
3. Функциональная команда DS18B20
Только две команды выполняется в два шага: Поиск ROM и Поиск Аварии .

Инициализация DS18B20

Последовательность выполнения инициализации состоит из двух частей:
— импульс сброса — который формирует микроконтроллер
— импульс присутствия — который формирует DS18B20
Исходное состояние шины DQ, по которой происходит общение МК и датчика, — логическая 1, так как шина DQ «подтянута» через резистор к питанию.
По состоянию шины DQ можно определить подключен ли датчик к микроконтроллеру:
— если на шине логическая 1 — значит датчик подключен
— если не логическая 1 — значит датчик не подключен (или забыли подключить, или обрыв линии DQ)
Поэтому, последовательность выполнения инициализации можно дополнить еще одним пунктом — проверка подключения датчика. Но учтите, что эту проверку можно провести только при одном датчике.

Проверяем подключение датчика DS18B20:

Где:
— INI_DS18B20 — подпрограмма инициализации
— DQ_Pin — имя, которое я присвоил, разряду порта к которому подключен датчик (если смотреть по схеме, то это вывод PB0 порта В)
— DQ_Pin=1 — проверка подключения датчика — если на выводе DQ_Pin логическая единица то переходим по стрелке, если нет, то:
— 1—> Term_Error , где Term_Error — переменная в которую записывается код ошибки, в данном случае «1»
— Show_Term_Error — переход к подпрограмме вывода ошибки на дисплей
К примеру, при использовании трехразрядного семисегментного дисплея, можно вывести такую строчку:
— Er1 , что означает — возникла ошибка, код ошибки-1 (датчик не подключен)

Теперь заглянем в даташит датчика и посмотрим временной график процедуры инициализации:


Переводим график в слова:
1. Исходный уровень шины DQ — логическая единица (за счет подтягивающего резистора)
2. Микроконтроллер формирует импульс сброса:
— МК переводит шину DQ в состоянии логического нуля на время не менее 480 микросекунд
— МК отпускает шину (переводим вывод в режим приема), при этом шина DQ опять переходит в состоянии логической единицы
3. DS18B20 обнаружив перепад уровня на шине (с логического нуля на логическую единицу) через 15-60 микросекунд передает импульс присутствия — переводит шину DQ в состояние логического нуля на длительность 60-240 микросекунд
4. По завершению импульса присутствия DS18B20 возвращает шину DQ в уровень логической единицы (судя по графику — через 480 микросекунд, от окончания импульса сброса, шина должна стопроцентно вернуться в уровень логической единицы)

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


На графике указаны минимальные временные характеристики, поэтому в программе они несколько завышены или взяты максимальные (из минимальных) значения:
— импульс сброса от МК — не 480 а 500 микросекунд
— пауза от окончания импульса сброса до импульса присутствия — 60 микросекунд
— возврат шины в состояние логической единицы после импульса присутствия через 420 микросекунд
Я надеюсь с первым вопросом — ИНИЦИАЛИЗАЦИЯ, мы разобрались
Переходим к следующему шагу обязательной последовательности — «Команда ROM»

Команда ROM

Следующим шагом нашего общения с DS18B20 мы должны подать ему нужную команду ROM
Напоминаю, что команд ROM всего пять:
1. Поиск ROM — может применяется (а может и не применяться, я, к примеру, ее в большинстве случаев не использую) в случае применения нескольких датчиков или других устройств общающихся с МК по шине 1-Wire
2. Чтение ROM — применяется при одном подключенном датчике для считывания его 64-битного кода
3. Соответствие ROM — применяется в случае если датчиков более одного для обращения к конкретному датчику
4. Пропуск ROM — команда используется для обращения сразу ко всем датчикам (устройствам) подключенным к МК. Практически применяется для подачи функциональной команды на конвертирование температуры (определение температуры) всеми подключенными датчиками одновременно
5. Поиск тревоги — если мы задали DS18B20 верхний и нижний предел температуры, которые нам нужно контролировать. В этом случае нам ответят только те датчики измеренная температура которыми соответствует заданным пределам

Каждая команда ROM имеет шестнадцатиразрядный код (также как и функциональные команды), поэтому для удобства в программе очень можно определить константы, которые имеют понятные названия команд, к примеру:


В этой таблице заданы константы нужных мне для работы с датчиками команд.
После первого шага — ИНИЦИАЛИЗАЦИЯ, и передачи датчику DS18B20 команды ROM, датчик готов выполнить функциональную команду.
В предыдущей статье я подробно рассказал и о командах ROM, и о функциональных командах, повторяться не буду (я про функциональные команды).

Два примера алгоритма работы с DS18B20:
1. При использовании одного датчика:
— выполняем инициализацию

— подаем датчику функциональную команду — «Конвертировать температуру» (измерить температуру)
В процессе конвертирования контролируем работу датчика — если на шине ноль, то конвертирование не закончилось, если на шине логическая единица — конвертирование закончено.
Теперь можно считать температуру с датчика:
— выполняем инициализацию
— подаем датчику команду ROM — «Пропуск ROM»
— подаем датчику функциональную команду — «Чтение памяти»
По команде «чтение памяти» датчик начинает передачу данных из своей памяти — все девять байт. Но нам нужны только первые два байта — в них записана текущая измеренная датчиком температура. Поэтому считываем только два первых байта и выходим из подпрограммы.

Датчик температуры в Arduino – один из самых распространенных видов сенсоров. Разработчику проектов с термометрами на Arduino доступно множество разных вариантов, отличающихся по принципу действия, точности, конструктивному исполнению. Цифровой датчик DS18B20 является одним из наиболее популярных температурных датчиков, часто он используется в водонепроницаемом корпусе для измерения температуры воды или других жидкостей. В этой статье вы найдете описание датчика ds18b20 на русском, мы вместе рассмотрим особенности подключения к ардуино, принцип работы датчика, описание библиотек и скетчей.

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

Температурный датчик DS18B20 имеет разнообразные виды корпуса. Можно выбрать один из трех – 8-Pin SO (150 mils), 8-Pin µSOP, и 3-Pin TO-92. Последний является наиболее распространенным и изготавливается в специальном влагозащитном корпусе, так что его смело можно использовать под водой. У каждого датчика есть 3 контакта. Для корпуса TO-92 нужно смотреть на цвет проводов: черный – земля, красный – питание и белый/желтый/синий – сигнал. В интернет-магазинах можно купить готовый модуль DS18B20.

Где купить датчик

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

Память датчика состоит из двух видов: оперативной и энергонезависимой – SRAM и EEPROM. В последнюю записываются регистры конфигурации и регистры TH, TL, которые могут использоваться как регистры общего назначения, если не используются для указания диапазона допустимых значений температуры.

Основной задачей DS18B20 является определение температуры и преобразование полученного результата в цифровой вид. Мы можем самостоятельно задать необходимое разрешение, установив количество бит точности – 9, 10, 11 и 12. В этих случаях разрешающие способности будут соответственно равны 0,5С, 0,25С, 0,125С и 0,0625С.

Полученные температурные измерения сохраняются в SRAM датчика. 1 и 2 байты сохраняют полученное значение температуры, 3 и 4 сохраняют пределы измерения, 5 и 6 зарезервированы, 7 и 8 используются для высокоточного определения температуры, последний 9 байт хранит устойчивый к помехам CRC код.

Подключение DS18B20 к Arduino

DS18B20 является цифровым датчиком. Цифровые датчики передают значение измеряемой температуры в виде определенного двоичного кода, который поступает на цифровые или аналоговые пины ардуино и затем декодируется. Коды могут быть самыми разными, ds18b20 работает по протоколу данных 1-Wire. Мы не будем вдаваться в подробности этого цифрового протокола, укажем лишь необходимый минимум для понимания принципов взаимодействия.

Обмен информацией в 1-Wire происходит благодаря следующим операциям:

  • Инициализация – определение последовательности сигналов, с которых начинается измерение и другие операции. Ведущее устройство подает импульс сброса, после этого датчик должен подать импульс присутствия, сообщающий о готовности к выполнению операции.
  • Запись данных – происходит передача байта данных в датчик.
  • Чтение данных – происходит прием байта из датчика.

Для работы с датчиком нам понадобится программное обеспечение:

  • Arduino IDE;
  • Библиотека OneWire, если используется несколько датчиков на шине, можно использовать библиотеку DallasTemperature. Она будет работать поверх OneWire.

Из оборудования понадобятся:

  • Один или несколько датчиков DS18B20;
  • Микроконтроллер Ардуино;
  • Коннекторы;
  • Резистор на 4,7 кОм (в случае подключения одного датчика пойдет резистор номиналом от 4 до 10K);
  • Монтажная плата;
  • USB-кабель для подключения к компьютеру.

К плате Ардуино UNO датчик подключается просто: GND с термодатчика присоединяется к GND Ардуино, Vdd подключается к 5V, Data – к любому цифровому пину.

Простейшая схема подключения цифрового датчика DS18B20 представлена на рисунке.

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

  • Определение адреса датчика, проверка его подключения.
  • На датчик подается команда с требованием прочитать температуру и выложить измеренное значение в регистр. Процедура происходит дольше остальных, на нее необходимо примерно 750 мс.
  • Подается команда на чтение информации из регистра и отправка полученного значения в «монитор порта»,
  • Если требуется, то производится конвертация в градусы Цельсия/Фаренгейта.

Пример простого скетча для DS18B20

Самый простой скетч для работы с цифровым датчиком выглядит следующим образом. (в скетче мы используем библиотеку OneWire, о которой поговорим подробнее чуть позже).

#include /* * Описание взаимодействия с цифровым датчиком ds18b20 * Подключение ds18b20 к ардуино через пин 8 */ OneWire ds(8); // Создаем объект OneWire для шины 1-Wire, с помощью которого будет осуществляться работа с датчиком void setup(){ Serial.begin(9600); } void loop(){ // Определяем температуру от датчика DS18b20 byte data; // Место для значения температуры ds.reset(); // Начинаем взаимодействие со сброса всех предыдущих команд и параметров ds.write(0xCC); // Даем датчику DS18b20 команду пропустить поиск по адресу. В нашем случае только одно устрйоство ds.write(0x44); // Даем датчику DS18b20 команду измерить температуру. Само значение температуры мы еще не получаем - датчик его положит во внутреннюю память delay(1000); // Микросхема измеряет температуру, а мы ждем. ds.reset(); // Теперь готовимся получить значение измеренной температуры ds.write(0xCC); ds.write(0xBE); // Просим передать нам значение регистров со значением температуры // Получаем и считываем ответ data = ds.read(); // Читаем младший байт значения температуры data = ds.read(); // А теперь старший // Формируем итоговое значение: // - сперва "склеиваем" значение, // - затем умножаем его на коэффициент, соответсвующий разрешающей способности (для 12 бит по умолчанию - это 0,0625) float temperature = ((data << 8) | data) * 0.0625; // Выводим полученное значение температуры в монитор порта Serial.println(temperature); }

Скетч для работы с датчиком ds18b20 без delay

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

#include OneWire ds(8); // Объект OneWire int temperature = 0; // Глобальная переменная для хранения значение температуры с датчика DS18B20 long lastUpdateTime = 0; // Переменная для хранения времени последнего считывания с датчика const int TEMP_UPDATE_TIME = 1000; // Определяем периодичность проверок void setup(){ Serial.begin(9600); } void loop(){ detectTemperature(); // Определяем температуру от датчика DS18b20 Serial.println(temperature); // Выводим полученное значение температуры // Т.к. переменная temperature имеет тип int, дробная часть будет просто отбрасываться } int detectTemperature(){ byte data; ds.reset(); ds.write(0xCC); ds.write(0x44); if (millis() - lastUpdateTime > TEMP_UPDATE_TIME) { lastUpdateTime = millis(); ds.reset(); ds.write(0xCC); ds.write(0xBE); data = ds.read(); data = ds.read(); // Формируем значение temperature = (data << 8) + data; temperature = temperature >> 4; } }

Библиотека DallasTemperature и DS18b20

В своих скетчах мы можем использовать библиотеку DallasTemperature, упрощающую некоторые аспекты работы с датчиком ds18b20 по 1-Wire. Пример скетча:

#include // Номер пина Arduino с подключенным датчиком #define PIN_DS18B20 8 // Создаем объект OneWire OneWire oneWire(PIN_DS18B20); // Создаем объект DallasTemperature для работы с сенсорами, передавая ему ссылку на объект для работы с 1-Wire. DallasTemperature dallasSensors(&oneWire); // Специальный объект для хранения адреса устройства DeviceAddress sensorAddress; void loop(void){ // Запрос на измерения датчиком температуры Serial.print("Измеряем температуру..."); dallasSensors.requestTemperatures(); // Просим ds18b20 собрать данные Serial.println("Выполнено"); // Запрос на получение сохраненного значения температуры printTemperature(sensorAddress); // Задержка для того, чтобы можно было что-то разобрать на экране delay(1000); } // Вспомогательная функция печати значения температуры для устрйоства void printTemperature(DeviceAddress deviceAddress){ float tempC = dallasSensors.getTempC(deviceAddress); Serial.print("Temp C: "); Serial.println(tempC); } // Вспомогательная функция для отображения адреса датчика ds18b20 void printAddress(DeviceAddress deviceAddress){ for (uint8_t i = 0; i < 8; i++) { if (deviceAddress[i] < 16) Serial.print("0"); Serial.print(deviceAddress[i], HEX); } }

Библиотека OneWire для работы с DS18B20

DS18B20 использует для обмена информацией с ардуино протокол 1-Wire, для которого уже написана отличная библиотека. Можно и нужно использовать ее, чтобы не реализовывать все функции вручную. . Для установки библиотеки скачайте архив, распакуйте в папку library вашего каталога Arduino. Подключается библиотека с помощью команды #include

Все датчики DS18B20 подключаются параллельно, для них всех достаточно одного резистора. При помощи библиотеки OneWire можно одновременно считать все данные со всех датчиков. Если количество подключаемых датчиков более 10, нужно подобрать резистор с сопротивлением не более 1,6 кОм. Также для более точного измерения температуры нужно поставить дополнительный резистор на 100…120 Ом между выходом data на плате Ардуино и data на каждом датчике. Узнать, с какого датчика получено то или иное значение, можно с помощью уникального серийного 64-битного кода, который будет выдан в результате выполнения программы.

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

Выводы

Микросхема Dallas DS18B20 является очень интересным устройством. Датчики температуры и термометры, созданные на ее основе, обладают приемлемыми для большинства задач характеристиками, развитым функционалом, относительно не дороги. Особенную популярность датчик DS18B20 снискал как влагозащищенное устройство для измерения температуры жидкостей.

За дополнительные возможности приходится платить относительной сложностью работы с датчиком. Для подключения DS18B20 нам обязательно понадобится резистор с номиналом около 5К. Для работы с датчиком в скетчах ардуино нужно установить дополнительную библиотеку и получить определенные навыки для работы с ней – там все не совсем тривиально. Впрочем, можно купить уже готовый модуль, а для скетча в большинстве случаев хватит простых примеров, приведенных в этой статье.