Датчик температуры DS18B20: подключение, распиновка, характеристики

Цифровой датчик DS18B20 измерит температуру в воде, на земле и даже в космосе.

Датчик способен считывать показания температуры в диапазоне от −55 до +125 °C и передавать данные на управляющую плату всего через один пин.

Примеры работы для Arduino

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

Один датчик

Рассмотрим простой пример — подключения одного датчика.

Схема подключения

Сенсор подключается к управляющей плате через один сигнальный пин. При подключении к Arduino в компактном формфакторе, например Arduino Micro или Iskra Nano Pro, воспользуйтесь макетной платой и парочкой нажимных клеммников.

Между сигнальным проводом и питанием установите сопротивление 4,7 кОм.

При коммуникации сенсора со стандартными платами Arduino формата Rev3, Arduino Uno или Iskra Neo, используйте Troyka Slot Shield совместно с модулем подтяжки.

Код программы

Выведем температуру сенсора в Serial-порт.

simple.ino
// библиотека для работы с протоколом 1-Wire
#include <OneWire.h>
// библиотека для работы с датчиком DS18B20
#include <DallasTemperature.h>
 
// сигнальный провод датчика
#define ONE_WIRE_BUS 5
 
// создаём объект для работы с библиотекой OneWire
OneWire oneWire(ONE_WIRE_BUS);
 
// создадим объект для работы с библиотекой DallasTemperature
DallasTemperature sensor(&oneWire);
 
void setup(){
  // инициализируем работу Serial-порта
  Serial.begin(9600);
  // начинаем работу с датчиком
  sensor.begin();
  // устанавливаем разрешение датчика от 9 до 12 бит
  sensor.setResolution(12);
}
 
void loop(){
  // переменная для хранения температуры
  float temperature;
  // отправляем запрос на измерение температуры
  sensor.requestTemperatures();
  // считываем данные из регистра датчика
  temperature = sensor.getTempCByIndex(0);
  // выводим температуру в Serial-порт
  Serial.print("Temp C: ");
  Serial.println(temperature);
  // ждём одну секунду
  delay(1000);
}

Серия датчиков

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

Схема подключения

Добавим к предыдущем схемам подключения ещё по паре датчиков в параллель.

Код программы

Просканируем все устройства на шине 1-Wire и выведем температуру каждого сенсора отдельно в Serial-порт.

multipleSensors.ino
// библиотека для работы с протоколом 1-Wire
#include <OneWire.h>
// библиотека для работы с датчиком DS18B20
#include <DallasTemperature.h>
 
// сигнальный провод датчика
#define ONE_WIRE_BUS 5
 
// создаём объект для работы с библиотекой OneWire
OneWire oneWire(ONE_WIRE_BUS);
// создадим объект для работы с библиотекой DallasTemperature
DallasTemperature sensors(&oneWire);
// создаём указатель массив для хранения адресов датчиков
DeviceAddress *sensorsUnique;
// количество датчиков на шине
int countSensors;
 
// функция вывода адреса датчика
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(){
  // инициализируем работу Serial-порта
  Serial.begin(9600);
  // ожидаем открытия Serial-порта
  while(!Serial);
  // начинаем работу с датчиком
  sensors.begin();
  // выполняем поиск устройств на шине
  countSensors = sensors.getDeviceCount();
  Serial.print("Found sensors: ");
  Serial.println(countSensors);
  // выделяем память в динамическом массиве под количество обнаруженных сенсоров
  sensorsUnique = new DeviceAddress[countSensors];
 
  // определяем в каком режиме питания подключены сенсоры
  if (sensors.isParasitePowerMode()) {
    Serial.println("Mode power is Parasite");
  } else {
    Serial.println("Mode power is Normal");
  }
 
  // делаем запрос на получение адресов датчиков
  for (int i = 0; i < countSensors; i++) {
    sensors.getAddress(sensorsUnique[i], i);
  }
  // выводим полученные адреса
  for (int i = 0; i < countSensors; i++) {
    Serial.print("Device ");
    Serial.print(i);
    Serial.print(" Address: ");
    printAddress(sensorsUnique[i]);
    Serial.println();
  }
  Serial.println();
  // устанавливаем разрешение всех датчиков в 12 бит
  for (int i = 0; i < countSensors; i++) {
    sensors.setResolution(sensorsUnique[i], 12);
  }
}
 
