Меню

1 wire датчики температуры подключение

Взаимодействие DS18B20, однопроводного (1-Wire) цифрового датчика температуры, с Arduino

Один из самых простых и недорогих способов добавить измерение температуры в ваш проект на Arduino – использовать однопроводный датчик температуры DS18B20. Эти датчики достаточно точны и не требуют для работы никаких внешних компонентов. Таким образом, с помощью всего нескольких соединений и некоторого кода Arduino вы измерите температуру в кратчайшие сроки!

Взаимодействие DS18B20, однопроводного (1-Wire) цифрового датчика температуры, с Arduino

DS18B20 – однопроводной датчик температуры

DS18B20 – это датчик температуры с однопроводным интерфейсом 1-Wire, изготовленный Dallas Semiconductor Corp. Уникальный интерфейс 1-Wire® требует только одного цифрового контакта для двухсторонней связи с микроконтроллером.

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

Рисунок 1 – Типы датчиков температуры DS18B20

Датчик температуры DS18B20 достаточно точный и не требует для работы внешних компонентов. Он может измерять температуру от -55°C до +125°C с точностью ±0,5°C.

Разрешение датчика температуры настраивается пользователем до 9, 10, 11 или 12 бит. Однако разрешение по умолчанию при включении питания составляет 12 бит (то есть соответствует точности 0,0625°C).

Датчик может питаться от источника напряжения от 3 В до 5,5 В и потреблять всего 1 мА во время активных преобразований температуры.

Характеристики датчика температуры DS18B20

Напряжение питания от 3 В до 5,5 В
Потребляемый ток 1мА
Диапазон температур от -55°C до 125°C
Точность ±0,5°С
Разрешение от 9 до 12 бит (выбирается)
Время преобразования Рисунок 2 – Распиновка датчика температуры DS18B20 в корпусе TO-92 и в водонепроницаемом корпусе

DQ – это шина данных 1-Wire, которая должна быть подключена к цифровому выводу микроконтроллера.

Вывод VDD подает питание на датчик, которое может быть от 3,3 до 5 В.

Подключение датчика температуры DS18B20 к Arduino

Достаточно теории, давайте практиковаться! Давайте подключим DS18B20 к Arduino.

Подключение довольно простое. Начните с подключения VDD к 5V выходу на Arduino, и GND – к земле.

Затем подключите оставшийся цифровой сигнальный вывод DQ к цифровому выводу 2 на Arduino. Вам также необходимо добавить подтягивающий резистор 4,7 кОм между сигнальным выводом и выводом питания, чтобы обеспечить стабильную передачу данных (внутренние подтягивающие резисторы на ардуино не работают).

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

Рисунок 3 – Подключение датчика температуры DS18B20 к Arduino

Если вы используете водонепроницаемую версию DS18B20, подключите красный провод к 5V, черный провод соединится с землей, а желтый провод – данные, которые поступают на цифровой вывод 2 на Arduino. Вам всё еще нужно подключить подтягивающий резистор 4,7 кОм между линией данных и шиной 5 В.

Рисунок 4 – Подключение водонепроницаемого датчика температуры DS18B20 к Arduino

Установка библиотеки для DS18B20

Протокол Dallas 1-Wire несколько сложен и требует много кода для парсинга связи. Чтобы скрыть эту ненужную сложность, мы установим библиотеку DallasTemperature.h, чтобы мы могли выполнять простые команды для получения показаний температуры от датчика.

Чтобы установить библиотеку, перейдите в раздел «Скетч»→ «Подключить библиотеку» → «Управление библиотеками…». Подождите, пока менеджер библиотеки загрузит индекс библиотек и обновит список установленных библиотек.

Рисунок 5 – Установка библиотеки Arduino – выбор управления библиотеками в Arduino IDE

Чтобы отфильтровать результаты поиска, введите « ds18b20 ». Там должна быть пара записей. Ищите DallasTemperature от Miles Burton. Нажмите на эту запись, а затем выберите Установка.

Рисунок 6 – Установка библиотеки DallasTemperature в Arduino IDE

Эта библиотека DallasTemperature является аппаратно-зависимой библиотекой, которая обрабатывает функции более низкого уровня. Она должна быть связана с библиотекой OneWire для связи с любым устройством 1-Wire, а не только с DS18B20. Установите и эту библиотеку.

Рисунок 7 – Установка библиотеки OneWire в Arduino IDE

