Подключение цифрового датчика температуры DS18B20 1-Wire к Arduino

Подключение цифрового датчика температуры DS18B20 1-Wire к Arduino

Хотите измерять температуру в вашем следующем проекте на Arduino? Строите ли вы метеостанцию, мониторите температуру почвы в саду или просто экспериментируете для удовольствия — цифровой датчик температуры DS18B20 1-Wire является одним из самых простых и доступных способов начать.

DS18B20 не только точный и надёжный, но и требует очень мало подключений для работы. И благодаря уникальной однопроводной связи 1-Wire вы можете подключить несколько датчиков к одному выводу Arduino — идеально для более крупных или сложных конфигураций.

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

Давайте начнём!

Датчик температуры DS18B20 1-Wire

DS18B20 — это цифровой датчик температуры, созданный компанией Dallas Semiconductor (теперь часть Maxim Integrated). Он использует специальный протокол связи `1-Wire® `_. Этот протокол позволяет передавать данные, используя только одну линию данных, что значительно сокращает количество необходимых подключений!

Этот датчик доступен в двух основных форм-факторах:

  • Корпус TO-92, который выглядит как маленький транзистор

  • Водонепроницаемый зонд, который идеально подходит для измерения температуры во влажных средах, под землёй или в труднодоступных местах

Interfacing DS18B20 1-Wire Digital Temperature Sensor with Arduino

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

Вы можете выбрать, насколько точными будут ваши показания температуры, регулируя разрешение на 9, 10, 11 или 12 бит. По умолчанию датчик использует 12-битное разрешение, что означает, что он может обнаруживать изменения температуры размером всего 0,0625°C.

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

Вот технические характеристики:

Напряжение питания

3V to 5.5V

Потребляемый ток

1mA

Диапазон температур

-55 to 125°C

Точность

±0.5°C

Разрешение

9 to 12 bit (выбирается)

Время преобразования

< 750ms

Использование нескольких датчиков DS18B20 на одном проводе

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

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

Хотите узнать, как считывать данные с более чем одного DS18B20 одновременно? Ознакомьтесь с этим руководством:

Interfacing DS18B20 1-Wire Digital Temperature Sensor with Arduino

Распиновка датчика DS18B20

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

Interfacing DS18B20 1-Wire Digital Temperature Sensor with Arduino

GND — это вывод заземления.

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

VDD — подаёт питание на датчик. Обычно принимает от 3,0 В до 5,5 В. В режиме паразитного питания этот вывод подключается к GND, и датчик берёт питание с линии данных.

В водонепроницаемом зонде DS18B20 провода обычно имеют следующую цветовую маркировку:

  • Красный → VDD (питание)

  • Чёрный → GND

  • Жёлтый или белый → DQ (данные)

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

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

Подключение довольно простое. Сначала подключите вывод VDD датчика к выводу 5V на Arduino. Далее подключите вывод GND (земля) датчика к любому из выводов GND Arduino.

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

Вот краткая справочная таблица подключений:

DS18B20ArduinoNotes
VDD5V
GNDGND
DQ2pulled up by 4.7kΩ
Interfacing DS18B20 1-Wire Digital Temperature Sensor with Arduino

Если вы используете водонепроницаемый зонд DS18B20, провода имеют цветовую маркировку: подключите красный провод к выводу 5V Arduino, чёрный провод к GND, а жёлтый провод к цифровому выводу 2.

Как и прежде, не забудьте добавить резистор 4,7 кОм между жёлтым проводом (данные) и красным проводом (питание) для стабильной связи.

Interfacing DS18B20 1-Wire Digital Temperature Sensor with Arduino

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

Протокол связи 1-Wire, используемый датчиком DS18B20, довольно сложный, и написание всего кода с нуля заняло бы много времени. К счастью, есть специальная библиотека `DallasTemperature `_, которая значительно упрощает работу.

Для установки библиотеки:

  1. Сначала откройте вашу программу Arduino IDE. Затем нажмите на значок Менеджер библиотек на левой боковой панели.

  2. Введите «ds18b20» в поле поиска для фильтрации результатов.

  3. Найдите библиотеку DallasTemperature от Miles Burton.

  4. Нажмите кнопку Install, чтобы добавить её в вашу Arduino IDE.

Interfacing DS18B20 1-Wire Digital Temperature Sensor with Arduino

Для правильной работы библиотеке DallasTemperature необходима ещё одна библиотека — `OneWire `_.

Для установки библиотеки OneWire:

  1. Снова откройте Менеджер библиотек.

  2. В поле поиска введите «onewire».

  3. Найдите библиотеку OneWire и нажмите Install.

