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

Добавлено 22 декабря 2019 в 11:11

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

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

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

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

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

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

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

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

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

Вот полная спецификация:

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

Несколько датчиков DS18B20 на одной шине

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

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

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

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

Рисунок 2 Распиновка датчика температуры DS18B20 в корпусе TO-92 и в водонепроницаемом корпусе
Рисунок 2 – Распиновка датчика температуры DS18B20 в корпусе TO-92 и в водонепроницаемом корпусе

GND – это вывод земли.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Код для Arduino

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

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

// линия данных подключена к цифровому выводу 2 Arduino
#define ONE_WIRE_BUS 2

// настройка объекта oneWire для связи с любым устройством OneWire
OneWire oneWire(ONE_WIRE_BUS);	

// передать ссылку на oneWire библиотеке DallasTemperature
DallasTemperature sensors(&oneWire);

void setup(void)
{
  sensors.begin();	// запустить библиотеку
  Serial.begin(9600);
}

void loop(void)
{ 
  // отправить команду для получения температуры
  sensors.requestTemperatures(); 

  // напечатать температуру в градусах Цельсия
  Serial.print("Temperature: ");
  Serial.print(sensors.getTempCByIndex(0));
  Serial.print((char)176);// напечатать символ градусов
  Serial.print("C  |  ");
  
  // напечатать температуру в градусах Фаренгейта
  Serial.print((sensors.getTempCByIndex(0) * 9.0) / 5.0 + 32.0);
  Serial.print((char)176);// напечатать символ градусов
  Serial.println("F");
  
  delay(500);
}

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

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

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

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

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

// линия данных подключена к цифровому выводу 2 Arduino
#define ONE_WIRE_BUS 2

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

// настройка объекта oneWire для связи с любым устройством OneWire
OneWire oneWire(ONE_WIRE_BUS);	

// передать ссылку на oneWire библиотеке DallasTemperature
DallasTemperature sensors(&oneWire);

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

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

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

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

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

Теги

ArduinoDallasTemperature.hDS18B20ДатчикДатчик температурыИзмерениеИзмерение температурыИнтерфейс 1-Wire (OneWire)Температура

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

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