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

Цифровой датчик температуры DS18B20 предназначен для измерения температур от −55 до +125 °C. Показания передаются на управляющую плату по протоколу 1-Wire — для подключения понадобится всего один свободный пин.

Подключение

Датчик имеет несколько вариантов исполнения чувствительного элемента. В статье мы опишем работу с сенсором DS18B20+ и его герметичным вариантом. Для питания датчика током напряжением от 3 В до 5.5 В используются контакты V и G. Контакт S предназначен для передачи данных на микроконтроллер.

Чтобы подключить датчик понадобится резистор на 4.7 кОм, которым необходимо будет притянуть сигнальный контакт S к контакту питания V. Ниже приведена схема подключения двух типов датчика с использованием Breadboard.

Собрать такую схему на макетке не сложно, но если вам важна надежность — спаяйте схему на Troyka Protoboard. Если вы ещё никогда не паяли, сейчас хороший повод научится этому.

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

Теперь датчик легко подключить стандартным трёхпроводным шлейфом «мама-мама» к Troyka Shield.

А если хотите избавиться от лишних проводов, воспользуйтесь Troyka Slot Shield.

Примеры работы

Для того чтобы микроконтроллер получил данные с термометра необходимо установить библиотеку OneWire Library. Рекомендуем установить еще одну библиотеку Dallas Temperature — в ней собраны функции для упрощения работы с датчиком.

Работа с одним датчиком

Рассмотрим самый простой способ получения температуры — получение значений и выводом их в Serial монитор. Прошейте управляющую плату примером кода, перезагрузите контроллер и откройте Serial монитор.

simple.ino
// подключим необходимые библиотеки
#include <OneWire.h>
#include <DallasTemperature.h>
 
// сигнальный провод подключен к 2 пину на Arduino
#define ONE_WIRE_BUS 4
 
// настроим библиотеку 1-Wire для связи с датчиком
OneWire oneWire(ONE_WIRE_BUS);
 
// создадим объект для работы с библиотекой DallasTemperature
DallasTemperature sensors(&oneWire);
 
void setup(){
  // инициализируем работу Serial порта
  Serial.begin(9600);
  sensors.begin();
}
 
void loop(){
  // отправляем запрос на измерение температуры
  sensors.requestTemperatures();
  // покажем температуру в мониторе Serial порта
  Serial.print("Temp C: ");
  Serial.print(sensors.getTempCByIndex(0));
  Serial.println();
}

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

Рассмотрим более сложный пример — с большим числом параметров

single.ino
// подключим необходимые библиотеки
#include <OneWire.h>
#include <DallasTemperature.h>
 
// сигнальный провод подключен к 2 пину на Arduino
#define ONE_WIRE_BUS 4
 
// выберем разрешение от 9 до 12
#define TEMPERATURE_PRECISION 9
 
// настроем библиотеку 1-Wire для связи с датчиком
OneWire oneWire(ONE_WIRE_BUS);
 
// создадим объект для работы с библиотекой DallasTemperature
DallasTemperature sensors(&oneWire);
 
// создаем массив для хранения адреса датчика
DeviceAddress Thermometer;
 