void loop(){
  // переменная для хранения температуры
  float temperature[10];
  // отправляем запрос на измерение температуры всех сенсоров
  sensors.requestTemperatures();
  // считываем данные из регистра каждого датчика по очереди
  for (int i = 0; i < countSensors; i++) {
    temperature[i] = sensors.getTempCByIndex(i);
  }
  // выводим температуру в Serial-порт по каждому датчику
  for (int i = 0; i < countSensors; i++) {
    Serial.print("Device ");
    Serial.print(i);
    Serial.print(" Temp C: ");
    Serial.print(temperature[i]);
    Serial.println();
  }
  Serial.println();
  // ждём одну секунду
  delay(1000);
}

Примеры работы для Espruino

Один датчик

Рассмотрим простой пример — подключения одного датчика.

Схема подключения

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

Между сигнальным проводом и питанием установите сопротивление 4,7 кОм.

При коммуникации сенсора с платой Iskra JS, используйте Troyka Slot Shield совместно с модулем подтяжки.

Код программы

Выведем температуру сенсора в консоль Espruino Web IDE.

simpleSensors.js
// создаём объект для работы с шиной OneWire
// для Iskra JS используйте пин P10
var oneWire = new OneWire(P10);
// для Iskra JS Mini используйте пин B1
// var oneWire = new OneWire(B1);
// создаём объект для работы с датчиком температуры DS18B20
var sensor = require("DS18B20").connect(oneWire);
// каждую секунду выводим показания датчика в консоль
setInterval(function() {
  sensor.getTemp(function (temp) {
    console.log("Temp is "+temp+"°C");
  });
}, 1000);

Серия датчиков

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

Схема подключения

Добавим к предыдущем схемам подключения ещё по паре датчиков в параллель.

Код программы

Найдём все устройства на шине 1-Wire и выведем температуру каждого сенсора отдельно в Serial-порт.

multipleSensors.js
// создаём объект для работы с шиной OneWire
// для Iskra JS используйте пин P10
var oneWire = new OneWire(P10);
// для Iskra JS Mini используйте пин B1
// var oneWire = new OneWire(B1);
// создаём массив объектов для работы с каждым датчиком температуры DS18B20
var sensors = oneWire.search().map(function (device) {
  return require("DS18B20").connect(oneWire, device);
});
// каждую секунду выводим показания всех подключённых датчиков на шине 1-wire в консоль
setInterval(function() {
  sensors.forEach(function (sensor, index) {
    sensor.getTemp(function (temp) {
      console.log("Device "+ index + ": " + temp + "°C");
    });
  });
}, 1000);

Примеры работы для Raspberry Pi

Один датчик

Считаем данные с датчика одноплатником Raspberry Pi. Подключите сенсор к 4 пину Raspberry через модуль подтяжки. Для избежания макеток и проводов используйте плату расширения Troyka Cap.

Схема подключения

Код программы

simpleSensor.py
# подключаем модуль времени
import time
# подключаем модуль для работы с датчиком DS18B20
from w1thermsensor import W1ThermSensor
# создаём объект для работы с сенсором
sensor = W1ThermSensor()
 
while (True):
    # считываем данные с датчика
    temperature = sensor.get_temperature()
    # выводим значения в консоль каждую секунду
    print(temperature)
    time.sleep(1)

Считаем данные с датчика одноплатником Raspberry Pi. Подключите сенсор к 4 пину Raspberry через модуль подтяжки. Для избежания макеток и проводов используйте плату расширения Troyka Cap.

Серия датчиков

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

Схема подключения

Код программы

multipleSensors.py
# подключаем модуль времени
import time
# подключаем модуль w1thermsensor
from w1thermsensor import W1ThermSensor
 
while (True):
    # перебираем по очереди все датчики
    for i, sensor in enumerate(W1ThermSensor.get_available_sensors(), start = 1):
        # считываем данные с датчиков
        # и выводим значения в консоль каждую секунду
        print("Sensor %d Address %s has temp %.2f celcius" % (i,sensor.id, sensor.get_temperature()))
    print("\n")
    # ждём одну секунду
    time.sleep(1)

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

  • Модуль: DS18B20
  • Интерфейс: 1-Wire
  • Диапазон измеряемых температур: −55…+125 °C
  • Точность: ±0,5°C
  • Разрешение: 9/10/11/12 бит
  • Напряжение питания: 3–5,5 В
  • Диаметр гильзы: 6 мм
  • Длинна провода: 80 см
  • Потребляемый ток: 750 нА в состоянии покоя и 1 мА при запросе данных

Ресурсы