====== Датчик температуры DS18B20: подключение, распиновка и примеры работы ======
[[amp>product/sealed-temperature-sensor-ds18b20?utm_source=man&utm_campaign=ds18b20&utm_medium=wiki|Цифровой датчик DS18B20]] измерит температуру в воде, на земле и даже в космосе.
{{ :продукты:ds18b20:stemperature-sensor-ds18b20-sealed.2.jpg?nolink |}}
Датчик способен считывать показания температуры в диапазоне от −55 до +125 °C и передавать данные на управляющую плату всего через один пин.
===== Распиновка =====
{{ :products:sealed-temperature-sensor-ds18b20:sealed-temperature-sensor-ds18b20-pinout.png?nolink&500 |}}
^ Цвет провода ^ Контакт ^ Функция ^ Подключение ^
| Жёлтый / Белый| S | Сигнальный | Подключите к пину ввода-вывода микроконтроллера через резистор 4,7 кОм.|
| Красный | V | Входное напряжение (+) | Подключите к плюсу источника питания.|
| Чёрный | G | Входное напряжение (−) | Подключите к минусу источника питания.|
===== Примеры работы для Arduino =====
Датчик общается с управляющей платой по протоколу ''1-wire''. Но вы можете не загружать себе голову битами и байтами, а сразу сосредоточиться на проекте. Для этого скачайте и установите две библиотеки [[https://www.arduinolibraries.info/libraries/one-wire|OneWire]] и [[https://www.arduinolibraries.info/libraries/dallas-temperature|DallasTemperature]] через менеджер модулей.
==== Один датчик ====
Рассмотрим простой пример — подключения одного датчика.
=== Схема подключения ===
Сенсор подключается к управляющей плате через один сигнальный пин.
При подключении к Arduino в компактном форм-факторе, например [[amp>product/arduino-micro?utm_source=man&utm_campaign=ds18b20&utm_medium=wiki|Micro]] или [[amp>product/iskra-nano-pro?utm_source=man&utm_campaign=ds18b20&utm_medium=wiki|Iskra Nano Pro]], воспользуйтесь [[amp>product/breadboard-half?utm_source=man&utm_campaign=ds18b20&utm_medium=wiki|макетной платой]] и [[amp>product/terminal-block?utm_source=man&utm_campaign=ds18b20&utm_medium=wiki|парочкой нажимных клеммников.]]
Между сигнальным проводом и питанием установите [[amp>product/resistor-4k7?utm_source=man&utm_campaign=ds18b20&utm_medium=wiki|сопротивление 4,7 кОм]].
{{ :продукты:ds18b20:temperature-sensor-ds18b20-sealed_arduino_breadboard.png?nolink |}}
При коммуникации сенсора со стандартными платами [[amp>product/arduino-uno?utm_source=man&utm_campaign=ds18b20&utm_medium=wiki|Arduino Uno]] формата Rev3 или [[amp>product/iskra-uno?utm_source=man&utm_campaign=ds18b20&utm_medium=wiki|Iskra Uno]] используйте [[amp>product/arduino-troyka-slot-shield?utm_source=man&utm_campaign=ds18b20&utm_medium=wiki|Troyka Slot Shield]] совместно с [[amp>product/troyka-pull-up?utm_source=man&utm_campaign=ds18b20&utm_medium=wiki|модулем подтяжки.]]
{{ :продукты:ds18b20:temperature-sensor-ds18b20-sealed_arduino_troyka-slot-shield.png?nolink |}}
=== Код программы ===
Выведем температуру сенсора в Serial-порт.
// библиотека для работы с протоколом 1-Wire
#include
// библиотека для работы с датчиком DS18B20
#include
// сигнальный провод датчика
#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 хранит в своей памяти уникальный номер, такое решение позволяет подключить несколько датчиков к одному пину.
=== Схема подключения ===
Добавим к предыдущем схемам подключения ещё по паре датчиков в параллель.
{{ :продукты:ds18b20:temperature-sensor-ds18b20-sealed_arduino_breadboard_many-sensors.png?nolink |}}
{{ :продукты:ds18b20:temperature-sensor-ds18b20-sealed_arduino_troyka-slot-shield_many-sensors.png?nolink |}}
=== Код программы ===
Просканируем все устройства на шине ''1-Wire'' и выведем температуру каждого сенсора отдельно в Serial-порт.
// библиотека для работы с протоколом 1-Wire
#include
// библиотека для работы с датчиком DS18B20
#include
// сигнальный провод датчика
#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 в компактном формфакторе, например [[amp>product/iskra-js-mini?utm_source=man&utm_campaign=ds18b20&utm_medium=wiki|Iskra JS Mini]], воспользуйтесь [[amp>product/breadboard-half?utm_source=man&utm_campaign=ds18b20&utm_medium=wiki|макетной платой]] и [[amp>product/terminal-block?utm_source=man&utm_campaign=ds18b20&utm_medium=wiki|парочкой нажимных клеммников.]]
Между сигнальным проводом и питанием установите сопротивление 4,7 кОм.
{{ :продукты:ds18b20:temperature-sensor-ds18b20-sealed_espruino_breadboard.png?nolink |}}
При коммуникации сенсора с платой [[amp>product/iskra-js?utm_source=man&utm_campaign=ds18b20&utm_medium=wiki|Iskra JS]], используйте [[amp>product/arduino-troyka-slot-shield?utm_source=man&utm_campaign=ds18b20&utm_medium=wiki|Troyka Slot Shield]] совместно с [[amp>product/troyka-pull-up?utm_source=man&utm_campaign=ds18b20&utm_medium=wiki|модулем подтяжки.]]
{{ :продукты:ds18b20:temperature-sensor-ds18b20-sealed_espruino_troyka-slot-shield.png?nolink |}}
=== Код программы ===
Выведем температуру сенсора в консоль Espruino Web IDE.
// создаём объект для работы с шиной 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 хранит в своей памяти уникальный номер, такое решение позволяет подключить несколько датчиков к одному пину.
=== Схема подключения ===
Добавим к предыдущем схемам подключения ещё по паре датчиков в параллель.
{{ :продукты:ds18b20:temperature-sensor-ds18b20-sealed_espruino_breadboard_many-sensors.png?nolink |}}
{{ :продукты:ds18b20:temperature-sensor-ds18b20-sealed_espruino_troyka-slot-shield_many-sensors.png?nolink |}}
=== Код программы ===
Найдём все устройства на шине ''1-Wire'' и выведем температуру каждого сенсора отдельно в Serial-порт.
// создаём объект для работы с шиной 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 =====
==== Один датчик ====
Считаем данные с датчика одноплатником [[amp>collection/raspberry-pi?utm_source=man&utm_campaign=ds18b20&utm_medium=wiki|Raspberry Pi]]. Подключите сенсор к ''4'' пину Raspberry через [[amp>product/troyka-pull-up?utm_source=man&utm_campaign=ds18b20&utm_medium=wiki|модуль подтяжки]]. Для избежания макеток и проводов используйте плату расширения [[amp>product/raspberry-troyka-cap?utm_source=man&utm_campaign=ds18b20&utm_medium=wiki|Troyka Cap]].
=== Схема подключения ===
{{ :продукты:ds18b20:temperature-sensor-ds18b20-sealed_raspberry-pi.png?nolink |}}
=== Код программы ===
# подключаем модуль времени
import time
# подключаем модуль для работы с датчиком DS18B20
from w1thermsensor import W1ThermSensor
# создаём объект для работы с сенсором
sensor = W1ThermSensor()
while (True):
# считываем данные с датчика
temperature = sensor.get_temperature()
# выводим значения в консоль каждую секунду
print(temperature)
time.sleep(1)
Считаем данные с датчика одноплатником [[amp>collection/raspberry-pi?utm_source=man&utm_campaign=ds18b20&utm_medium=wiki|Raspberry Pi]]. Подключите сенсор к ''4'' пину Raspberry через [[amp>product/troyka-pull-up?utm_source=man&utm_campaign=ds18b20&utm_medium=wiki|модуль подтяжки]]. Для избежания макеток и проводов используйте плату расширения [[amp>product/raspberry-troyka-cap?utm_source=man&utm_campaign=ds18b20&utm_medium=wiki|Troyka Cap]].
==== Серия датчиков ====
Каждый сенсор DS18B20 хранит в своей памяти уникальный номер, такое решение позволяет подключить несколько датчиков к одному пину.
=== Схема подключения ===
{{ :продукты:ds18b20:temperature-sensor-ds18b20-sealed_raspberry-pi-many-sensors.png?nolink |}}
=== Код программы ===
# подключаем модуль времени
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 мА при запросе данных
===== Ресурсы =====
* [[amp>product/temperature-sensor-ds18b20?utm_source=man&utm_campaign=ds18b20&utm_medium=wiki|Датчик DS18B20 в магазине]]
* [[amp>product/sealed-temperature-sensor-ds18b20?utm_source=man&utm_campaign=ds18b20&utm_medium=wiki|Герметичный датчик DS18B20 в магазине]]
* [[https://github.com/amperka/hardware-drawings/blob/master/temperature-sensor-ds18b20.svg|Векторное изображение датчика температуры DS18B20]]
* [[https://github.com/amperka/hardware-drawings/blob/master/sealed-temperature-sensor-ds18b20.svg|Векторное изображение герметичного датчика температуры DS18B20]]
* {{ :продукты:ds18b20:ds18b20_datasheet.pdf |Datasheet на сенсор DS18B20}}
* {{:продукты:ds18b20:onewire-master.zip|Библиотека OneWire}}
* {{:продукты:ds18b20:arduino-temperature-control-library-master.zip|Библиотека DallasTemperature}}