Сколько датчиков 18b20 можно подключить на линию
Перейти к содержимому

Сколько датчиков 18b20 можно подключить на линию

  • автор:

Взаимодействие нескольких 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 при инициализации обнаруживает все датчики, использующие одну шину. Она рассматривает всю шину как массив датчиков и присваивает им индексы. Поэтому мы можем точно выбрать каждый датчик по его индексу и прочитать показания температуры.

#include #include // линия данных подключена к цифровому выводу 2 Arduino #define ONE_WIRE_BUS 2 // настройка объекта oneWire для связи с любым устройством OneWire OneWire oneWire(ONE_WIRE_BUS); // передать ссылку на oneWire библиотеке DallasTemperature DallasTemperature sensors(&oneWire); int deviceCount = 0; float tempC; void setup(void) < sensors.begin(); // запустить библиотеку Serial.begin(9600); // найти устройства на шине Serial.print("Locating devices. "); Serial.print("Found "); deviceCount = sensors.getDeviceCount(); Serial.print(deviceCount, DEC); Serial.println(" devices."); Serial.println(""); >void loop(void) < // послать команду всем датчикам для преобразования температуры sensors.requestTemperatures(); // отобразить температуру с каждого датчика for (int i = 0; i < deviceCount; i++) < Serial.print("Sensor "); Serial.print(i+1); Serial.print(" : "); tempC = sensors.getTempCByIndex(i); Serial.print(tempC); Serial.print((char)176);// напечатать символ градусов Serial.print("C | "); Serial.print(DallasTemperature::toFahrenheit(tempC)); Serial.print((char)176);// напечатать символ градусов Serial.println("F"); >Serial.println(""); delay(1000); >

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

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

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

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

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

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

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

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

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

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

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

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

#include #include // линия данных подключена к цифровому выводу 2 Arduino #define ONE_WIRE_BUS 2 // настройка объекта oneWire для связи с любым устройством OneWire OneWire oneWire(ONE_WIRE_BUS); // передать ссылку на oneWire библиотеке DallasTemperature DallasTemperature sensors(&oneWire); // переменная для хранения адресов устройств DeviceAddress Thermometer; int deviceCount = 0; void setup(void) < // запустить последовательный порт Serial.begin(9600); // запустить библиотеку sensors.begin(); // найти устройства на шине Serial.println("Locating devices. "); Serial.print("Found "); deviceCount = sensors.getDeviceCount(); Serial.print(deviceCount, DEC); Serial.println(" devices."); Serial.println(""); Serial.println("Printing addresses. "); for (int i = 0; i < deviceCount; i++) < Serial.print("Sensor "); Serial.print(i+1); Serial.print(" : "); sensors.getAddress(Thermometer, i); printAddress(Thermometer); >> void loop(void) <> void printAddress(DeviceAddress deviceAddress) < for (uint8_t i = 0; i < 8; i++) < Serial.print("0x"); if (deviceAddress[i] < 0x10) Serial.print("0"); Serial.print(deviceAddress[i], HEX); if (i < 7) Serial.print(", "); >Serial.println(""); >

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

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

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

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

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

#include #include // линия данных подключена к цифровому выводу 2 Arduino #define ONE_WIRE_BUS 2 // настройка объекта oneWire для связи с любым устройством OneWire OneWire oneWire(ONE_WIRE_BUS); // передать ссылку на oneWire библиотеке DallasTemperature DallasTemperature sensors(&oneWire); // адреса трех датчиков DS18B20 uint8_t sensor1[8] = < 0x28, 0xEE, 0xD5, 0x64, 0x1A, 0x16, 0x02, 0xEC >; uint8_t sensor2[8] = < 0x28, 0x61, 0x64, 0x12, 0x3C, 0x7C, 0x2F, 0x27 >; uint8_t sensor3[8] = < 0x28, 0x61, 0x64, 0x12, 0x3F, 0xFD, 0x80, 0xC6 >; void setup(void) < Serial.begin(9600); sensors.begin(); >void loop(void) < sensors.requestTemperatures(); Serial.print("Sensor 1: "); printTemperature(sensor1); Serial.print("Sensor 2: "); printTemperature(sensor2); Serial.print("Sensor 3: "); printTemperature(sensor3); Serial.println(); delay(1000); >void printTemperature(DeviceAddress deviceAddress)

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

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

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

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

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

