Считываем показания датчика ds18b20 (ds18s20)

Содержание

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

Цифровой датчик DS18B20 измерит температуру в воде, на земле и даже в космосе.

Датчик способен считывать показания температуры в диапазоне от −55 до +125 °C и передавать данные на управляющую плату всего через один пин.

Примеры работы для Arduino

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

Один датчик

Рассмотрим простой пример — подключения одного датчика.

Схема подключения

Сенсор подключается к управляющей плате через один сигнальный пин. При подключении к Arduino в компактном формфакторе, например Arduino Micro или Iskra Nano Pro, воспользуйтесь макетной платой и парочкой нажимных клеммников.

Между сигнальным проводом и питанием установите сопротивление 4,7 кОм.

При коммуникации сенсора со стандартными платами Arduino формата Rev3, Arduino Uno или Iskra Neo, используйте Troyka Slot Shield совместно с модулем подтяжки.

Код программы

Выведем температуру сенсора в Serial-порт.

Серия датчиков

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

Схема подключения

Добавим к предыдущем схемам подключения ещё по паре датчиков в параллель.

Код программы

Просканируем все устройства на шине 1-Wire и выведем температуру каждого сенсора отдельно в Serial-порт.

Примеры работы для Espruino

Один датчик

Рассмотрим простой пример — подключения одного датчика.

Схема подключения

Сенсор подключается к управляющей плате через один сигнальный пин. При подключении к Iskra в компактном формфакторе, например Iskra JS Mini, воспользуйтесь макетной платой и парочкой нажимных клеммников.

Между сигнальным проводом и питанием установите сопротивление 4,7 кОм.

При коммуникации сенсора с платой Iskra JS, используйте Troyka Slot Shield совместно с модулем подтяжки.

Код программы

Выведем температуру сенсора в консоль Espruino Web IDE.

Серия датчиков

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

Схема подключения

Добавим к предыдущем схемам подключения ещё по паре датчиков в параллель.

Код программы

Найдём все устройства на шине 1-Wire и выведем температуру каждого сенсора отдельно в Serial-порт.

Примеры работы для Raspberry Pi

Один датчик

Считаем данные с датчика одноплатником Raspberry Pi. Подключите сенсор к 4 пину Raspberry через модуль подтяжки. Для избежания макеток и проводов используйте плату расширения Troyka Cap.

Схема подключения

Код программы

Считаем данные с датчика одноплатником Raspberry Pi. Подключите сенсор к 4 пину Raspberry через модуль подтяжки. Для избежания макеток и проводов используйте плату расширения Troyka Cap.

Серия датчиков

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

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

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

Мы сделаем LCD-термометр или, как вариант, Serial-термометр (напечатает данные о температуре на последовательном мониторе Arduino IDE) на основе микроконтроллера Ардуино и цифрового датчика DS18B20, макетов, перемычек. Таким образом, вы сможете измерять температуру воздуха, жидкости, например, воды и температуру земли.

Информация о сенсоре DS18B20

DS18B20 – это цифровой температурный датчик с интерфейсом 1-Wire от Maxim IC. На выходе мы получаем информацию в Цельсиях с точностью от 9 до 12 бит, от -55 до 125 (+/- 0,5). Каждый датчик имеет уникальный 64-разрядный серийный номер, что позволяет использовать огромное количество датчиков на одной шине данных.

Особенности:

  • Для уникального интерфейса 1-Wire® требуется только один порт для связи.
  • Каждое устройство имеет уникальный 64-битный последовательный код, хранящийся в ПЗУ.
  • Многоточечная возможность упрощает использование распределенных температурных зондов.
  • Не требует внешних компонентов.
  • Может питаться от линии передачи данных.
  • Диапазон мощности от 3,0 до 5,5 В.
  • Измеряет температуру от -55°C до + 125°C (от -67 °F до + 257 °F) ± 0,5°C от -10°C до + 85°C.
  • Разрешение термометра выбирается пользователем от 9 до 12 бит.
  • Преобразует температуру в 12-битное цифровую переменную в 750 мс (макс.).
  • Определяемые пользователем энергонезависимые (NV) настройки сигнализации.
  • Команда поиска по тревоге идентифицирует и адресует устройства, температура которых находится за пределами запрограммированных пределов (состояние аварийной сигнализации).
  • Применяется в термостатических устройствах, промышленных системах, потребительских товарах, термометрах или в любых термических чувствительных системах.

