Ds18b20 датчик

Подробно про датчики температуры 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-92 8-PIN SOIC ОПИСАНИЕ
GND Черный 1 5 Масса
DQ Желтый, Белый или Синий 2 4 Линия данных интерфейса 1-Wire.
VDD Красный 3 3 Вход внешнего питания.

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

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

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

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

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

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

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

Софт:

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

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

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

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

OneWire ds(10); // on pin 10 (a 4.7K resistor is necessary)

Далее в 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, происходит в три этапа.

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

if ( !ds.search(addr)) { Serial.println(«No more addresses.»); Serial.println(); ds.reset_search(); delay(250); return; }

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

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

ds.reset(); ds.select(addr); ds.write(0x44, 1); // start conversion, with parasite power on at the end

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

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

present = ds.reset(); ds.select(addr); ds.write(0xBE); // Read Scratchpad Serial.print(» Data = «); Serial.print(present, HEX); Serial.print(» «); for ( i = 0; i < 9; i++) { // we need 9 bytes data = ds.read(); Serial.print(data, HEX); Serial.print(» «); }

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

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

DS18x20_Temperature.pde #include <OneWire.h> // OneWire DS18S20, DS18B20, DS1822 Temperature Example // // https://www.pjrc.com/teensy/td_libs_OneWire.html // // The DallasTemperature library can do all this work for you! // https://milesburton.com/Dallas_Temperature_Control_Library OneWire ds(A1); // on pin 10 (a 4.7K resistor is necessary) void setup(void) { Serial.begin(9600); } void loop(void) { byte i; byte present = 0; byte type_s; byte data; byte addr; float celsius, fahrenheit; if ( !ds.search(addr)) { Serial.println(«No more addresses.»); Serial.println(); ds.reset_search(); delay(250); return; } Serial.print(«ROM =»); for( i = 0; i < 8; i++) { Serial.write(‘ ‘); Serial.print(addr, HEX); } if (OneWire::crc8(addr, 7) != addr) { Serial.println(«CRC is not valid!»); return; } Serial.println(); // the first ROM byte indicates which chip switch (addr) { case 0x10: Serial.println(» Chip = DS18S20″); // or old DS1820 type_s = 1; break; case 0x28: Serial.println(» Chip = DS18B20″); type_s = 0; break; case 0x22: Serial.println(» Chip = DS1822″); type_s = 0; break; default: Serial.println(«Device is not a DS18x20 family device.»); return; } ds.reset(); ds.select(addr); ds.write(0x44, 1); // start conversion, with parasite power on at the end delay(1000); // maybe 750ms is enough, maybe not // we might do a ds.depower() here, but the reset will take care of it. present = ds.reset(); ds.select(addr); ds.write(0xBE); // Read Scratchpad Serial.print(» Data = «); Serial.print(present, HEX); Serial.print(» «); for ( i = 0; i < 9; i++) { // we need 9 bytes data = ds.read(); Serial.print(data, HEX); Serial.print(» «); } Serial.print(» CRC=»); Serial.print(OneWire::crc8(data, 8), HEX); Serial.println(); // Convert the data to actual temperature // because the result is a 16 bit signed integer, it should // be stored to an «int16_t» type, which is always 16 bits // even when compiled on a 32 bit processor. int16_t raw = (data << 8) | data; if (type_s) { raw = raw << 3; // 9 bit resolution default if (data == 0x10) { // «count remain» gives full 12 bit resolution raw = (raw & 0xFFF0) + 12 — data; } } else { byte cfg = (data & 0x60); // at lower res, the low bits are undefined, so let’s zero them if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms //// default is 12 bit resolution, 750 ms conversion time } celsius = (float)raw / 16.0; fahrenheit = celsius * 1.8 + 32.0; Serial.print(» Temperature = «); Serial.print(celsius); Serial.print(» Celsius, «); Serial.print(fahrenheit); Serial.println(» Fahrenheit»); }

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

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

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

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

#include <OneWire.h> #include <DallasTemperature.h> OneWire oneWire(15); // вход датчиков 18b20, аналоговый А1, он же 15 цифровой DallasTemperature ds(&oneWire); void setup() { Serial.begin(9600); ds.begin(); // инициализация } void loop() { ds.requestTemperatures(); // считываем температуру с датчиков, на это требуется 750мс Serial.print(«Sensor 0: «); Serial.print(ds.getTempCByIndex(0)); // отправляем температуру Serial.println(«C»); }

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

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

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

ds18b20_Index — код из видео #include <OneWire.h> #include <DallasTemperature.h> OneWire oneWire(15);// вход датчиков 18b20 DallasTemperature ds(&oneWire); byte qty; // количество градусников на шине void setup() { Serial.begin(9600); ds.begin(); qty = ds.getDeviceCount(); Serial.print(«Found «); Serial.print(qty); Serial.println(» devices.»); // } void loop() { ds.requestTemperatures(); // считываем температуру с датчиков for (int i = 0; i < qty; i++){ // крутим цикл Serial.print(«Sensor «); Serial.print(i); Serial.print(«: «); Serial.print(ds.getTempCByIndex(i)); // отправляем температуру Serial.println(«C»); } Serial.println(); }

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

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

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

#include <OneWire.h> #include <DallasTemperature.h> OneWire oneWire(15); // вход датчиков 18b20 DallasTemperature ds(&oneWire); DeviceAddress sensor1 = {0x28, 0xA8, 0x3E, 0xF9, 0x05, 0x0, 0x0, 0x12}; DeviceAddress sensor2 = {0x28, 0xE6, 0xBD, 0x3B, 0x05, 0x0, 0x0, 0xCF}; void setup() { Serial.begin(9600); ds.begin(); } void loop() { ds.requestTemperatures(); // считываем температуру с датчиков Serial.print(«Sensor 1: «); Serial.print(ds.getTempC(sensor1)); // отправляем температуру Serial.println(«C»); Serial.print(«Sensor 2: «); Serial.print(ds.getTempC(sensor2)); Serial.println(«C»); Serial.println(); delay(1000); }

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

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

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