uint8_t sensor1[8] = < 0x28, 0xEE, 0xD5, 0x64, 0x1A, 0x16, 0x02, 0xEC >; uint8_t sensor2[8] = < 0x28, 0x61, 0x64, 0x12, 0x3C, 0x7C, 0x2F, 0x27 >; uint8_t sensor3[8] = < 0x28, 0x61, 0x64, 0x12, 0x3F, 0xFD, 0x80, 0xC6 >;

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

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

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

void printTemperature(DeviceAddress deviceAddress)

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

Теги

Сохранить или поделиться

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.

2021-10-10 baksser

Ясен пень тоже самое, но без функций и лишних печатей. Вы этим уроком что хотели преподнести? Как функции работают или как датчики подключать. Уроки для начинающих? Надо думать как начинающий. Нахрена туда пихать лишнее. Кое как разобрался в вашей писанине. Проще надо быть и люди потянутся.

2021-10-09 radioprog

Что именно усложнено? Какие циклы?
Вы переписали всё то же самое, но без отдельной функции печати температуры в градусах Цельсия и Фаренгейта с символами градусов ‘°’.

2021-10-05 baksser

Трындец всё как сложно запутываете нет чтобы тремя простыми словами нет надо циклы мутить запутанные.

#include
#include
#define ONE_WIRE_BUS 2

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

void setup(void)
Serial.begin(115200);
sensors.begin();
>

void loop(void)
sensors.requestTemperatures();
Serial.print(«температура»);
Serial.print(sensors.getTempC(sensor1));
Serial.print(«температура»);
Serial.print(sensors.getTempC(sensor2));
Serial.print(«температура»);
Serial.print(sensors.getTempC(sensor3));
delay(1000);
>
И всё. Чё усложнять?

2020-12-14 Dmitry Bezborodov

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

DS18B20 – полное описание датчика и его возможностей

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

ds18b20 фото

Общее описания датчика DS18B20

DS18B20 – это датчик температуры, который обладает разрешением преобразования от 9 до 12 разрядов. Тревожный сигнал – функция, которая позволяет качественно контролировать температуру жидкости. Большинство параметров контроля задаются самостоятельно, пользователем. Они сохраняются в памяти и могут быть перенастроены в будущем. Датчик ds18b20 использует протокол интерфейса 1-Wire для обмена данными.

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

Датчик может измерять температуру в достаточно широком диапазоне, от -55 до +125 градусов по Цельсию. Погрешность минимальна и зачастую составляет максимум полградуса. Вышеописанные характеристики делают датчки популярным для использования в экологическом контроле, мониторинге температурных перемен в зданиях, а также в узлах оборудования.

Основные преимущества

Датчик ds18b20 обладает массой основных функций и плюсов:

  1. Однопроводный интерфейс 1-Wire требует только один порт связи для контроллера.
  2. Уникальные коды для каждого агрегата.
  3. Одна линия может подключить сразу несколько датчиков.
  4. Не нужны никакие внешние компоненты.
  5. Питание может быть получено напрямую после подключения к линии связи.
  6. Большой диапазон температур, от -55 до +125 градусов Цельсия.
  7. Ошибки и погрешности могут составлять максимум полградуса.
  8. Можно запрограммировать тревожный сигнал.
  9. Адрес датчика будет передаваться тревожным сигналом, если температура вышла за предел допустимого.
  10. Позволяет установить программное обеспечение.
  11. Может применяться практически повсеместно.

Краткий обзор характеристик

Датчик позволяет вносить корректировки в конфигурацию, используя регистр. Можно установить параметры преобразования агрегата. Цифра варьируется от 9 до 12 бит. Вся информация будет внесена в энергонезависимую память, которую еще называют (EEPROM). Обмен данными осуществляется специальным протоколом 1-Wire. Владельцу нужен небольшой подтягивающий резистор, ведь все агрегаты подключаются к общей шине.

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

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

Также датчик может работать без источников внешнего питания. Используется специальный резистор и вывод DQ. Сигналы повышенного уровня подзаряжают внутренние конденсаторы. Данный метод называется паразитным питанием. Каким вариантом питания пользоваться решать именно владельцу.

Фото обзор характеристик ds18b20

Режим измерения температур

Как проверить работоспособность датчика? Преобразовывать температуру в цифровые данные – вот основная функция датчика. Разрешение цифровых кодов задает сам владелец. Когда питание подключено, DS18B20 потребляет малое количество энергии. Для инициации измерения температур, микроконтроллер выполняет команду преобразования температуры. Когда процесс завершается, результаты находятся в 2 байтах регистра.

