====== Датчик температуры 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}}