Комплектующие

Чтобы сделать термометр, вам понадобятся следующие детали:

  • Плата Arduino (UNO, DUE, Micro и т.п.);
  • Датчик DS18B20 (водонепроницаемый или нет);
  • Резистор 4.7К (в некоторых магазинах продается датчик с резистором 4,7 тыс.);
  • ЖК-дисплей 16×2 с шиной I2C;
  • Макет;
  • Перемычки.

Из программного обеспечения нужно иметь установленную Arduino IDE.

Библиотеки

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

/Progam Files (x86)/Arduino/Libraries (по умолчанию):

  • 1- Wire шина;
  • Dallas Temperature (делает все вычисления и другие вещи);
  • Liquid Crystal I2C.

Все библиотеки вы можете скачать по ссылкам выше или на нашем сайте в разделе Библиотеки.

Термометр через последовательный монитор

Чтобы отобразить данные на последовательном мониторе, подключите датчик DS18B20 к Arduino, используя перемычки и макет, и не забудьте подключить или припаять резистор 4.7k между контактом 2 и 3 датчика.

Затем скачайте, откройте и загрузите файл .ino, который называется – DS18B20_Serial, ниже.

Если все в порядке, вы должны увидеть измеренную температуру на серийном мониторе Arduino IDE.

Термометр с ЖК-дисплеем

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

Подключите ЖК-дисплей I2C к контактам UNO:

Затем скачайте и загрузите файл .ino, который называется – DS18B20_I2C_LCD. Если все в порядке, вы увидите показания температуры на дисплее.

Arduino и цифровой датчик температуры DS18B20

DS18B20 – это цифровой датчик температуры. Датчик очень прост в использовании.

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

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

DS18B20 имеет различные форм-факторы. Так что выбор, какой именно использовать, остается за вами. Доступно три варианта: 8-Pin SO (150 mils), 8-Pin µSOP, и 3-Pin TO-92. Серфинг по eBay или Aliexpress показывает, что китайцы предлагают версию TO-92 во влагозащищенном корпусе. То есть, вы можете смело окунать подобное чудо в воду, использовать под дождем и т.д. и т.п. Эти сенсоры изготавливаются с тремя выходными контактами (черный – GND, красный – Vdd и белый – Data).

Различные форм-факторы датчиков DS18B20 приведены на рисунке ниже.

Модель DS18B20 во влагозащищенном корпусе:

DS18B20 удобен в использовании. Запитать его можно через контакт data (в таком случае вы используете всего два контакта из трех для подключения!). Сенсор работает в диапазоне напряжений от 3.0 В до 5.5 В и измеряет температуру в диапазоне от -55°C до +125°C (от -67°F до +257°F) с точностью ±0.5°C (от -10°C до +85°C).

Читайте также:  Как рассчитать обороты электродвигателя?

Еще одна крутая фича: вы можете подключить параллельно вплоть до 127 датчиков! и считывать показания температуры с каждого отдельно. Не совсем понятно, в каком проекте подобное может понадобится, но подключить два сенсора и контролировать температуру в холодильнике и морозильной камере можно. При этом вы оставите свободными кучу пинов на Arduino. В общем, фича приятная.

Что вам понадобится для контроля температуры с помощью Arduino и DS18B20

  • Естественно, вам необходима Arduino IDE;
  • Библиотека OneWire library, которая значительно облегчает работу с Arduino и датчиком DS18B20;
  • Скетч.

Скачать Arduino IDE можно с официального сайта Arduino.

Библиотеку OneWire Library можно скачать на OneWire Project Page (желательно скачивать последнюю версию библиотеки).

  • Как минимум один цифровой датчик температуры DS18B20;
  • Контроллер Arduino (в данном примере используется Arduino Uno);
  • 3 коннектора;
  • Монтажная плата (Breadboard);
  • USB кабель для подключения Arduino к персональному компьютеру.

Ссылки для заказа необходимого оборудования из Китая

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

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

Датчик подключается элементарно.

Контакт GND с DS18B20 подключается к GND на Arduino.

Контакт Vdd с DS18B20 подключается к +5V на Arduino.

Контакт Data с DS18B20 подключается к любому цифровому пину на Arduino. В данном примере используется пин 2.