Если подключена схема внешнего питания, микроконтроллер может следить за состоянием конвертации. Он читает состояние линии, то есть, другими словами – выполняет временные слоты чтения. Далее, когда команда завершиться, линия переходит в высокое состояние. Когда выполняются процессы конвертации, она, наоборот, в низком положении.

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

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

Как работает тревожный сигнал

Когда запущена команда преобразования температур, полученные данные сравнивают с верхними и нижними порогами регистров. Байтовое значение является знаковым и имеет дополнительный код. Энергозависимая память сохраняет все показатели. Регистры имеют разную длину, поэтому сравнения идет с битами 11 по 4 регистра. Если данные превышают или находятся ниже, то создается признак угрозы. Каждое измерение температурных данных перезаписывает эту команду. То есть, если температура снова вернулась в норму, то информация будет удалена с датчика.

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

Подключаем датчик к плате Arduino

Так как DS18B20 передает значение в двоичном коде, то получаемая информация должна куда-то поступать. Цифровой или аналоговый пин платы ардуино принимает данные, а затем декодирует. Программа DS18B20 1-Wire имеет определенный протокол, по которому и работает вся система. Чтобы понимать ее достаточно иметь минимальную базу знаний:

  • Программа выполняет всего три главных действия, которые мы опишем далее.
  • Инициализацию. Несколько сигналов, с которых начинается измерение или аналогичные команды. Основной агрегат создает специальные импульсы, после них задействуется датчик. Он подает импульс присутствия, который значит, что техника готова выполнить операцию.
  • Записи данных. Передается большое количество байтов информации в устройство DS18B20.
  • Чтение информации. Датчик принимает всю информацию в виде кода.

Какие программы DS18B20 необходимы для его качественной работы?

  1. Arduino IDE;
  2. OneWire – специальные библиотеки, которые могут быть использованы сразу несколькими датчиками.
  3. DallasTemperature – аналог предыдущего варианта, менее популярен, но тоже используется.

А что касается оборудования для датчика?

  1. DS18B20 в одном экземпляре или нескольких.
  2. Специальный микроконтроллер от компании Ардуино.
  3. Несколько коннекторов.
  4. Резисторы на 4.7 кОм.
  5. Одна монтажная плата.
  6. Кабель, который можно подключить к персональному ПК и проводить анализ получаемой информации.

Когда датчик нужно подсоединить к плате, то для многих это становится проблемой. Ничего сложного. GND – знак, который вы найдете на датчике, его нужно соединить с GND. Второй показатель располагается на самой плате. Vdd необходимо соединить с 5V, а Data объединяется с любым цифровым пинам. Калибровка может осуществляться только в том случае, если вся система собрана.

Фото распиновка ds18b20

Скетч для датчика

Программа DS18B20 может работать только по определенному алгоритму. Это позволит максимально точно и быстро получать данные об изменении температуры. Как проверить правильно ли работает скетч? Достаточно проследить за алгоритмами его функционирования, он должен выглядеть следующим образом.

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

Пример скетча

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

* Описываются взаимодействия с агрегатом ds18b20

* ds18b20 подключается к плате используя восьмой пин

OneWire ds(8); // Создается объект на шине, он сделает работу с датчиком возможной

// Определяется температурный показатель агрегата DS18b20

byte data[2]; // Здесь находятся показатели температуры

ds.reset(); // Чтобы начать взаимодействия, необходимо сбросить все предыдущие команды

ds.write(0xCC); // Датчик должен пропустить команду. Пока что установлено всего одно устройство

ds.write(0x44); // Датчик должен измерить температуру. Данные будут помещены в цифровое хранилище данных, но не будут выводиться на экран

delay(1000); // Агрегат меряет температуру, необходимо подождать

ds.reset(); // Подготовьтесь получить значения данных

ds.write(0xBE); // Даем команду передачи данных температуры из регистров

// Ответ получен, считываем его

data[0] = ds.read(); // Младший байт температурных показателей считывается

data[1] = ds.read(); // Очередь старшего

// Формируется окончательно значение температуры:

// — далее умножается на коэффициент,который соответствует разрешающей способности (к примеру, если установлено 12 бит по умолчанию, то показатель равен — 0,0625)

// Выводим полученное значение температуры в монитор порта

Библиотеки OneWire для правильной работы датчика

Цифровой датчик DS18B20 не может работать без специального программного обеспечения. Чтобы обмен информацией был корректным, используется протокол 1-Wire. Именно для него создали большую и понятную библиотеку. Она позволяет датчику функционировать полноценно, выполнять большое количество команд и так далее. Если не использовать ее преимущества, то все команды придется записывать и запускать вручную, что не очень удобно.