Код для Arduino

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

Вот как выглядит вывод в мониторе последовательного порта.

Рисунок 8 – Вывод показаний датчика температуры DS18B20 в мониторе последовательного порта

Объяснение кода:

Скетч начинается с включения библиотек OneWire.h и DallasTemperature.h и объявления вывода Arduino, к которому подключен сигнальный вывод датчика.

Затем мы создаем объект OneWire , передавая сигнальный вывод датчика его конструктору. Этот объект OneWire позволяет нам общаться с любым устройством 1-Wire, а не только с DS18B20. Для связи с датчиком DS18B20 нам нужно создать объект библиотеки DallasTemperature и передать ему ссылку на объект OneWire в качестве параметра.

Как только объект DallasTemperature создан, мы можем выполнять для взаимодействия с датчиком простые команды, приведенные ниже.

  • Функция begin() ищет подключенные датчики на шине и устанавливает битовое разрешение (12 бит) для каждого.
  • Функция requestTemperatures() отправляет команду для всех датчиков на шине, чтобы выполнить преобразование температуры.
  • Функция getTempCByIndex(deviceIndex) считывает и возвращает показания температуры с датчика. deviceIndex – это не что иное, как расположение датчика на шине. Если вы используете только один DS18B20 на шине, установите этот параметр на 0.

Другие полезные функции в библиотеке DallasTemperature.h

Есть еще несколько полезных функций, которые вы можете использовать с объектом DallasTemperature . Несколько из них перечислены ниже:

  • Функция setResolution() устанавливает разрешение внутреннего аналого-цифрового преобразователя DS18B20 на значение 9, 10, 11 или 12 бит, что соответствует шагу температуры 0,5°C, 0,25°C, 0,125°C и 0,0625°C соответственно ,
  • Функция bool getWaitForConversion() возвращает значение флага waitForConversion . Это может быть полезно, когда вы хотите проверить, завершено ли преобразование температуры.
  • Функции setHighAlarmTemp() и setLowAlarmTemp() устанавливают внутренние пороги тревоги высокой и низкой температуры для устройства в градусах Цельсия. Допустимый диапазон от -55°C до +125°C
  • Функция bool hasAlarm() возвращает true , если устройство имеет состояние тревоги, когда температура выходит за пределы диапазона между верхним и нижним уровнями тревоги.

Источник

Немного про шину 1-Wire и цифровой термометр DS18b20

Содержание / Contents

↑ 1-Wire

Потребовалось мне узнать температуру радиатора в усилителе и как нельзя кстати в закромах была ATMega8 и DS18b20 – цифрой датчик температуры с протоколом 1-wire. Запустил CODEVISIONAVR, взял функции из стандартных библиотек, прошил, запустил и… датчик нагло врал на 3-5 градусов, я сравнивал с пирометром и комнатным термометром. В чем причина безобразия я не понял и решил сам написать все процедуры обмена данными, а заодно и изучить данную шину.

1-Wire — двунаправленная шина связи для устройств с низкоскоростной передачей данных подробнее можно почитать на Wikipedia

↑ Что нужно запомнить

  1. Передача данных и сигналов синхронизации происходит по одному проводу.
  2. Передачу данных всегда инициализирует МК.
  3. Биты данных передаются тайм-слотами со строго ограниченными временными рамками.
  4. На одной шине может находиться несколько устройств.
  5. У каждого устройства есть свой уникальный ROM код.

↑ Начинаем передачу

Для дальнейшей работы с шиной у нас должна быть подключена библиотека delay.h и определены три дефайна.

Прежде чем общаться с датчиком МК необходимо убедиться, что на проводе собственно присутствует устройство 1-wire. Для этого есть процедура инициализации. Взглянем на ее диаграмму 1 из даташита на датчик.

Что должно происходить:

  1. МК генерирует сигнала reset, удерживая шину в 0 состоянии в течении 480 микросекунд.
  2. Ждем не менее 15, но не боле 60 микросекунд. За это время подтягивающий резистор должен поднять уровень на шине до логической единицы.
  3. Датчик удерживает шину в нулевом состоянии в течении не менее 60 микросекунд. Если за это время шина не смени свое состояние на 0 значит на шине ошибки или датчик не исправен (Долго не мог понять, в чем дело, когда отпаялся подтягивающий резистор и на шине всегда считывался 0).

Данная функция возвращает 0 если все в порядке и 1 если нет.

↑ Обмениваемся данными

