Термометр ds18b20. основы
Содержание:
- Программа 2
- Несколько слов о термостатах
- Описание модуля KY-013 – аналоговый датчик температуры.
- Исходный код программы
- Шаг 4. Электроника
- Работа схемы
- Upload Code – Single DS18B20
- Принципиальные схемы
- Wrapping Up
- DS18B20 with I2C LCD example code
- Датчик DS18B20: схема построения
- Общие принципы работы датчика температуры DS18B20
- Cable Type
- Other functions of the DallasTemperature Arduino library
- Distance
- Назначение выводов
Программа 2
Теперь будем выводить такую строку: “температура с момента запуска программы” -> “текущая температура”. Может быть полезным для исследования изменения температуры. Нам нужно завести переменную для хранения первого значения, назовём её . При запуске программы запросим температуру с датчика, подождём, запишем результат в переменную и будем выводить на дисплей как в предыдущем примере:
#include <LiquidCrystal_I2C.h> // подключаем библу LiquidCrystal_I2C lcd(0x27, 16, 2); // адрес, столбцов, строк #include <microDS18B20.h> MicroDS18B20<2> sensor; float prevT; // переменная для хранения температуры void setup() { lcd.init(); // инициализация lcd.backlight(); // включить подсветку sensor.requestTemp(); // запрос температуры delay(1000); // ждём prevT = sensor.getTemp(); // запомнили } void loop() { sensor.requestTemp(); // запрос температуры delay(1000); // ждём lcd.home(); // курсор в 0,0 lcd.print(prevT, 1); // вывод prevT с точностью 1 знак lcd.write(223); // градус lcd.print(' '); // пробел lcd.write(126); // стрелочка lcd.print(' '); // пробел lcd.print(sensor.getTemp(), 1); // текущая температура lcd.write(223); // градус }
Также можно вывести время, прошедшее с момента запуска программы, например в формате часы:секунды.
- У нас есть функция , которая возвращает время работы программы в миллисекундах.
- даст нам секунды, запишем в переменную .
- Чтобы получить количество секунд в пределах одной минуты, разделим секунды на 60:
- Чтобы получить количество минут из общего количества секунд – нужно выполнить операцию остаток от деления, опять же на 60:
- Чтобы выводить значения с ведущим нулём (например 03 вместо 3), сделаем простое условие:
- Обернём вывод времени в функцию для лучшей читаемости кода
#include <LiquidCrystal_I2C.h> // подключаем библу LiquidCrystal_I2C lcd(0x27, 16, 2); // адрес, столбцов, строк #include <microDS18B20.h> MicroDS18B20<2> sensor; float prevT; // переменная для хранения температуры void setup() { lcd.init(); // инициализация lcd.backlight(); // включить подсветку sensor.requestTemp(); // запрос температуры delay(1000); // ждём prevT = sensor.getTemp(); // запомнили } void loop() { sensor.requestTemp(); // запрос температуры delay(1000); // ждём lcd.home(); // курсор в 0,0 lcd.print(prevT, 1); // вывод prevT с точностью 1 знак lcd.write(223); // градус lcd.print(' '); // пробел lcd.write(126); // стрелочка lcd.print(' '); // пробел lcd.print(sensor.getTemp(), 1); // текущая температура lcd.write(223); // градус printTime(); // выводим время } // функция вывода времени void printTime() { lcd.setCursor(0, 1); // курсор на вторую строку int sec = millis() / 1000; // общее количество секунд byte thisM = sec / 60; // количество минут if (thisM < 10) lcd.print(0); // ведущий 0 lcd.print(thisM); // минуты lcd.print(':'); // двоеточие byte thisS = sec % 60; // количество секунд if (thisS < 10) lcd.print(0); // ведущий 0 lcd.print(thisS); // секунды }
Несколько слов о термостатах
Для того чтобы правильно выбрать термостат для совместной работы с Arduino, необходимо понимать принцип их работы и знать классификацию, поскольку не все они могут работать в паре.
Существует несколько типов термостатов, которые используются в бытовой системе отопления:
- Высокого напряжения — самый простой вариант, как правило, работает непосредственно на нагревательном приборе радиаторе или конвекторе, запитан от сети 220 В. Принцип управления температурой прост: при высокой температуре воздуха в помещении, проход теплоносителя через радиатор уменьшается, вплоть до полной остановки, а при низкой — наоборот.
- Низкого напряжения, на сегодняшний день это самый распространенный вариант для домашних систем отопления. Его главное отличие от первого типа, он запитан от низкого напряжения, как правило, 24 В, а объектом управления является источник нагрева: газовый, твердотопливный или электрокотел. Они сами не контролируют и не управляют подачей теплоносителя, а сообщают источнику отопления, что делать, в зависимости от температуры окружающей среды: закрыть или открыть подачу газа в котел, включить или отключить подачу напряжения на ТЭН в отопительном контуре электрокотла. В твердотопливном котле процесс регулирования осуществляется путем подачи определенного объема дутьевого воздуха в топку, например, при закрытии заслонки, воздух поступать в котел не будет и горение твердого топлива прекратится.
- Умные термостаты еще более функциональные. Они, как правило, имеет погодозависимое управление тепловым процессом. Тепловой режим котла поддерживается по температуре наружного воздуха. Такие термостаты хорошо интегрируются в систему «Умный дом».
Описание модуля KY-013 – аналоговый датчик температуры.
Модуль аналогового датчика температуры KY-013 для Arduino измеряет температуру окружающей среды за счет изменения сопротивления термистора. Данный модуль можно подключать к различным микроконтроллерам (Arduino, ESP32, ESP8266, stm32 и пр.) для измерения температуры окружающей среды.
Технические характеристики KY-013:
- Рабочее напряжение -5В;
- Диапазон измерения температуры — от -55 до 125 ° C;
- Точность измерения — ± 0,5 ° С;
Модуль аналогового датчика температуры KY-013 состоит из термистора NTC и резистора 10 кОм. Сопротивление термистора зависит от температуры окружающей среды, мы воспользуемся уравнением Стейнхарта – Харта, чтобы получить точную температуру термистора.
Схема подключения KY-013 аналогового датчика температуры к Arduino NANO.
Подключаем линию питания платы (посередине) и землю (-) к 5 В и GND соответственно. Затем сигнал (S) к контакту A0 на Arduino.
Внимание! Не забывайте про вероятность, что на некоторых платах нанесена неправильная разметка контактов, о чем я рассказывал в начале урока
Пример кода Arduino для получения значений температуры с датчика KY-013.
В следующем скетче Arduino будет вычисляться температура термистора с использованием уравнения Стейнхарта-Харта. Код вернет температуру в градусах Цельсия.
int ThermistorPin = A0; int Vo; float R1 = 10000; // значение R1 на модуле float logR2, R2, T; float c1 = 0.001129148, c2 = 0.000234125, c3 = 0.0000000876741; //коэффициенты Штейнхарта-Харта для термистора void setup() { Serial.begin(9600); } void loop() { Vo = analogRead(ThermistorPin); R2 = R1 * (1023.0 / (float)Vo - 1.0); //вычислите сопротивление на термисторе logR2 = log(R2); T = (1.0 / (c1 + c2*logR2 + c3*logR2*logR2*logR2)); // температура в Кельвине T = T - 273.15; //преобразование Кельвина в Цельсия Serial.print("Temperature: "); Serial.print(T); Serial.println(" C"); delay(500); }
Коэффициенты применимы только к платам с термисторами 10 кОм, некоторые редкие платы имеют термисторы на 100 кОм и требуют других коэффициентов.
Исходный код программы
Полный код программы представлен в конце статьи, здесь же сначала рассмотрим его наиболее важные фрагменты.
Для выполнения математических операций в программе мы должны подключить заголовочный файл библиотеки “#include <math.h>”, а для работы с ЖК дисплеем – подключить библиотеку “#include <LiquidCrystal.h>». Далее в функции setup() мы должны инициализировать ЖК дисплей.
Arduino
Void setup(){
lcd.begin(16,2);
lcd.clear();
}
1 |
Voidsetup(){ lcd.begin(16,2); lcd.clear(); } |
Значение температуры мы будем рассчитывать в программе с помощью рассмотренного выше уравнения Стейнхарта-Харта.
Arduino
float a = 1.009249522e-03, b = 2.378405444e-04, c = 2.019202697e-07;
float T,logRt,Tf,Tc;
float Thermistor(int Vo) {
logRt = log(10000.0*((1024.0/Vo-1)));
T = (1.0 / (A + B*logRt + C*logRt*logRt*logRt));// рассчитываем значение температуры в кельвинах по формуле Stein-Hart
Tc = T — 273.15; // переводим температуру из кельвинов в градусы Цельсия
Tf = (Tc * 1.8) + 32.0; // переводим температуру в шкалу Фаренгейта
return T;
}
1 |
floata=1.009249522e-03,b=2.378405444e-04,c=2.019202697e-07; floatT,logRt,Tf,Tc; floatThermistor(intVo){ logRt=log(10000.0*((1024.0Vo-1))); T=(1.0(A+B*logRt+C*logRt*logRt*logRt));// рассчитываем значение температуры в кельвинах по формуле Stein-Hart Tc=T-273.15;// переводим температуру из кельвинов в градусы Цельсия Tf=(Tc*1.8)+32.0;// переводим температуру в шкалу Фаренгейта returnT; } |
Также в программе мы считываем значение с аналогового входа платы Arduino.
Arduino
lcd.print((Thermistor(analogRead(0))));
1 | lcd.print((Thermistor(analogRead()))); |
Внешний вид работы нашего проекта показан на следующем рисунке – на ЖК дисплее выводятся значения температуры в кельвинах, градусах Цельсия и по шкале Фаренгейта.
Схему можно запитать по кабелю USB или использовать адаптер на 12 В.
Далее представлен полный текст программы.
Arduino
#include <math.h>
#include «LiquidCrystal.h»
LiquidCrystal lcd(44,46,40,52,50,48);
float A = 1.009249522e-03, B = 2.378405444e-04, C = 2.019202697e-07;
float T,logRt,Tf,Tc;
float Thermistor(int Vo) { // функция для расчета значения температуры
logRt = log(10000.0*((1024.0/Vo-1)));
T = (1.0 / (A + B*logRt + C*logRt*logRt*logRt)); // рассчитываем значение температуры в кельвинах по формуле Стейнхарта-Харта
Tc = T — 273.15; // переводим температуру из кельвинов в градусы
Tf = (Tc * 1.8) + 32.0; // переводим температуру в шкалу Фаренгейта
return T;
}
void setup(){
lcd.begin(16,2);
lcd.clear();
}
void loop()
{
lcd.setCursor(0,0);
lcd.print(«Temp:»);
lcd.print((Thermistor(analogRead(0))));
lcd.print(«k «);
lcd.setCursor(0,1);
lcd.print((Tc));
lcd.print(» C ;»);
lcd.setCursor(9,1);
lcd.print((Tf));
lcd.print(» F»);
delay(800);
}
1 |
#include <math.h> LiquidCrystallcd(44,46,40,52,50,48); floatA=1.009249522e-03,B=2.378405444e-04,C=2.019202697e-07; floatT,logRt,Tf,Tc; floatThermistor(intVo){// функция для расчета значения температуры logRt=log(10000.0*((1024.0Vo-1))); T=(1.0(A+B*logRt+C*logRt*logRt*logRt));// рассчитываем значение температуры в кельвинах по формуле Стейнхарта-Харта Tc=T-273.15;// переводим температуру из кельвинов в градусы Tf=(Tc*1.8)+32.0;// переводим температуру в шкалу Фаренгейта returnT; } voidsetup(){ lcd.begin(16,2); lcd.clear(); } voidloop() { lcd.setCursor(,); lcd.print(«Temp:»); lcd.print((Thermistor(analogRead()))); lcd.print(«k «); lcd.setCursor(,1); lcd.print((Tc)); lcd.print(» C ;»); lcd.setCursor(9,1); lcd.print((Tf)); lcd.print(» F»); delay(800); } |
Шаг 4. Электроника
Теперь, когда вы собрали все необходимые компоненты, пришло время начать сборку всего вместе. Я бы порекомендовал сначала подключить все на макете, а затем, как только все заработало, приступить к пайке.
Схема нашего устройства (нажмите на схему для увеличения):
Слева у нас есть наш лазер с токоограничивающим резистором 200 Ом, управляемый от цифрового выхода 5. Также есть стандартная кнопка, которая подключена между 5 В и цифровым входом 2. Есть подтягивающий резистор 5 кОм, чтобы когда переключатель разомкнут, на вход ничего не идет, а вместо этого устанавливается на 0 В.
Справа у нас есть основной выключатель, который соединяет нашу батарею 9 В с выводами VIN и GND на Arduino Nano. Дисплей OLED и инфракрасный датчик температуры GY-906 подключены к 3,3 В, а линии SDA подключены к A4, а SCL к A5. На дисплее и GY-906 уже есть подтягивающие резисторы на линиях I2C.
По теме: Инфракрасный датчик температуры MLX90614
Работа схемы
Схема устройства представлена на следующем рисунке.
При изменении температуры изменяется сопротивление терморезистора (термистора). Но в нашей схеме мы не будем измерять сопротивление термистора напрямую, вместо этого мы использовали делитель напряжения, одним из резисторов которого является известное сопротивление 10 кОм, а вторым – наш терморезистор. Средняя точка делителя напряжения подключена к аналоговому входу A0 платы Arduino, поэтому при помощи аналогово-цифрового преобразования (АЦП) на этом контакте мы можем определить падение напряжение на терморезисторе в любой момент времени и, следовательно, и его сопротивление. Благодаря этим данным мы по формулам, приведенным ниже в данной статье, можем определить значение температуры.
Upload Code – Single DS18B20
To interface with the DS18B20 temperature sensor, you need to install the One Wire library by Paul Stoffregen and the Dallas Temperature library. Follow the next steps to install those libraries.
Installing Libraries
1. Open your Arduino IDE and go to Sketch > Include Library > Manage Libraries. The Library Manager should open.
2. Type “OneWire” in the search box and install the OneWire library by Paul Stoffregen.
3. Then, search for “Dallas” and install the Dallas Temperature library by Miles Burton.
After installing the needed libraries, upload the following code to your Arduino board. This sketch is based on an example from the Dallas Temperature library.
There are many different ways to get the temperature from DS18B20 temperature sensors. If you’re using just one single sensor, this is one of the easiest and simplest ways.
How the Code Works
Start by including the OneWire and the DallasTemperature libraries.
Create the instances needed for the temperature sensor. The temperature sensor is connected to Pin 4.
In the setup(), initialize the Serial Monitor at a baud rate of 9600.
Initialize the DS18B20 temperature sensor:
In the loop() is where you’ll get the temperature. You need to call the requestTemperatures() method before getting the actual temperature value.
Then, get and print the temperature in Celsius. To get the temperature in Celsius, use the getTempCByIndex() method :
Or use the getTempFByIndex() to get the temperature in Fahrenheit.
The getTempCByIndex() and the getTempFByIndex() methods accept the index of the temperature sensor. Because we’re using just one sensor its index is 0. If you have more than one sensor, you use index 0 for the first sensor, index 1 for the second sensor, and so on.
New temperature readings are requested every second.
Принципиальные схемы
Передатчик
Передающая часть беспроводного термометра на ATMega328p
(для увеличения масштаба можно кликнуть по картинке правой кнопкой мыши и выбрать «Открыть ссылку/изображение в новой вкладке/новом окне»)
В данном примере я не буду выводить неиспользуемые выводы микроконтроллера на внешние контакты термометра, после чего их можно было бы использовать для дальнейшего усовершенствования устройства. Здесь мы рассматриваем лишь идею для устройства и соберем его только на макетной плате.
Приемник
Приемная часть беспроводного термометра на Arduino Mega
(для увеличения масштаба можно кликнуть по картинке правой кнопкой мыши и выбрать «Открыть ссылку/изображение в новой вкладке/новом окне»)
Пожалуйста, обратите внимание, что приемник построен на базе платы Arduino Mega, которая не изображена на схеме. Для подключения платы Arduino Mega соедините с ней радиочастотный модуль и LCD дисплей согласно метка на схеме
Wrapping Up
The DS18B20 temperature sensor is a one-wire digital sensor. To use this sensor with the Arduino, you need the OneWire and the DallasTemperature libraries. You can use one sensor or multiple sensors on the same data line because you can identify each sensor by its unique address.
Now, you can take this project further and display your sensor readings in an OLED display, for example.
We have more tutorials for other Arduino compatible sensors that you may find useful:
- DHT11/DHT22 Humidity and Temperature Sensor With Arduino
- BME280 (Temperature, Humidity, Pressure) with Arduino
- Relay Module with Arduino
- Ultrasonic Sensor HC-SR04 with Arduino
We hope you’ve found this guide useful.
If you want to learn more about Arduino, take a look at our resources:
- Arduino Step-by-step projects course
- Free Arduino Projects and Tutorials
- Arduino Mini Course
Thanks for reading!
Updated July 2, 2019
DS18B20 with I2C LCD example code
/* DS18B20 1-Wire digital temperature sensor with 16x2 I2C LCD and Arduino example code. More info: https://www.makerguides.com */ // Include the required Arduino libraries: #include <OneWire.h> #include <DallasTemperature.h> #include <LiquidCrystal_I2C.h> // Define to which pin of the Arduino the 1-Wire bus is connected: #define ONE_WIRE_BUS 2 // Create a new instance of the oneWire class to communicate with any OneWire device: OneWire oneWire(ONE_WIRE_BUS); // Pass the oneWire reference to DallasTemperature library: DallasTemperature sensors(&oneWire); LiquidCrystal_I2C lcd(0x27, 16, 2); // Degree symbol: byte Degree[] = { B00111, B00101, B00111, B00000, B00000, B00000, B00000, B00000 }; void setup() { // Start up the library: sensors.begin(); // Start the LCD and turn on the backlight: lcd.init(); lcd.backlight(); // Create a custom character: lcd.createChar(0, Degree); } void loop() { // Send the command for all devices on the bus to perform a temperature conversion: sensors.requestTemperatures(); // Fetch the temperature in degrees Celsius for device index: float tempC = sensors.getTempCByIndex(0); // the index 0 refers to the first device // Print the temperature on the LCD; lcd.setCursor(0,0); lcd.print("Temperature:"); lcd.setCursor(0,1); lcd.print(tempC); lcd.write(0); // print the custom character lcd.print("C"); // Wait 1 second: delay(1000); }
You should see the following output on the LCD:
Датчик DS18B20: схема построения
Прибор DS18B20 имеет сразу 3 ключевых корпуса:
- Сторона ТО-92;
- Стенка SO-150mil;
- Корпус uSOP.
Если говорить о внутренней структуре, то следует рассмотреть небольшую микросхему, которая представлена на рисунке:
Данная микросхема свидетельствует о наличии сразу нескольких ключевых модульных блоков в строении DS18B20, отвечающих за механизм правильного действия устройства.
К еще одному ключевому элементу в структуре термодатчика следует отнести «64-BITROM AND 1-WIREPORT». Это модуль структуры, отвечающий за хранение уникального кода устройства и передачу этого кода во внутреннюю память DS18B20 «SCRATCHPAD». «SCRATCHPAD», в свою очередь, взаимодействуя с регистрами «MEMORY CONTROL LOGIC» и «1-Wire», подает сигнал связи следующим принципиально-важным блокам датчика:
- «TEMPERATURE SENSOR»(система, предназначенная для считывания преобразованных показателей температур);
- «CONFIGURATON REGISTER»(структура, отвечающая за настройку уникальной программируемой точности, которая варьируется от 9 бит до 12 или, если рассматривать градусы Цельсия, от 0.5 °C до 0.0625 °C.);
- «8-BIT CRC GENERATOR»(система, предназначенная сугубо для защитной функции);
- «ALARM HIGH TRIGGER» (блок, ограничивающий нижние пределы температуры DS18B20);
- «ALARM LOW TRIGGER» (система, ограничивающая верхние пределы температуры DS18B20).
Общие принципы работы датчика температуры DS18B20
DS18B20 представляет собой однопроводный цифровой датчик температуры от компании Maxim IC. Выдает значение температуры в градусах Цельсия, способен измерять температуру с 9-12 битной точностью в диапазоне от -55 до 125 градусов Цельсия с точностью +/-0.5 градуса. Каждый датчик DS18B20 имеет 64-битный уникальный номер (Serial number), вытравленный на корпусе датчика, что позволяет подключать огромное число подобных датчиков к одной шине данных. С помощью данного датчика можно измерять температуру воздуха, жидкостей и земли. В некоторых магазинах датчик продается в комплекте с резистором сопротивлением 4,7 кОм.
Особенности датчика DS18B20:
- однопроводный интерфейс (1-Wire interface), что позволяет использовать для подключения датчика только один контакт микроконтроллера (в нашем случае платы Arduino Uno);
- каждый датчик имеет 64-битный уникальный последовательный код (номер), хранящийся в ПЗУ (ROM) датчика;
- способность подключения к одной шине множества датчиков позволяет создавать на его основе приложения для распределенного (в пространстве) измерения температуры;
- не требует никаких внешних компонентов;
- может быть запитан от линии данных;
- поддерживает напряжение питания от 3.0V до 5.5V;
- способен измерять температуру в диапазоне от –55°C до +125°C (–67°F до +257°F) с точностью ±0.5°C (в диапазоне от –10°C до +85°C);
- можно выбрать разрешающую способность (разрешение) датчика: от 9 до 12 бит;
- преобразует значение температуры в 12-битное цифровое слово длительностью 750 мс (max.);
- можно настраивать энергонезависимую (nonvolatile, NV) сигнализацию (сигнал тревоги);
- опции сигнала тревоги позволяют идентифицировать и определить адрес датчика, чья температура не соответствует запрограммированным границам;
- может применяться в устройствах термоконтроля, промышленных системах, потребительских продуктах, термометрах и в любых других системах, где требуется измерение температуры.
Более подробную информацию о принципах работы датчика DS18B20 вы можете посмотреть в следующей статье на нашем сайте.
Cable Type
The recommended wire is CAT5 and you arrange them as a bus or a daisy
chained chained network — helping to avoid transmission line reflection
problems — as opposed to a start network.
Originally the 1 wire protocol was intended for PCB communication only but
its use grew into networked topologies with 100’s of metres of cable. In fact
using special driver considerations, 500m is achievable.
There are many different topologies for DS18B20 layout
including linear, linear with stubs, star network and switched linear (see the
diagrams below). The maxim application note AN148 has a lot of detailed
information on types of networks that can be used:
The following figures are extracts from the that application note.
Other functions of the DallasTemperature Arduino library
The DallasTemperature library has some other useful functions built-in that I have not yet covered in the examples above. I have therefore listed a few of them below:
setResolution()
This function can be used to set the resolution of the temperature-to-digital conversion. As I mentioned in the introduction, this can be set to 9, 10, 11, or 12 bits, corresponding to increments of 0.5 °C, 0.25 °C, 0.125 °C, and 0.0625 °C, respectively.
You might wonder why you would want to change the resolution, isn’t higher always better? One advantage of selecting a lower resolution is that the temperature-to-digital conversion takes a lot less time. This means that you can take more temperature readings in the same amount of time.
From the datasheet I got the following information:
Resolution | Temperature increment | Max conversion time |
---|---|---|
9-bit | 0.5 °C | 93.75 ms |
10-bit | 0.25 °C | 187.5 ms |
11-bit | 0.125 °C | 375 ms |
12-bit | 0.0625 °C | 750 ms |
The DallasTemperature library allows you to set the resolution with the function . This function can be added to the setup or loop section of your code.
You can set the resolution for all the connected sensors as follows:
// Set the resolution for all devices to 9, 10, 11, or 12 bits: sensors.setResolution(9);
Or you can set it individually for a specific sensor by specifying its address:
// Addresses of DS18B20 sensors connected to the 1-Wire bus byte sensor1 = {0x28, 0x18, 0xB4, 0x49, 0x0C, 0x00, 0x00, 0x7C}; // Set the resolution of a specific device to 9, 10, 11, or 12 bits: sensors.setResolution(sensor1, 9);
toFahrenheit()
This function can be used to convert the temperature in degrees Celsius to Fahrenheit.
float tempC = sensors.getTempCbyIndex(0); float tempF = DallasTemperature::toFahrenheit(tempC);
Distance
Some people recommend a 30m maximum but the note below indicates 60m
can be achieved (even further 200m if a fet driver is used):
With any network system transmission line effects come into play and
it can get very complicated (the above application note goes into a
little detail about this).
Also in that note, is the concept of ‘weight’ which is a value assigned to each device added to the bus (Each device has a value of ‘weight’ that shortens the maximum length of cable that can be used). ‘weight’ is measured in metres.
You start from the network ‘weight’, again measured in metres, and is
the total length of cable used in the network — and how much cable can
be driven. The examples quoted in the application note suggest that the
‘weight’ for using a simple pull-up is 200m. However by using active
pull-ups this can be increased to 500m.
Each device added to the network adds a ‘weight’ cost to the network
since it loads the cable with capacitance — reducing the pull-up time
and also consuming power.
You can think of the ‘weight’ cost as the amount of cable «used up by each added device». If you added 30 devices of
‘weight’ cost 1m then the maximum cable length would have to be reduced
by 30m. Note that this is a simple view and the achievable length may be
shorter due to cable connections causing transmission line reflections
but it is a good starting point.
Назначение выводов
Как уже говорилось, есть два варианта поставки термодатчика — микросхема с 8 ножками (8-PIN SOIC) или 3 (ТО-92). Из рисунка ниже видно, какие контакты для чего предназначены, включая их полную распиновку.
Линия связи при подключении должна быть задействована через подтягивающий резистор 4.7 кОм. Требование обуславливается работой самого протокола 1-Wire. Питание корпуса, хоть это и не рекомендуется для температур свыше 100 °С, можно организовать от линии данных шины:
Работа вышеописанной схемы обеспечивается внутренним конденсатором Cpp, накапливающим заряд от линии. Ее минус — в моменты трансляции измеренных данных в цифровой вид, из-за повышенного потребления, мощности может просто не хватить на само устройство. Поэтому и рекомендуется использовать схемы с раздельным питанием.
Схема подключения с использованием внешнего источника будет выглядеть по-другому:
Или же, следуя советам профессионалов, выполнить подключение можно также таким образом:
В представленном варианте, схема будет работать от сохраненного через диод заряда в конденсаторе. К сожалению, необходимость в двух проводах никуда не делась.
Если возникает необходимость в определении именно вида поступающего питания на сенсор, то можно произвести опрос самого термодатчика DS18B20, отправив сначала ему команду CС следом B4. На выходе будет 0, если применяется паразитное питание или 1 при раздельном.