Interfacing DS18B20 1-Wire Digital Temperature Sensor with Arduino

С обеими установленными библиотеками вы будете готовы начать работу с вашим датчиком температуры DS18B20!

Пример кода Arduino

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

#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into digital pin 2 on the Arduino
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire device
OneWire oneWire(ONE_WIRE_BUS);

// Pass oneWire reference to DallasTemperature library
DallasTemperature sensors(&oneWire);

void setup(void) {
  Serial.begin(9600);
  sensors.begin();
}

void loop(void) {
  // Send the command to get temperatures
  sensors.requestTemperatures();

  //print the temperature in Celsius
  Serial.print("Temperature: ");
  Serial.print(sensors.getTempCByIndex(0));
  Serial.print("°C  |  ");

  //print the temperature in Fahrenheit
  Serial.print((sensors.getTempCByIndex(0) * 9.0) / 5.0 + 32.0);
  Serial.println("°F");

  delay(500);
}

После загрузки скетча на Arduino откройте монитор последовательного порта и установите скорость 9600 бод. Вы увидите текущую температуру, отображаемую как в °C, так и в °F.

Interfacing DS18B20 1-Wire Digital Temperature Sensor with Arduino

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

Скетч начинается с подключения двух важных библиотек: OneWire.h, которая знает, как взаимодействовать с устройствами, использующими протокол 1-Wire, и DallasTemperature.h, которая упрощает работу с датчиком DS18B20 и получение показаний температуры.

#include <OneWire.h>
#include <DallasTemperature.h>

Далее мы сообщаем Arduino, к какому выводу подключён провод данных датчика — в данном случае цифровой вывод 2.

#define ONE_WIRE_BUS 2

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

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

В разделе setup() мы запускаем последовательную связь, чтобы видеть результаты в мониторе последовательного порта. Затем мы используем sensors.begin(), который сканирует шину 1-Wire для обнаружения подключённых датчиков DS18B20 и устанавливает их разрешение на 12 бит.

void setup(void) {
  Serial.begin(9600);
  sensors.begin();
}

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

После завершения преобразования мы вызываем sensors.getTempCByIndex(deviceIndex) для считывания температуры с датчика. deviceIndex — это число, которое сообщает Arduino, с какого датчика на шине 1-Wire мы хотим считать данные. Поскольку у нас подключён только один датчик, мы используем 0 для обращения к нему. Если бы у вас было несколько датчиков, вы бы использовали 1, 2, 3 и т.д., в зависимости от их порядка на шине.

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

Наконец, функция delay(500) приостанавливает программу на полсекунды перед следующим считыванием и повторением процесса.

void loop(void) {
  // Send the command to get temperatures
  sensors.requestTemperatures();

  //print the temperature in Celsius
  Serial.print("Temperature: ");
  Serial.print(sensors.getTempCByIndex(0));
  Serial.print("°C  |  ");

  //print the temperature in Fahrenheit
  Serial.print((sensors.getTempCByIndex(0) * 9.0) / 5.0 + 32.0);
  Serial.println("°F");

  delay(500);
}

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

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

  • Функция setResolution() позволяет выбрать, насколько точными будут ваши показания температуры. Вы можете выбрать одно из четырёх разрешений: 9 бит = точность 0,5°C

  • 10 бит = точность 0,25°C

  • 11 бит = точность 0,125°C

  • 12 бит = точность 0,0625°C (значение по умолчанию)

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

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

Датчик температуры DS18B20 имеет интересную функцию — режим паразитного питания. Этот специальный режим позволяет датчику работать, используя всего два провода — GND и DQ (данные) — вместо обычных трёх (которые обычно включают VDD для питания). Это действительно полезно, когда пространство ограничено и вам нужно упростить проводку.

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

Для настройки DS18B20 в режиме паразитного питания подключите вывод VDD напрямую к GND. Подключите вывод DQ (данные) датчика к цифровому выводу 2 на Arduino, а вывод GND (земля) датчика к любому из выводов GND Arduino.

Вам по-прежнему потребуется подтягивающий резистор 4,7 кОм между линией DQ и источником питания.

Interfacing DS18B20 1-Wire Digital Temperature Sensor with Arduino

Однако есть несколько важных моментов, которые нужно помнить при использовании паразитного режима:

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

  • Также, если вы пытаетесь подключить несколько датчиков DS18B20 одновременно в паразитном режиме, вы можете столкнуться с проблемами питания. Это связано с тем, что каждому датчику нужно определённое количество энергии для работы, а паразитный режим обеспечивает меньше энергии, чем обычный метод подключения. Поэтому чем больше датчиков вы подключаете, тем больше вероятность возникновения проблем.