ds18b20_ID_lcd — код из видео #include <OneWire.h> #include <DallasTemperature.h> #include <LiquidCrystal.h> OneWire oneWire(15); // вход датчиков 18b20 DallasTemperature ds(&oneWire); LiquidCrystal lcd(8, 9, 4, 5, 6, 7); DeviceAddress sensor1 = {0x28, 0xA8, 0x3E, 0xF9, 0x05, 0x0, 0x0, 0x12}; DeviceAddress sensor2 = {0x28, 0xE6, 0xBD, 0x3B, 0x05, 0x0, 0x0, 0xCF}; void setup() { // Serial.begin(9600); ds.begin(); lcd.begin(16, 2); lcd.clear(); } void loop() { ds.requestTemperatures(); // считываем температуру с датчиков lcd.setCursor(0, 0); lcd.print(«Sensor 1: «); lcd.print(ds.getTempC(sensor1)); // отправляем температуру lcd.print(«C»); lcd.setCursor(0, 1); lcd.print(«Sensor 2: «); lcd.print(ds.getTempC(sensor2)); lcd.print(«C»); }

Работа с ID:

#include <OneWire.h> #include <DallasTemperature.h> OneWire oneWire(15); // вход датчиков 18b20 DallasTemperature ds(&oneWire); DeviceAddress sensor0; void setup() { Serial.begin(9600); ds.begin(); // показываем сколько датчиков нашли на шине Serial.print(«Found «); Serial.print(ds.getDeviceCount(), DEC); Serial.println(» devices.»); // достаем адрес датчика с индесом 0 if (!ds.getAddress(sensor0, 0)){ Serial.println(«Unable to find address for Device 0»); } // отпаравляем адрес из массива в монитор порта Serial.print(«address sensor 0: «); for (uint8_t i = 0; i < 8; i++) { Serial.print(«0x»); Serial.print(sensor0, HEX); Serial.print(«, «); } Serial.println(); // устанавливаем разрешение датчика 11 бит (может быть 9, 10, 11, 12) // на точность измерения температуры показатель не влияет. ds.setResolution(sensor0, 11); } void loop() { ds.requestTemperatures(); // считываем температуру с датчиков Serial.print(«Sensor 0: «); Serial.print(ds.getTempC(sensor0)); // отправляем температуру Serial.println(«C «); // delay(1000); }

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

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

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

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

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

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

Купить DS18B20:

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

Герметичный датчик температуры DS18B20

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

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

Этот датчик температуры основан на популярной микросхеме DS18B20. Он позволяет определить температуру окружающей среды в диапазоне от -55°C до +125°C и получать данные в виде цифрового сигнала с 12-битным разрешением по 1-Wire протоколу. Этот протокол позволит подключить огромное количество таких датчиков, используя всего 1 цифровой порт контроллера, и всего 2 провода для всех датчиков: земли и сигнала. В этом случае применяется так называемое «паразитное питание», при котором датчик получает энергию прямо с линии сигнала. Каждый датчик имеет уникальный прошитый на производстве 64-битный код, который может использоваться микроконтроллером для общения с конкретным сенсором на общей шине. Код отдельного сенсора может быть считан отдельной командой.

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

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

Подключение

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

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

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

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

Для подключения 1-Wire устройств к Arduino существует готовая библиотека.

Характеристики

  • Диапазон измеряемых температур: −55…+125 °C
  • Точность: ±0,5°C (в пределах −10…+85 °C)
  • Время получения данных: 750 мс при 12-битном разрешении; 94 мс при 9-битном разрешении
  • Напряжение питания: 3–5,5 В
  • Потребляемый ток при бездействии: 750 нА
  • Потребляемый ток при опросе: 1 мА

Ссылки

  • Видеообзор на YouTube

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

DS18B20 – цифровой датчик, который является популярной моделью среди аналогов. Эксплуатация устройства очень проста, датчик помещается в водонепроницаемый корпус и измеряет температуру воды или других жидкостей. Зачастую он подключается к Arduino и в итоге владелец получает чувствительный и качественный сенсор. В данном материале вы узнаете основные характеристики и методы подключения датчика 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 потребляет малое количество энергии. Для инициации измерения температур, микроконтроллер выполняет команду преобразования температуры. Когда процесс завершается, результаты находятся в 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 может работать только по определенному алгоритму. Это позволит максимально точно и быстро получать данные об изменении температуры. Как проверить правильно ли работает скетч? Достаточно проследить за алгоритмами его функционирования, он должен выглядеть следующим образом.

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

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

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

#include <OneWire.h>

/*

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

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

/*

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

void setup(){

Serial.begin(9600);

}

void loop(){

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

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

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

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

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

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

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

ds.write(0xCC);

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

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

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

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

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

// — Значение склеивается;

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

float temperature = ((data << 8) | data) * 0.0625;

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

Serial.println(temperature);

}

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

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

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

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

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

Где купить?

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

Датчик температуры в 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 с длиной провода 1 м от надежного магазина Комплект из 10 микросхем DS18B20 TO92 Модуль DS18B20 для удобного подключения к Ардуино от Keyestudio
Беспроводной модуль DS18B20 на ESP8266 ESP-01 ESP-01S для проектов умного дома Шилд датчика DS18B20 для платы D1 MINI – беспроводная передача данных Датчик 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, о которой поговорим подробнее чуть позже).

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

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

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

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

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

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

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

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

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

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

About the author

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

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

Для любых предложений по сайту: [email protected]