Единственное, что необходимо добавить из внешней дополнительной обвязки – это подтягивающий резистор на 4.7 КОм.

Схема подключения DS18B20 к Arduino показана ниже (в скетче, который будет приведен ниже, проверьте строки 10 и 65. В них указаны пины, к которым вы подключали контакт сигнала с датчика и режим питания!):

На рисунке ниже приведена фотография нашей простой схемы “в жизни”.

Паразитное и обычное питание

Есть альтернативный вариант подключения – так называемое “паразитное” подключение. В этом случае мы не будем подключать пин +5V к пину Vdd на датчике DS18B20. Вместо этого мы подключим контакт Vdd с датчика DS18B20 к GND. Преимущества такого подключения очевидны: нам понадобится всего два коннектора!

Недостатком такого подключения является ограничение количества одновременно подключаемых сенсоров. Кабели для подключения должны быть максимально короткими!

В общем, с “паразитным” подключением надо быть аккуратнее и лучше его все-таки не использовать. Результаты (значения температур) могут оказаться самыми неожиданными.

Скетч для Arduino и сенсора DS18B20

Установливаем библиотеку OneWire Library

После того как вы скачали архив с библиотекой, ее надо импортировать. Для этого в Arduino IDE выберите пункт “Sketch” – “Import Library” – “Add Library” и выберите архив, который вы скачали. Если у вас возникли проблемы, с установкой библиотеки, ознакомьтесь с инструкцией по установке библиотек в Arduino.

Загружаем скетч на Arduino

Скетч, который представлен ниже, есть в библиотеке OneWire, в категории examples. Перейдите в “File” – “Examples” – “OneWire” и выберите пример “DS18x20_Temperature”. Код программы представлен ниже.

Данный пример использует библиотеку OneWire Library, для того, чтобы собрать данные со всех подключенных датчиков температуры DS28B20 (как подключить несколько сенсоров описано в конце статьи) и отобразить их в окне серийного монитора Arduino IDE.

В окне серийного монитора вы увидите примерно следующее:

ROM = 28 88 84 82 5 0 0 6A

Data = 1 56 1 4B 46 7F FF A 10 D1 CRC=D1

Temperature = 21.37 Celsius, 70.47 Fahrenheit

No more addresses.

ROM = 28 88 84 82 5 0 0 6A

Data = 1 56 1 4B 46 7F FF A 10 D1 CRC=D1

Temperature = 21.37 Celsius, 70.47 Fahrenheit

No more addresses.

ROM = 28 88 84 82 5 0 0 6A

Data = 1 56 1 4B 46 7F FF A 10 D1 CRC=D1

Temperature = 21.37 Celsius, 70.47 Fahrenheit

No more addresses.

Обычное или паразитное питание?

DS18B20 может работать в обычном или в так называемом “паразитном” режиме. В обычном режиме для подключения используется 3 коннектора, в “паразитном” режиме – в его лишь 2.

Вам надо настроить правильный режим в скетче, чтобы снять достоверные показания с датчика:

  • Для “паразитного” режима в строке 65 надо указать: ds.write(0x44, 1);
  • Для обычного режима в строке 65 указывается: ds.write(0x44);

Убедитесь, что вы указали корректные пины!

В строке 10, где указано “OneWire ds(2);” устанавливается пин, к которому подключен контакт data с сенсора.

В этом примере использован пин 2, но значения пина по умолчанию в примере OneWire стоит на 10. Можно использовать и его.

// пример использования библиотеки OneWire DS18S20, DS18B20, DS1822

OneWire ds(2); // на пине 10 (нужен резистор 4.7 КОм)

Взаимодействие нескольких DS18B20, цифровых датчиков температуры, с Arduino

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

Взаимодействие с несколькими DS18B20, цифровыми датчиками температуры, с Arduino

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

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

А теперь, без дальнейших задержек, давайте подключим датчики DS18B20 к нашей плате Arduino.

Подключение нескольких датчиков DS18B20 к Arduino

Подключение довольно простое.

Начните с подключения всех датчиков DS18B20 параллельно, то есть объединения всех выводов VDD, выводов GND и сигнальных выводов. Затем подключите шину VDD к выходу 5V на Arduino, GND к выводу земли Arduino, и подключите сигнальные выводы к цифровому выводу 2 на Arduino.

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

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

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

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

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

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

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

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

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

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