Чтобы не тратить свое время, нужно реализовывать возможности библиотеки. Для этого вам необходимо скачать ее с официального сайта, архив программы, далее распаковать в папку в каталоге самой платы. Она называется library, что с английского переводиться как – библиотека. Чтобы подключить и начать пользоваться всеми плюсами программы, необходимо активировать команду #include .

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

Какие команды может выполнять библиотека OneWire?

  1. Искать температурный датчик, и перезаписывать его код. Он располагается в массиве addressArray, если устройство не будет идентифицировано, то вы увидите команду false. Команда — search(addressArray).
  2. Производить поисковые работы на первичном приборе. Команда – reset_search().
  3. Сбрасывать шину перед непосредственным подключением к устройству. Команда — reset().
  4. После сброса библиотека может выбрать устройство, на которое будет записываться ROM код. Команда — select(addressArray).
  5. Процесс записи байтов данных на агрегат. Команда — write(byte).
  6. Аналогичная предыдущему варианту команда, но только в том случае, если вы используете паразитное питание. Команда — write(byte, 1).
  7. Процесс прочтения байтов информации с агрегата. Команда — read().
  8. Процесс, который вычисляет код CRC. Команда отличается в зависимости от нужд — crc8(dataArray, length). dataArray – означает выбранный массив, а length длину кода.

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

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

  • 0x44 – измерение температурных показателей, а также их дальнейшая запись в SRAM.
  • 0x4E – третий байт начинает записываться в 3.4 и 5 байты SRAM.
  • 0xBE – девять байт SRAM начинают процесс последовательно считывания.
  • 0х48 – третий и четвертый байты копируются в основную память.
  • 0xB8 – вся информация из основной памяти копируется в байты SRAM.
  • 0xB4 – позволяет переключить тип питания обратно. 0 обозначает паразитный вариант, а 1 внешний.

Как подключить сразу несколько датчиков?

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

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

Чтобы температура измерялась более точно, необходим дополнительный резистор на 100 Ом. Он подключается к плате Ардуино. Чтобы узнать с какого датчика была получена та или иная информация, достаточно ознакомиться с их уникальными серийными 64 битными кодами. Он отображается в данных, когда команда выполняется. Помните, что в режиме паразитного и внешнего питания, схемы подключения будут выглядеть по-разному.

Где купить?

Цифровой датчик DS18B20 можно приобрести на нашем сайте «silines.ru». Большой ассортимент разных товаров по выгодной цене. Гарантия качества на всю продаваемую продукцию. Здесь вы найдете одноименный датчик, плату, резисторы и не только. Звоните по телефону на главной странице, и менеджер ответит на все ваши вопросы или осматривайте каталог товаров и оформляйте заказ.

Arduino и термометр DS18B20