// функция вывода адреса датчика
void printAddress(DeviceAddress deviceAddress){
  for (uint8_t i = 0; i < 8; i++){
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
}
 
void setup(void){
  // инициализируем работу Serial порта
  Serial.begin(9600);
  Serial.println("Dallas Temperature IC Control Library");
 
  // инициализируем работу с датчиком
  sensors.begin();
 
  // выведем общее количество найденных датчиков
  Serial.print("Found ");
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.println(" devices.");
 
  // проверяем способ подключения питания
  Serial.print("Parasite power is: ");
  if (sensors.isParasitePowerMode()){
  Serial.println("ON");
  } else {
  Serial.println("OFF");
  }
  // сделаем запрос на получение адреса датчика
  sensors.getAddress(Thermometer, 0);
  // выведем полученный адрес
  Serial.print("Device 0 Address: ");
  printAddress(Thermometer);
  Serial.println();
 
  // установим выбранное разрешение датчика
  sensors.setResolution(Thermometer, TEMPERATURE_PRECISION);
  // выведем значение установленного разрешения
  Serial.print("Resolution: ");
  Serial.print(sensors.getResolution(Thermometer), DEC);
  Serial.println();
}
 
void loop(void){
  // отправляем запрос на измерение температуры
  sensors.requestTemperatures();
  // создаем переменную для хранения температуры в градусах Цельсия и выводим её значение
  float tempC = sensors.getTempC(Thermometer);
  Serial.print("Temp C: ");
  Serial.print(tempC);
  Serial.println();
  // пересчитаем значение температуры из шкалы Цельсия в шкалу Фаренгейта
  Serial.print("Temp F: ");
  Serial.print(DallasTemperature::toFahrenheit(tempC));
  Serial.println();
  Serial.println();
}

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

Работа с двумя датчиками

К одному сигнальному пину, можно подключить несколько датчиков сразу.

Multiple.ino
// подключим необходимые библиотеки
#include <OneWire.h>
#include <DallasTemperature.h>
 
// сигнальный провод подключен к 2 пину на Arduino
#define ONE_WIRE_BUS 4
// выберем разрешение от 9 до 12
#define TEMPERATURE_PRECISION 9
 
// настроем библиотеку 1-Wire для связи с датчиком
OneWire oneWire(ONE_WIRE_BUS);
 
// создадим объект для работы с библиотекой DallasTemperature
DallasTemperature sensors(&oneWire);
 
// создаем массивы для хранения адреса датчиков
DeviceAddress insideThermometer, outsideThermometer;
 
// функция вывода адреса датчика
void printAddress(DeviceAddress deviceAddress){
  for (uint8_t i = 0; i < 8; i++){
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
}
 
void setup(void){
  // инициализируем работу сериал порта
  Serial.begin(9600);
  Serial.println("Dallas Temperature IC Control Library");
 
  // инициализируем работу с датчиком
  sensors.begin();
 
  // выводим количество найденных датчиков
  Serial.print("Locating devices...");
  Serial.print("Found ");
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.println(" devices.");
 
  // проверяем способ подключения питания
  Serial.print("Parasite power is: ");
  if (sensors.isParasitePowerMode()) Serial.println("ON");
  else Serial.println("OFF");
 
  // сделаем запрос на получение адреса датчика
  sensors.getAddress(insideThermometer, 0);
  sensors.getAddress(outsideThermometer, 1);
  // выведем полученный адрес
  Serial.print("Device 0 Address: ");
  printAddress(insideThermometer);
  Serial.println();
  Serial.print("Device 1 Address: ");
  printAddress(outsideThermometer);
  Serial.println();
 
  // установим выбранное разрешение датчика
  sensors.setResolution(insideThermometer, TEMPERATURE_PRECISION);
  sensors.setResolution(outsideThermometer, TEMPERATURE_PRECISION);
 
  // выведем значение установленного разрешения
  Serial.print("Device 0 Resolution: ");
  Serial.print(sensors.getResolution(insideThermometer), DEC);
  Serial.println();
  Serial.print("Device 1 Resolution: ");
  Serial.print(sensors.getResolution(outsideThermometer), DEC);
  Serial.println();
}
 
void loop(void){
  // отправляем запрос на измерение температуры
  sensors.requestTemperatures();
  // создаем переменную для хранения температуры в градусах Цельсия и выводим её значение
  float tempC0 = sensors.getTempC(insideThermometer);
  Serial.print("Temp C Device 0: ");
  Serial.print(tempC0);
  Serial.println();
  // пересчитаем значение температуры из Цельсия в Фаренгейт
  Serial.print("Temp F Device 0: ");
  Serial.print(DallasTemperature::toFahrenheit(tempC0));
  Serial.println();
  Serial.println();
 
  float tempC1 = sensors.getTempC(outsideThermometer);
  Serial.print("Temp C Device 1: ");
  Serial.print(tempC1);
  Serial.println();
  // пересчитаем значение температуры из Цельсия в Фаренгейт
  Serial.print("Temp F Device 1: ");
  Serial.print(DallasTemperature::toFahrenheit(tempC1));
  Serial.println();
  Serial.println();
}

В мониторе порта появятся показания двух датчиков.

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

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

Ресурсы