Способ 1: чтение показаний DS18B20 по индексу

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

Вывод вышеприведенного скетча выглядит так:

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

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

Скетч начинается с включения библиотек, объявления вывода, к которому подключена шина датчиков, и создания объекта библиотеки DallasTemperature .

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

Затем мы вызываем функцию getDeviceCount() , чтобы получить количество устройств, найденных на шине.

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

Теперь, используя простой цикл for(int i = 0; i , мы можем перебирать массив датчиков и считывать температуру DS18B20 по индексу i , просто вызывая getTempCByIndex(i) .

Способ 2: чтение датчика DS18B20 по адресу

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

Поиск адресов датчиков DS18B20s на шине

Следующий скетч обнаруживает все DS18B20, присутствующие на шине, и печатает их адреса на 1-Wire в монитор последовательного порта.

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

Теперь откройте монитор последовательного порта. Вы должны получить что-то подобное:

Рисунок 6 – Нахождение адресов 1-Wire всех датчиков DS18B20 на шине

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

Читайте также:  Реле включения и выключения света по времени

Чтение показаний датчиков DS18B20 по адресу

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

Вывод вышеприведенного эскиза выглядит так

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

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

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

Далее мы вводим адреса, которые были найдены ранее для каждого датчика температуры. В нашем случае имеем следующее.

Во фрагменте настройки мы инициализируем библиотеку путем вызова функции begin() и инициализируем последовательную связь с ПК.

В цикле мы просто посылаем команду всем датчикам для преобразования температуры, используя функцию requestTemperatures() .

Затем, чтобы напечатать температуру датчика, мы вызываем пользовательскую функцию printTemperature(DeviceAddress deviceAddress) , для которой deviceAddress передается в качестве параметра.

Вышеприведенная функция просто вызывает библиотечные функции getTempC(deviceAddress) для отображения температуры в градусах Цельсия и DallasTemperature::toFahrenheit() для отображения температуры в градусах Фаренгейта.

arduinoLab

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

Подробно про датчики температуры DS18B20 и работу с библиотекой DallasTemperature.

Характеристики датчика:

  • Диапазон температур: –55 … 125°C ±2.0, –10 … 85°C ±0.5
  • Разрешение: от 9 до 12 Бит, до 0.0625 °C
  • Напряжение питания: от 3.0 В до 5.5 В. Возможно фантомное питание (питание по линии данных)
  • Связь по 1-Wire. Каждый датчик имеет уникальный 64 битный серийный номер, по которому происходит общение с датчиком на шине.
  • Тревожный сигнал, передает адрес датчика, если температуры вышла за заданные пределы.

Схема подключения датчиков:

Назначение выводов:

Также существует герметичная версия DS18B20, в таких датчиках смотрим на цвета проводов.

PINЦветTO-928-PIN SOICОПИСАНИЕ
GNDЧерный15Масса
DQЖелтый, Белый или Синий24Линия данных интерфейса 1-Wire.
VDDКрасный33Вход внешнего питания.

Подключение одного датчика:

Датчик (ногу DQ) можно подключать на любой свободный выход arduino, в данном случаи датчик подключен к аналоговому А1 (он же 15 цифровой). В коде, при необходимости, можно задать любой другой, на котором будет сконфигурирована шина 1-Wire.

Также необходимо притянуть линию данных к питанию резистором на 4,7к. Питание у датчика 5 вольт.

Подключение нескольких датчиков:

Дополнительные датчики подключаются параллельно.

Подключение датчика с фантомным питанием:

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

Для работы с датчиками необходима библиотека OneWire, скачать можно тут или тут, благодаря которой можно работать со всей линейкой устройств от Maxim/Dallas с однопроводной шиной (1-Wire), включая DS18B20.

Также, для удобства работы с датчиками DS18B20, рекомендуется использовать библиотеку DallasTemperature, особенно если датчиков на шине несколько, можно скачать тут или тут, она работает поверх библиотеки OneWire. Библиотека обширная, возможно будет тяжела для освоения начинающим, особенно по примерам из комплекта.

Пример работы с одним датчиком, без DallasTemperature:

Открываем пример DS18x20_Temperature.pde из библиотеки OneWire.

Далее в 10 строке указываем пин к которому подключен датчик, изначально там указан 10 пин, а в нашем случаи это A1, то есть, меняем «OneWire ds(10);» на «OneWire ds(A1);» и загружаем в arduino. Открываем «монитор порта» в мониторе каждую секунду приходят следующие данные.

ROM = 28 A8 3E F9 5 0 0 12 — Адрес датчика на шине в HEX формате.
Chip = DS18B20 — Тип датчика, вычисляется из адреса датчика.
Data = 1 C0 1 4B 46 3F FF 10 10 6F CRC=6F — Данные о температуре в HEX формате.
Temperature = 28.00 Celsius, 82.40 Fahrenheit — Температура в двух системах.

Алгоритм получения данных с датчика:

Получение температуры в примере DS18x20_Temperature.pde, происходит в три этапа.

Первым нужно узнать адрес датчика на шине и подключен ли он вообще,

за это отвечает код выше и функция ds.search(addr), которая, если найдет устройство, положит его адрес в массив addr. Можно эту процедуру опустить, если адрес датчика заранее известен.

Вторым отправляется команда на датчик, чтобы он прочитал температуру и положил данные в регистр.

на это датчику требуется относительно много времени, порядка 750мс.

Третьем даем команду на чтение данных из регистра и в цикле считываем ответ в массив

и попутно отправляем его в «монитор порта» для отладки, ниже конвертируем в привычные нам Цельсии или Фаренгейты.

Пример целиком, на всякий случай

Работа с библиотекой DallasTemperature:

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

Работа с датчиками по индексу:

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

Пример крайне упрощен и по сути не отличается от кода из примера «DS18x20_Temperature.pde» библиотеки OneWire.

При инициализации просиходит поиск устройств на шине и каждому устройству назначается свой «индекс» по номеру которого, функцией getTempCByIndex(0), можно достать температуру из датчика. Перед считыванием нужно вызвать функцию requestTemperatures() которая дает команды на подключенные датчики считать температуру и положить её в регистр для считвания.

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

Еще один пример работы с датчиками по индексу, этот пример использоватся в видео. Он отправляет в «монитор порта» температуру со всех подключенных датчиков. Для получения количества подключенных датчиков, вызывается функция getDeviceCount(), которая возвращает значение в переменную qty. В loop, также даем команду датчикам, вызывая функцию requestTemperatures(), а ниже, в цикле for, используя количество подключенных датчиков, отпраляем в монитор порта температуру со всех подключенных датчиков.

Работа с датчиками по ID:

В данном случаи обращаемся к датчику не по назначенному библиотекой «индексу», а по серийному номеру датчика, заданного в коде,

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

В коде объяевленны два массива sensor1 и sensor2 в которых хранятся 8 битный серийный номер датчика. В loop после вызова функции requestTemperatures() считываем температуру функцией getTempC(sensor1) передавая ей массив с серийным номером датчика, функция возвращает значение температуры с датчика, которую отправляем в «монитор порта», в случаи если датчика с таким серийным номером на шине не окажится, функция вернет -127.0

Еще один пример из видео, работающий по такому принципу ниже. Он отображает полученную температуру с датчика на LCD сшилде.

Работа с ID:

И заключительный простой пример, в данном случаи, при включении микроконтроллера и всего прочего, вызываем функцию getDeviceCount() которая возвращает количество найденых датчиков на шине, это количество отправляем в «монитор порта» но правельее сделать проверку на наличие датчиков и остановку устройства если датчики не найдены.

Следом вызываем функцию getAddress(sensor0, 0), в функцию передаем массив sensor0 который в нашем случаи объявлен в 7 строке кода и индекс датчика, адрес которого функция присвоит в sensor0.

Следом, в цикле for отправляем в монитор порта содержимое массива sensor0, в котором должен содержатся серийный номер датчика, если все прошло успешно

В функции setResolution(sensor0, 11) устанавливаем разрешение получаемой с датчика sensor0 температуры по его серийному номеру, может быть 9, 10, 11, 12 бит, данный параметр не влияет на точность датчика.

в loop, как и в примере выше, отправляем значение температуры с датчика в «монитор порта» по серийному номеру

Зачем нужен этот пример? если с таким же успехом, можно написать ds.getTempCByIndex(0), с одним датчиком так и нужно, а если их много? серийный номер датчика можно записать в EEPROM с привязкой к конкретной задачи, отслеживать получение верных данных с конкретного датчика, все это повышает надежность устройства.

Купить DS18B20:

можно на али, тут, в герметичном исполнении тут.

Видео:

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

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

Описание датчика DS18B20 для Arduino

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

Читайте также:  Как правильно рассчитать освещение в комнате?

Микросхема имеет три выхода, из которых для данных используется только один, два остальных – это земля и питание. Число проводов можно сократить до двух, если использовать схему с паразитным питанием и соединить Vdd с землей. К одному проводу с данными можно подключить сразу несколько датчиков DS18B20 и в плате Ардуино будет задействован всего один пин.

Виды корпусов DS18B20

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

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

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

Особенности цифрового датчика DS18B20

  • Погрешность измерения не больше 0,5 С (для температур от -10С до +85С), что позволяет точно определить значение температуры. Не требуется дополнительная калибровка.
  • Температурный диапазон измерений лежит в пределах от -55 С до +125 С.
  • Датчик питается напряжением от 3,3В до 5В.
  • Можно программно задать максимальную разрешающую способность до 0,0625С, наибольшее разрешение 12 бит.
  • Присутствует функция тревожного сигнала.
  • Каждое устройство обладает своим уникальным серийным кодом.
  • Не требуются дополнительные внешние элементы.
  • Можно подключить сразу до 127 датчиков к одной линии связи.
  • Информация передается по протоколу 1-Wire.
  • Для присоединения к микроконтроллеру нужны только 3 провода.
  • Существует так называемый режим паразитного питания – в нем происходит питание напрямую от линии связи. Для подключения в этом случае нужны только 2 провода. Важно, что в этом режиме не гарантируется корректная работа при температурах выше 100С. Режим паразитного питания удобно обычно применяется для приложений с удаленным температурным датчиком.

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

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

Во время включения питания датчик находится в состоянии покоя. Для начала измерения контроллер Ардуино выполняет команду «преобразование температуры». Полученный результат сохранится в 2 байтах регистра температуры, после чего датчик вернется в первоначальное состояние покоя. Если схема подключена в режиме внешнего питания, микроконтроллер регулирует состояние конвертации. Во время выполнения команды линия находится в низком состоянии, после окончания программы линия переходит в высокое состояние. Такой метод не допустим при питании от паразитной емкости, так как на шине постоянно должен сохраняться высокий уровень сигнала.

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

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

Скетч для DS18B20

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

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

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

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

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

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

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

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

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

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

Основные команды библиотеки OneWire:

  • search(addressArray) – ищет температурный датчик, при нахождении в массив addressArray записывается его код, в ином случае – false.
  • reset_search() – производится поиск на первом приборе.
  • reset() – выполнение сброса шины перед тем, как связаться с устройством.
  • select(addressArray) – выбирается устройство после операции сброса, записывается его ROM код.
  • write(byte) – производится запись байта информации на устройство.
  • write(byte, 1) – аналогично write(byte), но в режиме паразитного питания.
  • read() – чтение байта информации с устройства.
  • crc8(dataArray, length) – вычисление CRC кода. dataArray – выбранный массив, length – длина кода.

Важно правильно настроить режим питания в скетче. Для паразитного питания в строке 65 нужно записать ds.write(0x44, 1);. Для внешнего питания в строке 65 должно быть записано ds.write(0x44).

Write позволяет передать команду на термодатчик. Основные команды, подаваемые в виде битов:

  • 0x44 – измерить температуру, записать полученное значение в SRAM.
  • 0x4E – запись 3 байта в третий, четвертый и пятый байты SRAM.
  • 0xBE – последовательное считывание 9 байт SRAM.
  • 0х48 – копирование третьего и четвертого байтов SRAM в EEPROM.
  • 0xB8 – копирование информации из EEPROM в третий и четвертый байты SRAM.
  • 0xB4 – возвращает тип питания (0 – паразитное, 1 – внешнее).

Подключение нескольких датчиков температуры DS18B20 к Ардуино

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

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

В режиме паразитного питания схема выглядит иначе. Контакт Vdd практически не задействован, питание идет через выход data.

Выводы

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

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

Рейтинг
( Пока оценок нет )
Загрузка ...
Adblock
detector