DS18B20 – высокоточный цифровой датчик температуры. Основные характеристики:

  • Диапазон: -55.. 125 °C
  • Точность: 0.5 °C
  • Разрешение: 9.. 12 бит (0.48.. 0.06 °C)
  • Питание: 3-5.5V
  • Период выдачи результата:
    • 750 мс при точности 12 бит
    • 94 мс при точности 9 бит

    В наборе идёт датчик в герметичном исполнении со стандартным гнездом (шаг 2.54 мм) для подключения

    Подключение

    Датчик имеет следующие назначения пинов:

    Датчик подключается к любому цифровому пину Arduino, но пин должен быть подтянут к питанию резистором 4.7 кОм. На один пин можно подключить несколько датчиков DS18B20.

    В рамках набора GyverKIT резистор на 4.7 кОм можно заменить двумя резисторами на 10 кОм (есть в комплекте), подключенными параллельно:

    Библиотеки

    Для этого датчика есть несколько библиотек:

    • “Официальная” библиотека DallasTemperature.h, для работы которой также понадобится библиотека OneWire.h.
    • Наша библиотека microDS18B20

    В примерах на этом сайте мы будем использовать microDS18B20, так как она в несколько раз легче и проще в использовании, чем официальная. Библиотека идёт в архиве к набору GyverKIT, а свежую версию всегда можно установить/обновить из встроенного менеджера библиотек Arduino по названию microDS18B20. Краткая документация находится по ссылке выше, базовые примеры есть в самой библиотеке.

    Работа с microDS18B20

    Без адресации

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

    MicroDS18B20 sensor1; MicroDS18B20 sensor2; // . и так далее

    С адресацией

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

    uint8_t addr1[] = ; uint8_t addr2[] = ; MicroDS18B20 sensor1; MicroDS18B20 sensor2; // . и так далее

    Также адрес можно сменить во время работы программы, см. документацию.

    Чтение температуры

    Чтение температуры делится на два этапа – запрос и получение данных. Запрос делается функцией requestTemp() . После получения запроса датчик начинает измерение температуры, которое длится от 90 до 750 мс в зависимости от настроенной точности (по умолчанию точность максимальная, преобразование длится 750 мс). Если прочитать температуру до окончания преобразования – датчик вернёт результат предыдущего измерения, поэтому в примерах используется задержка или опрос по таймеру на 1 секунду. Получить температуру можно при помощи getTemp() [float] или getTempInt() [int]. Если принятые данные повреждены или датчик отсутствует на линии – функция вернёт предыдущее успешно прочитанное значение температуры.

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

    В версии библиотеки 3.5 появилась возможность отдельно запросить температуру и определить корректность полученных данных, чтобы только после этого их прочитать и применить в программе – функция readTemp() . Также это позволяет определить состояние подключения и всё ли в порядке с датчиком. Для чтения температуры рекомендуется использовать конструкцию вида:

    if (sensor.readTemp()) value = sensor.getTemp(); // else отработка ошибки

    где readTemp() запрашивает данные с датчика и возвращает true , если они прочитаны корректно. После этого можно забрать текущую температуру из getTemp() , которая уже не запрашивает температуру с датчика, а отдаёт прочитанный в readTemp() результат.

    Примеры

    Без адресации

    Библиотека позволяет работать по схеме “один датчик – один пин”, в которой адрес датчика получать не нужно. Достаточно подключить и использовать:

    // один датчик лучше читать без адресации, это сильно экономит память #include MicroDS18B20 sensor; void setup() < Serial.begin(9600); >void loop() < // запрос температуры sensor.requestTemp(); // вместо delay используй таймер на millis(), пример async_read delay(1000); // проверяем успешность чтения и выводим if (sensor.readTemp()) Serial.println(sensor.getTemp()); else Serial.println("error"); >

    Без адресации асинхронный опрос

    #include MicroDS18B20 sensor; // датчик на D2 void setup() < Serial.begin(9600); >void loop() < // конструкция программного таймера на 800 мс static uint32_t tmr; if (millis() - tmr >= 800) < tmr = millis(); // читаем прошлое значение if (sensor.readTemp()) Serial.println(sensor.getTemp()); else Serial.println("error"); // запрашиваем новое измерение sensor.requestTemp(); >>

    Чтение адреса

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

    #include MicroDS18B20 sensor; // Создаем термометр без адреса на пине D2 uint8_t address[8]; // Создаем массив для адреса void setup() < Serial.begin(9600); >void loop() < // читаем адрес термометра в указанный массив if (sensor.readAddress(address)) < // если успешно, выводим Serial.print('<'); for (uint8_t i = 0; i < 8; i++) < Serial.print("0x"); Serial.print(address[i], HEX); // Выводим адрес if (i < 7) Serial.print(", "); >Serial.println('>'); > else Serial.println("Not connected"); delay(1000); >

    Опрос датчиков с адресацией

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

    #include #define DS_PIN 2 // пин для термометров // Уникальные адреса датчиков - считать можно в примере address_read uint8_t s1_addr[] = ; uint8_t s2_addr[] = ; MicroDS18B20 sensor1; // Создаем термометр с адресацией MicroDS18B20 sensor2; // Создаем термометр с адресацией void setup() < Serial.begin(9600); >void loop() < // асинхронное чтение нескольких датчиков смотри в примере async_read_many sensor1.requestTemp(); // Запрашиваем преобразование температуры sensor2.requestTemp(); delay(1000); // ожидаем результат Serial.print("t1: "); if (sensor1.readTemp()) Serial.println(sensor1.getTemp()); else Serial.println("error"); Serial.print("t2: "); if (sensor2.readTemp()) Serial.println(sensor2.getTemp()); else Serial.println("error"); >

    Удобный опрос массива датчиков

    // количество датчиков для удобства #define DS_SENSOR_AMOUNT 5 // создаём двухмерный массив с адресами uint8_t addr[][8] = < , , , , , >; #include // указываем DS_ADDR_MODE для подключения блока адресации // и создаём массив датчиков на пине D2 MicroDS18B20 sensor[DS_SENSOR_AMOUNT]; void setup() < Serial.begin(9600); // устанавливаем адреса for (int i = 0; i < DS_SENSOR_AMOUNT; i++) < sensor[i].setAddress(addr[i]); >> void loop() < // конструкция программного таймера на 1c static uint32_t tmr; if (millis() - tmr >= 1000) < tmr = millis(); // выводим показания в порт for (int i = 0; i < DS_SENSOR_AMOUNT; i++) < Serial.print(sensor[i].getTemp()); Serial.print(','); >Serial.println(); // запрашиваем новые for (int i = 0; i < DS_SENSOR_AMOUNT; i++) < sensor[i].requestTemp(); >> >

    Видео

    Домашнее задание

    • Изучить остальные возможности библиотеки
    • Измерить температуру тела, сравнить со ртутным термометром

    Связанные уроки

    1-Wire датчик QT18B20 — долгожданный аналог DS18B20 или очередная подделка? Исследуем в лаборатории

    У нас в ассортименте есть гильзованный цифровой датчик 1-wire DS18B20 с широким диапазоном измеряемых температур.

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

    Мы покупаем датчики в гильзах, поэтому несколько датчиков из очередной партии проверяются на специальном стенде. Три года всё было отлично, и вот при проверке очередной партии от проверенного поставщика мы обнаруживаем, что датчик выпущен не компанией Maxim Integrated (ныне Analog Devices).

    Внутри гильзы мы обнаружили чип QT18B20 от компании 7Q-Tek, который имел собственный даташит и позиционировался как аналог DS18B20.

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

    Процедура проверки с ошибкой и датчик QT18B20, извлечённый из гильзы

    История изобретения DS18B20

    Начнем с истории изобретения датчиков. Примерно 30 лет назад инженеры компании Dallas смогли расположить на одном кристалле чувствительный полупроводниковый элемент и микросхему логики. Изделие получило артикул DS1820. Измерять температуру на полупроводниковом элементе весьма непросто, тем более этот процесс нелинейный. Компанией была разработана схема компенсации и добавлен 9-битный АЦП, создан механизм калибровки датчиков: каждый датчик калибруется на заводе, прошивается уникальный номер.

    Датчики совершенствовались со временем. После первенца DS1820 вышел DS18S20, в котором был уже 12-битный АЦП и усовершенствованный алгоритм вычисления температуры. Венцом всей линейки стал DS18B20 с 12-битным АЦП и настраиваемым разрешением от 9 до 12 бит. Подробнее отличия датчиков описаны на сайте microsin.net.

    Изменения претерпели не только датчики, но и компания-разработчик. В 2001 году компанию Dallas купили Maxim Integrated, которую в спустя 20 лет поглотил гигант Analog Devices. Они и владеют сейчас патентами на протокол 1-Wire и сами датчики DS18B20.

    За 30 лет процесс производства был полностью отлажен, датчики производятся массово и дешево по себестоимости. Подключаются по трём или двум проводам и работают по протоколу 1-Wire.

    Схема 1-wire DS18B20

    Чем цифровой датчик лучше аналогового

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

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

    • для получения значений температуры нужен внешний измеритель, например, WB-MAI6;
    • на результат измерения влияют провода, по которым датчик подключен;
    • на один провод можно подключить только один датчик, а значит количество входов в измерителе должно быть равным количеству датчиков.

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

    • вычисление значения температуры происходит внутри микросхемы датчика;
    • значение передаётся в цифровом формате, поэтому провода не влияют на результат измерения, а их длина может быть до 300 метров;
    • на один вход измерителя можно повесить сразу несколько датчиков, обращение к которым происходит по уникальным адресам.

    Конечно, у них есть недостатки: узкий температурный диапазон измерения от -55°C до +125°C и невысокая точность ±0.5°C в диапазоне от -10°C до +85°C. Но эти ограничения несущественны для ряда применений: контроля температуры в помещениях, рефрижераторах, системах тепло- и водоснабжения.

    Проблема подделок

    Благодаря своим преимуществам цифровые датчики сегодня весьма популярны. Долгое время Analog Devices продавала 1-wire DS18B20 довольно дорого, поэтому другие китайские производители решили воспользоваться ситуацией и выпустили недорогие «аналоги».

    Сама Analog Devices никому датчики не лицензирует, название 1-wire является торговой маркой, а сам датчик защищен различными патентами — поэтому напрямую копировать и продавать копии проблематично.

    Корпус оригинального 1-wire DS18B20 (источник)

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

    Оригинальные кристаллы DS18B20 и подделки. A1 – оригинальный 1-wire DS18B20, B2 – изучаемый нами аналог 7Q-Tek QT18B20

    Сразу возникает вопрос: как отличить подделку? Вроде бы основной критерий – цена. Ведь не может оригинальный датчик стоить столько же, сколько подделка. Иначе в чем смысл? Но здесь не все просто. Конечно, поддельные датчики изначально стоили значительно дешевле, например, 50 центов вместо $3.14 за оригинал. И для многих решений подделку охотно покупали — все же китайский рынок довольно большой.

    Стоимость оригинального DS18B20 датчика на сайте производителя

    Производитель оригинальных датчиков посмотрел на китайский рынок и понял, что и здесь можно заработать, просто продавая оригинальные датчики по одной цене с подделками. Не будем забывать, что себестоимость производства очень низкая. В итоге крупные китайские клиенты получили огромные скидки на оригинальные 1-wire DS18B20. И по цене отличить подделку стало практически невозможно, тем более при оптовых закупках и в составе готовых продуктов – тех же гильз.

    Проблемой подделок заинтересовался Крис Петрич: он взял с десяток разных аналогов DS18B20, после чего постарался найти особенности в реализации протокола 1-wire. Он у всех датчиков одинаковый, но с особенностями. Например, сенсор фиксируется в 12-битном режиме и байт 4-го регистра со значением температуры равен 0x7f. Либо зарезервированные байты 5-го и 7-го регистра температуры не равны 0xff и 0x10, соответственно. Используя выявленные отклонения датчиков и считывая данные, исследователи смогли классифицировать все клоны. Интересно, что идеальный клон, полностью повторяющий DS18B20, так никто и не создал. Результаты он опубликовал у себя в репозитории вместе с методикой проверки и скриптом для Ардуино.

    Эту процедуру проверки мы и внедрили у себя на производстве в 2020 году, которая нам позволила поймать поставщика гильзованных датчиков на подмене — вместо оригинального DS18B20 он поставил в гильзу китайский аналог 7Q-Tek 18B20 у которого оказался весьма приличный даташит.

    А что, если аналог не хуже оригинала?

    Надо сказать, что основной критерий качества компонентов для нас не имя производителя, а строгое соответствие заявленных в даташите характеристик реальным. Например, мы однажды нашли интересные датчики GX20MH01 от GXCAS, которые по даташиту лучше оригинальных DS18B20: АЦП 14 бит, а не 12 бит; заявленная ошибка вдвое меньше, а время измерения всего 250 мс вместо 750 мс оригинала.

    Компания солидная, цена немаленькая, всё похоже на правду. Мы даже на радостях протащили в mainline ядро Linux его поддержку, но на самом деле оказалось, что измеряет он не быстрее оригинального, а остальные «преимущества» дальше проверять уже не стали.

    Описание нашего патча в ядро Linux, который добавляет поддержку датчика GX20MH01

    На фоне кризиса электронных компонентов в последние несколько лет некоторые поставщики стали предлагать вместо DS18B20 вполне официально аналоги, например, QT18B20 от 7Q-Tek. С виду всё хорошо: понятный производитель, вменяемый даташит на китайском и отсутствие попытки выдать аналог за оригинал. Но можно ли им верить? Многие китайские компании пишут не реальные показатели, а то, что желают увидеть уважаемые покупатели. Например, указывают только типичное значение ошибки, а про ее статистическое распределение могут просто «забыть».

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

    Процедура проверки параметров датчика

    Исследования проводились в лаборатории нашего партнёра – НИЦ Энерго, имеющего аккредитацию в области испытания и поверки средств измерений. Именно здесь мы проводили испытания датчиков WB-MSW, WB-MS, WB-M1W2 в целях утверждения типа средства измерений.

    У 1-wire DS18B20 заявлена погрешность ±0.5°C, поэтому для проверки в разных температурных точках требуется прибор с намного меньшей погрешностью, например, 0.01°C. Кроме того, требуется создать условия равномерного нагревания всех датчиков, поэтому без термостата не обойтись. Все необходимое есть в специализированной лаборатории, услугами которой мы и воспользовались

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

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

    Для испытаний использовались три жидкостных термостата с неравномерностью температуры по горизонтали не более 0.01°C: со спиртом на охлаждение; с маслом (точнее, специальной кремнийорганической жидкостью) и водой на нагрев. За эталон мы взяли платиновый термометр сопротивления с погрешностью не более 0.01°C (при отрицательных температурах — не более 0.02°C).

    Датчики собрали в пучок: 20 штук DS18B20, 20 штук QT18B20 и один эталон. Для сбора информации с датчиков использовался контроллер Wiren Board 7 — это позволило не только автоматически фиксировать показания в нужных точках, но и отслеживать изменение значений во времени.

    В каждом тесте пучок датчиков погружали в жидкостный термостат, через какое-то время температура стабилизировалась в четырех точках -21 °С, 0 °С, +50 °С и +100 °С, после чего показания всех датчиков записывались в протокол.

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

    Масляный термостат остывает, видна выставленная температура 50 °C и текущая 85 °CДатчики погружены в масляный термостат, идет нагрев до 100 °C, сейчас температура составляет 93.5 °C Водяной термостат с выставленной температурой 50°CДатчики погружены в водяной термостат, идет нагрев до 50 °C, остался 0.1 °CРезультаты измерений эталонного датчика выводили на экран ноутбука, с датчиков 18B20 их снимали с помощью контроллера Wiren Board

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

    Анализ результатов

    Мы исследовали 20 оригинальных датчиков температуры DS18B20 от Analog Devices и 20 их аналогов – QT18B20 компании 7Q-Tek. В процессе работы показания датчиков непрерывно снимали с помощью контроллера Wiren Board и отправляли в облачную базу данных Grafana, что позволяло «на ходу» следить за процессом экспериментов – не только непосредственно в лаборатории, но и удалённо. После завершения исследований данные были обработаны и представлены в виде гистограмм распределения ошибки измерений.

    Гистограммы распределения ошибки измерений

    На гистограммах видна зависимость доли исследуемых датчиков (вертикальная ось) от ошибки измерений (горизонтальная ось). Или более простыми словами: какой процент датчиков какую ошибку давал. Оригинальные датчики показаны синими прямоугольниками, аналоги — красными.

    Например, по первой гистограмме (точка 0 °C) видно, что 35 % оригинальных датчиков DS18B20 давали ошибку менее 0.05 °C, а 35 % датчиков-аналогов имели ошибку приблизительно 0.15 °C. Чем лучше (точнее, стабильнее) датчики, тем уже и острее гистограмма. На той же первой картинке видны единичные выбросы ошибки у датчиков-аналогов QT18B20 (5 % как раз соответствуют одному датчику, так как их всего было 20), причём один из выбросов даже превышает допустимую для данной температуры ошибку в 0.5 °C.

    А вот, например, при 50°C картинка выглядит очень хорошо для обоих типов датчиков: показания очень близкие и ошибка небольшая. Причём у аналогов ошибка даже меньше, чем у оригинальных датчиков.

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

    Кривая ошибки для датчика DS18B20Кривая ошибки для датчика QT18B20

    К сожалению, для обоих типов датчиков в даташитах графики приведены только для диапазона температур от 0 до +70 °C. Здесь можно отметить, что у оригинального DS18B20 ошибки отдельных экземпляров с запасом укладываются в диапазон ±3σ, показанный на графике, хотя средняя ошибка с графиком не совпадает. А у датчика QT18B20 в точке 0 °C отдельные экземпляры имеют ошибку, выходящую за пределы, показанные на графике.

    Можно также оценить и качество самих графиков в документации: у оригинальных DS18B20 видны гладкие кривые средней ошибки и ошибки в пределах 3-х стандартных отклонений (в которые попадает 99.72 % измерений), что говорит о проведённом статистическом анализе ошибки с привлечением аппарата теории вероятностей. У QT18B20 получились 8 ломаных линий – скорее всего, результат тестирования 8 случайно выбранных экземпляров; это даёт возможность лишь приблизительно оценить ошибку в пределах ±σ, а ещё обращает на себя внимание нестабильность ошибки для некоторых экземпляров.

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

    Процесс выхода на точки

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

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

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

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

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

    Заключение

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

    К аналогам QT18B20 фирмы 7Q-Tek есть претензии: в одном из тестов один из 20 датчиков немного «выбежал» за допустимые пределы погрешности, а ещё один датчик перестал выдавать показания во время испытаний и впоследствии так и не ожил. Это косвенно говорит о плохом выходном контроле на производстве микросхем, что настораживает, так как от партии к партии характеристики и процент брака будут плавать.

    Ну а раз есть претензии, мы решили, что не будем продавать датчики с чипами фирмы 7Q-Tek нашим клиентам. А с поставщиком договорились, что впредь нам отгружать только оригинальные датчики DS18B20 и дали понять, что будем контролировать новые партии.

    • Блог компании Wiren Board
    • Умный дом
    • Интернет вещей
    • Инженерные системы

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

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