Цифровой датчик DS18B20 измерит температуру в воде, на земле и даже в космосе.
Датчик способен считывать показания температуры в диапазоне от −55 до +125 °C и передавать данные на управляющую плату всего через один пин.
Цвет провода | Контакт | Функция | Подключение |
---|---|---|---|
Жёлтый / Белый | S | Сигнальный | Подключите к пину ввода-вывода микроконтроллера через резистор 4,7 кОм. |
Красный | V | Входное напряжение (+) | Подключите к плюсу источника питания. |
Чёрный | G | Входное напряжение (−) | Подключите к минусу источника питания. |
Датчик общается с управляющей платой по протоколу 1-wire
. Но вы можете не загружать себе голову битами и байтами, а сразу сосредоточиться на проекте. Для этого скачайте и установите две библиотеки OneWire и DallasTemperature через менеджер модулей.
Рассмотрим простой пример — подключения одного датчика.
Сенсор подключается к управляющей плате через один сигнальный пин. При подключении к Arduino в компактном форм-факторе, например Micro или Iskra Nano Pro, воспользуйтесь макетной платой и парочкой нажимных клеммников.
Между сигнальным проводом и питанием установите сопротивление 4,7 кОм.
При коммуникации сенсора со стандартными платами Arduino Uno формата Rev3 или Iskra Uno используйте Troyka Slot Shield совместно с модулем подтяжки.
Выведем температуру сенсора в Serial-порт.
// библиотека для работы с протоколом 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-порт.
// библиотека для работы с протоколом 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); }
Рассмотрим простой пример — подключения одного датчика.
Сенсор подключается к управляющей плате через один сигнальный пин. При подключении к Iskra в компактном формфакторе, например Iskra JS Mini, воспользуйтесь макетной платой и парочкой нажимных клеммников.
Между сигнальным проводом и питанием установите сопротивление 4,7 кОм.
При коммуникации сенсора с платой Iskra JS, используйте Troyka Slot Shield совместно с модулем подтяжки.
Выведем температуру сенсора в консоль 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 хранит в своей памяти уникальный номер, такое решение позволяет подключить несколько датчиков к одному пину.
Добавим к предыдущем схемам подключения ещё по паре датчиков в параллель.
Найдём все устройства на шине 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. Подключите сенсор к 4
пину Raspberry через модуль подтяжки. Для избежания макеток и проводов используйте плату расширения Troyka Cap.
# подключаем модуль времени 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 хранит в своей памяти уникальный номер, такое решение позволяет подключить несколько датчиков к одному пину.
# подключаем модуль времени 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)