Передаем «0». Что должно происходит:

  1. МК удерживает шину в 0 состоянии в течении 60 микросекунд.
  2. МК отпускает шину давая резистору подтяжки делать свое дело.

Передаем «1». Что должно происходить:

  1. МК удерживает шину в 0 состоянии в течении 15 микросекунд.
  2. МК отпускает шину.

Чтобы передать байт данных необходимо инициализировать 8 тайм слотов соответственно. Передача (и чтение тоже) начинается с младшего разряда.
Функция передачи байта данных:

Чтение данных немного сложнее. Что должно происходит:

  1. МК удерживает шину в 0 состоянии в течении 1 микросекунд.
  2. МК отпускает шину.
  3. ждем завершения переходных процессов 14 микросекунд.
  4. МК считывает состояние шины.
  5. Ждем еще 45 микросекунд до конца тайм слота.

Как и при записи для чтения одного байта необходимо 8 тайм слотов.
Функция чтения:

Мы научились читать и передавать байты, но для работы этого еще мало.
В связи с тем, что шина однопроводная и на ней может быть несколько устройств, возможны ошибки при передаче данных. Что бы поверить целостность данных необходимо проверить контрольную сумму. Существует два метода подсчета контрольной суммы – алгоритмический и табличный. Алгоритм не самый тривиальный и я решил использовать табличный.
Нашел на просторах интернета уже вычисленные сигнатуры. Определим их в массив и заведем переменную:

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

↑ Общение с датчиком

Существует ряд общих команд для всех 1-wire устройств. Среди них:

  • 0x33h – считать ромкод (уникальное имя каждого устройства). Применение возможно только, если на шине всего одно устройство.
  • 0x55h – обратиться по ром коду к конкретному устройству. После необходимо также передать 64 битный ром код. Только устройство у которого переданный код совпадет с записанным в него на заводе останется на шине, остальные отключатся.
  • 0xCCh — После приема данной команды все устройства останутся активными на шине. Удобно использовать если устройство одно или есть однотипные.

Несколько команд для DS’ ки:

  • 0x44h – Запуск преобразования температуры. Если датчик питает не от линии данных, то после можно прочитать состояние шины 0 – если преобразование не завершено и 1 – если преобразование завершено.
  • 0xBEh – Считать 8 байт данных. Первые два байта – вычисленная температура.
  • 0x4Eh – запись в память датчика. Необходимо передать три байта – верхнюю границу термостата, нижнюю границу термостата и значение контрольного регистра.

В контрольном регистре задается разрешение термометра от 9 до 12 бит. В зависимости от разрешения сильно меняется время преобразования.

  • 0x1Fh — 9 бит (±0,5 градуса Цельсия), преобразование примерно 94 миллисекунды;
  • 0x3Fh — 10 бит (±0,25 градуса Цельсия), преобразование примерно 188 миллисекунд;
  • 0x5Fh — 11 бит (±0,125 градуса Цельсия), преобразование примерно 375 миллисекунд;
  • 0x7Fh — 12 бит (±0,0625 градуса Цельсия), преобразование примерно 750 миллисекунд;

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

В комментария выше фигурирует слово «термостат». DS18B20 — имеет такую функцию. Если после преобразования температура окажется ниже Tlow или выше Th, установиться флаг alarm. Есть команда ALARM SEARCH [0xECh] на нее отзываться только устройства с установленным флагом аварии. Функция поиска — довольно медленная. Ее использование актуально, на мой взгляд, толь при большом количестве датчиков.

Считываем температуру. Если датчик у нас не один то обращаться придется по rom коду, который вначале необходимо считать

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

Функция выдачи ром кода на шину:

И наконец чтение температуры с датчика с номером DSnum:

функция возвращает целое значение температуры, если она была положительная и 0 если были ошибки при чтении.

↑ Файлы

Даташит на DS18B20: 🎁 DS18B20.pdf 528.7 Kb ⇣ 68

Многие моменты, например, использование команды «SEARCH ROM» — поиск устройств на шине, или чтение температуры с большей точностью я не осветил потому, что такой необходимости у меня не было. Надеюсь моя работа окажется для кого-то полезной.

Камрад, рассмотри датагорские рекомендации

🌼 Полезные и проверенные железяки, можно брать

Опробовано в лаборатории редакции или читателями.

Источник

Читайте также:  Датчик количества бензина ваз 2110
Adblock
detector