Особенности подключения цифровых датчиков температуры 1-wire. Причины их нестабильности и способы решения проблем связи
Дистанционно определить точную причину нестабильности работы цифровых датчиков температуры нельзя. Точнее это трудно сделать без изучения особенностей объекта и способа их установки.
Прежде всего необходимо проверить правильность подключения и прокладки шлейфа датчика.
Цифровые датчики температуры подключаются к клеммам «1-wire» Контроллера с соблюдением полярности. После подключения датчики обнаруживаются автоматически. При необходимости подключения нескольких цифровых датчиков температуры DS18S20 их нужно собрать в один шлейф и подключить этот шлейф ко входу Контроллера.
- Датчики должны подключаться в шлейф параллельно друг за другом. Подключение «лучевой» схемой не рекомендуется, так как не гарантирует их нормальной работы;
- Удаленность последнего датчика в шлейфе не может превышать 100 м;
- Максимально допустимое расстояние датчика от шлейфа — 0.7 м.
Если Вы используете трехпроводной датчик температуры, то подключить его к Контроллеру можно по такой же двухпроводной схеме:
Самым стабильным является шлейф датчиков, проложенный экранированным проводом МКЭШ, где экран провода подключен к «минусу» контроллера.
Часто при подключении в шлейф нескольких цифровых датчиков температуры причиной неисправности всего шлейфа может быть один неисправный датчик. В этом случае на «+» шлейфа будет заметная (до 1 — 3 Вольт) просадка напряжения относительно номинального значения.
Вторым важным техническим параметром является величина номинального выходного напряжения на «плюсовой» клемме шлейфа с цифровыми датчиками температуры.
Напряжение должно быть в диапазоне 3V-5.5V. Если оно ниже 3-х Вольт — датчики или совсем не работают или связь с ними неустойчивая. Чем ближе к 5-ти Вольт — тем связь стабильнее, а длина самого шлейфа может быть больше.
Если наблюдается нестабильность связи (шлейф длинный/много датчиков), то для повышения напряжения питания цифровых датчиков DS18S20 нужно добавить в схему подключения шлейфа подтяжку от источника питания 5V через резистор 4,7 кОм.
Например, как показано на рисунке:
Третья, и наиболее часто встречающаяся причина потери связи с цифровыми датчиками температуры, импульсные сетевые помехи. Их источником может быть любой э/прибор, включенный на той же фазе, что и ZONT (насос частотник, блок светодиодного освещения и т.п.), или неисправность штатного блока питания ZONT.
Самостоятельно проверить наличие помехи можно выключением основного питание контроллера ZONT. Если связь с датчиками при питании только от резервного аккумулятора становится стабильной, то это свидетельствует о том, что сетевая помеха есть, и надо искать ее источник.
Что рекомендуется предпринять в этом случае:
— заменить блок питания (сетевой адаптер) ZONT на новый или другой, со схожими техническими характеристиками. На нашем сайте предлагается вот такой: Импульсный блок питания 12-24V. — переключить основное питание прибора ZONT на другую фазу, — использовать для подключения блока питания ZONT дополнительный сетевой фильтр или стабилизатор напряжения.
Цифровые проводные датчики температуры чувствительны к импульсным сетевым помехам. Для снижения действия возможных помех и обеспечения стабильной работы датчиков рекомендуется прокладывать линии связи шлейф с датчиками отдельно от силовых кабелей цепей электропроводки помещения. Пересечения с силовыми кабелями производить под прямым углом. Шлейф датчиков должен пересекаться с электропроводкой только под углом 90 градусов.
Примечание: Подключение датчиков рекомендуется выполнять экранированным кабелем МКЭШ или кабелем UTP. При этом экран кабеля и все неподключенные проводники витой пары необходимо подключать с одной стороны, со стороны Контроллера, к “минусу” питания Контроллера.
При особенно сильных помехах можно использовать синфазный фильтр подавления электромагнитных помех номиналом не менее 500 мкГн с допустимым током не менее, чем ток потребления всех подключенных к блоку питания устройств. Фильтр должен быть включен в разрыв цепи питания Контроллера (между блоком питания и контроллером).
Схема подключения синфазного фильтра электромагнитных помех:
Кроме того, не стоит забывать, что качество организации электросети дома: прокладки кабелей, сборки соединений, совместимость и сечение проводов, также могут вызывать появление помех. Скрутки, соединения через коннекторы WAG, незатянутые контакты — все это так или иначе оказывает негативное влияние на работу любых низковольтных цифровых устройств.
Подключение цифровых датчиков температуры
Проводной датчик подключается к специальному входу контроллера. Если требуется контролировать несколько датчиков, то их нужно собрать в один шлейф и подключить этот шлейф ко входу контроллера. При подключении необходимо соблюдать следующие рекомендации:
- Всего можно подключить не более 10-ти датчиков;
- Датчики подключаются на один шлейф параллельно друг за другом;
- Удаленность последнего датчика в шлейфе не может превышать 100 м;
- Максимально допустимое расстояние датчика от шлейфа — 0,7 м;
- Минимально допустимое расстояние между точками подключения датчиков в шлейфе — 0,2м;
- Нельзя прокладывать шлейф с датчиками в одном кабельном канале с электропроводкой помещения;
- Датчики подвержены импульсным сетевым помехам.
Подключение трехпроводного датчика
Трехпроводной датчик подключается по двухпроводной схеме: при таком подключении необходимо соединить вместе черный и красный провод и подключить их к проводу шлейфа на контакт 5, а желтый провод подключить к проводу шлейфа контакт 6.

Подключение двухпроводного датчика
Необходимо синий провод подключить к минусовому проводу шлейфа, а коричневый провод подключить к сигнальному (плюсовому) проводу шлейфа.

Приборы ZONT работают с цифровыми датчиками температуры DS18S20 и DS18B20
Особенности их эксплуатации, рекомендуемые схемы подключения и способы защиты от помех можно посмотреть здесь:










607630, Россия, Нижегородская область, г. Нижний Новгород, сельский поселок Кудьма, улица Заводская, строение 2, помещение 1
Взаимодействие нескольких DS18B20, цифровых датчиков температуры, с Arduino
Одним из самых больших преимуществ датчиков температуры DS18B20 является то, что на одной шине 1-Wire могут сосуществовать несколько таких датчиков. Поскольку каждый DS18B20 имеет уникальный 64-битный последовательный код, зашитый на заводе, их легко отличать друг от друга.

В следующем руководстве показано, как подключить несколько датчиков DS18B20 к одной шине и получать показания температуры от каждого из них. Эта функция может быть огромным преимуществом, если вы хотите управлять несколькими датчиками DS18B20, распределенными по большой площади.
Это может показаться пугающим, но, прежде чем углубляться в это руководство, вы должны быть знакомы с основами работы с однопроводными датчиками температуры DS18B20. Если вы не знакомы с ними, посмотрите следующую статью:
А теперь, без дальнейших задержек, давайте подключим датчики DS18B20 к нашей плате Arduino.
Подключение нескольких датчиков DS18B20 к Arduino
Подключение довольно простое.
Начните с подключения всех датчиков DS18B20 параллельно, то есть объединения всех выводов VDD, выводов GND и сигнальных выводов. Затем подключите шину VDD к выходу 5V на Arduino, GND к выводу земли Arduino, и подключите сигнальные выводы к цифровому выводу 2 на Arduino.
Затем, чтобы обеспечить стабильную передачу данных, вам нужно добавить один подтягивающий резистор 4,7 кОм для всей шины между сигнальными выводами и выводами питания (внутренние подтягивающие резисторы на ардуино не работают).

Установка библиотеки для DS18B20
Протокол Dallas 1-Wire несколько сложен и требует много кода для парсинга связи. Чтобы скрыть эту ненужную сложность, мы установим библиотеку DallasTemperature.h, чтобы мы могли выполнять простые команды для получения показаний температуры от датчика.
Чтобы установить библиотеку, перейдите в раздел «Скетч»→ «Подключить библиотеку» → «Управление библиотеками…». Подождите, пока менеджер библиотеки загрузит индекс библиотек и обновит список установленных библиотек.

Чтобы отфильтровать результаты поиска, введите « ds18b20 ». Там должна быть пара записей. Ищите DallasTemperature от Miles Burton. Нажмите на эту запись, а затем выберите Установка.

Эта библиотека DallasTemperature является аппаратно-зависимой библиотекой, которая обрабатывает функции более низкого уровня. Она должна быть связана с библиотекой OneWire для связи с любым устройством 1-Wire, а не только с DS18B20. Установите и эту библиотеку.

Способ 1: чтение показаний DS18B20 по индексу
В этом методе библиотека Dallas Temperature при инициализации обнаруживает все датчики, использующие одну шину. Она рассматривает всю шину как массив датчиков и присваивает им индексы. Поэтому мы можем точно выбрать каждый датчик по его индексу и прочитать показания температуры.
#include #include // линия данных подключена к цифровому выводу 2 Arduino #define ONE_WIRE_BUS 2 // настройка объекта oneWire для связи с любым устройством OneWire OneWire oneWire(ONE_WIRE_BUS); // передать ссылку на oneWire библиотеке DallasTemperature DallasTemperature sensors(&oneWire); int deviceCount = 0; float tempC; void setup(void) < sensors.begin(); // запустить библиотеку Serial.begin(9600); // найти устройства на шине Serial.print("Locating devices. "); Serial.print("Found "); deviceCount = sensors.getDeviceCount(); Serial.print(deviceCount, DEC); Serial.println(" devices."); Serial.println(""); >void loop(void) < // послать команду всем датчикам для преобразования температуры sensors.requestTemperatures(); // отобразить температуру с каждого датчика for (int i = 0; i < deviceCount; i++) < Serial.print("Sensor "); Serial.print(i+1); Serial.print(" : "); tempC = sensors.getTempCByIndex(i); Serial.print(tempC); Serial.print((char)176);// напечатать символ градусов Serial.print("C | "); Serial.print(DallasTemperature::toFahrenheit(tempC)); Serial.print((char)176);// напечатать символ градусов Serial.println("F"); >Serial.println(""); delay(1000); >
Вывод вышеприведенного скетча выглядит так:

Объяснение кода
Скетч начинается с включения библиотек, объявления вывода, к которому подключена шина датчиков, и создания объекта библиотеки DallasTemperature .
В настроечной части кода мы сначала вызываем функцию begin() . Она инициализирует шину и обнаруживает все DS18B20, присутствующие на ней. Затем каждому датчику присваивается индекс и устанавливается разрешение в 12 бит.
Затем мы вызываем функцию getDeviceCount() , чтобы получить количество устройств, найденных на шине.
В циклической части кода мы используем функцию requestTemperatures() , чтобы отправить команду всем датчикам для преобразования температуры.
Способ 2: чтение датчика DS18B20 по адресу
Мы знаем, что каждому DS18B20 назначен уникальный 64-битный адрес, чтобы отличать их друг от друга. В этом методе мы найдем этот адрес для соответствующей маркировки каждого датчика. Затем этот адрес можно использовать для считывания каждого датчика в отдельности.
Поиск адресов датчиков DS18B20s на шине
Следующий скетч обнаруживает все DS18B20, присутствующие на шине, и печатает их адреса на 1-Wire в монитор последовательного порта.
Вы можете подключать только один датчик за раз, чтобы определить его адрес (или последовательно добавлять по одному новому датчику, чтобы вы могли идентифицировать каждый из них по его адресу). Затем вы можете пометить каждый датчик.
#include #include // линия данных подключена к цифровому выводу 2 Arduino #define ONE_WIRE_BUS 2 // настройка объекта oneWire для связи с любым устройством OneWire OneWire oneWire(ONE_WIRE_BUS); // передать ссылку на oneWire библиотеке DallasTemperature DallasTemperature sensors(&oneWire); // переменная для хранения адресов устройств DeviceAddress Thermometer; int deviceCount = 0; void setup(void) < // запустить последовательный порт Serial.begin(9600); // запустить библиотеку sensors.begin(); // найти устройства на шине Serial.println("Locating devices. "); Serial.print("Found "); deviceCount = sensors.getDeviceCount(); Serial.print(deviceCount, DEC); Serial.println(" devices."); Serial.println(""); Serial.println("Printing addresses. "); for (int i = 0; i < deviceCount; i++) < Serial.print("Sensor "); Serial.print(i+1); Serial.print(" : "); sensors.getAddress(Thermometer, i); printAddress(Thermometer); >> void loop(void) <> void printAddress(DeviceAddress deviceAddress) < for (uint8_t i = 0; i < 8; i++) < Serial.print("0x"); if (deviceAddress[i] < 0x10) Serial.print("0"); Serial.print(deviceAddress[i], HEX); if (i < 7) Serial.print(", "); >Serial.println(""); >
Теперь откройте монитор последовательного порта. Вы должны получить что-то подобное:

Скопируйте все адреса, так как они нам понадобятся в следующем скетче.
Чтение показаний датчиков DS18B20 по адресу
Следующий скетч считывает температуру датчиков DS18B20 по их адресам. Прежде чем приступить к загрузке скетча, вам нужно изменить адреса датчиков DS18B20 на те, которые вы определили в предыдущем скетче.
#include #include // линия данных подключена к цифровому выводу 2 Arduino #define ONE_WIRE_BUS 2 // настройка объекта oneWire для связи с любым устройством OneWire OneWire oneWire(ONE_WIRE_BUS); // передать ссылку на oneWire библиотеке DallasTemperature DallasTemperature sensors(&oneWire); // адреса трех датчиков DS18B20 uint8_t sensor1[8] = < 0x28, 0xEE, 0xD5, 0x64, 0x1A, 0x16, 0x02, 0xEC >; uint8_t sensor2[8] = < 0x28, 0x61, 0x64, 0x12, 0x3C, 0x7C, 0x2F, 0x27 >; uint8_t sensor3[8] = < 0x28, 0x61, 0x64, 0x12, 0x3F, 0xFD, 0x80, 0xC6 >; void setup(void) < Serial.begin(9600); sensors.begin(); >void loop(void) < sensors.requestTemperatures(); Serial.print("Sensor 1: "); printTemperature(sensor1); Serial.print("Sensor 2: "); printTemperature(sensor2); Serial.print("Sensor 3: "); printTemperature(sensor3); Serial.println(); delay(1000); >void printTemperature(DeviceAddress deviceAddress)
Вывод вышеприведенного эскиза выглядит так

Объяснение кода
Как обычно, скетч начинается с включения библиотек, объявления вывода, к которому подключена шина датчиков, и создания объекта библиотеки DallasTemperature .
Далее мы вводим адреса, которые были найдены ранее для каждого датчика температуры. В нашем случае имеем следующее.
uint8_t sensor1[8] = < 0x28, 0xEE, 0xD5, 0x64, 0x1A, 0x16, 0x02, 0xEC >; uint8_t sensor2[8] = < 0x28, 0x61, 0x64, 0x12, 0x3C, 0x7C, 0x2F, 0x27 >; uint8_t sensor3[8] = < 0x28, 0x61, 0x64, 0x12, 0x3F, 0xFD, 0x80, 0xC6 >;
Во фрагменте настройки мы инициализируем библиотеку путем вызова функции begin() и инициализируем последовательную связь с ПК.
В цикле мы просто посылаем команду всем датчикам для преобразования температуры, используя функцию requestTemperatures() .
Затем, чтобы напечатать температуру датчика, мы вызываем пользовательскую функцию printTemperature(DeviceAddress deviceAddress) , для которой deviceAddress передается в качестве параметра.
void printTemperature(DeviceAddress deviceAddress)
Вышеприведенная функция просто вызывает библиотечные функции getTempC(deviceAddress) для отображения температуры в градусах Цельсия и DallasTemperature::toFahrenheit() для отображения температуры в градусах Фаренгейта.
Теги
Сохранить или поделиться
На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.
В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.
2021-10-10 baksser
Ясен пень тоже самое, но без функций и лишних печатей. Вы этим уроком что хотели преподнести? Как функции работают или как датчики подключать. Уроки для начинающих? Надо думать как начинающий. Нахрена туда пихать лишнее. Кое как разобрался в вашей писанине. Проще надо быть и люди потянутся.
2021-10-09 radioprog
Что именно усложнено? Какие циклы?
Вы переписали всё то же самое, но без отдельной функции печати температуры в градусах Цельсия и Фаренгейта с символами градусов ‘°’.
2021-10-05 baksser
Трындец всё как сложно запутываете нет чтобы тремя простыми словами нет надо циклы мутить запутанные.
#include
#include
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
void setup(void)
Serial.begin(115200);
sensors.begin();
>
void loop(void)
sensors.requestTemperatures();
Serial.print(«температура»);
Serial.print(sensors.getTempC(sensor1));
Serial.print(«температура»);
Serial.print(sensors.getTempC(sensor2));
Serial.print(«температура»);
Serial.print(sensors.getTempC(sensor3));
delay(1000);
>
И всё. Чё усложнять?
2020-12-14 Dmitry Bezborodov
Здравствуйте. Подскажите, пожалуйста, в каком порядке датчикам присваиваются индексы? Могут ли одни и те же датчики получать разные индексы? Спасибо.
Подключение нескольких DS18B20 к ESP32

В этом руководстве рассказывается, как считывать показания с нескольких датчиков температуры DS18B20 посредством микросхемы ESP32 с помощью среды разработки Arduino IDE.
Мы покажем, как к одной шине данных ESP32 подключить несколько датчиков, установим необходимые библиотеки и приведём простой пример, который вы сможете использовать в своих проектах. Эта инструкция подходит также для плат семейства ESP8266 и различных платформ Arduino.

Описание датчика температуры DS18B20
DS18B20 — цифровой датчик температуры с возможностью подключения одним проводом. Каждому датчику присвоен уникальный 64‑битный серийный номер, что позволяет использовать множество датчиков на одной шине данных (т. е. множество датчиков, подключённых к одной линии ввода-вывода общего назначения).
Это особенно полезно для проектов с регистрацией данных и управлением температурой. DS18B20 — прекрасный датчик, поскольку он недорог, точен и его очень просто использовать.

Распиновка слева-направо: первый вывод — заземление GND, второй — данные, третий, крайний справа, — питание VCC.
Примечание: также существует водонепроницаемая версия датчика температуры DS18B20.
Основные характеристики датчика температуры DS18B20:
- Связь поддерживается посредством однопроводной шины
- Рабочий диапазон температуры: -55…+125 °C
- Точность: ±0,5 °C (при температуре от -10 до +85 °C)
Подключение нескольких датчиков DS18B20
Для подключения датчика температуры DS18B20 вам нужно подключить резистор на 4,7 кОм между питанием VCC и линией данных. На следующей схеме показан пример для трёх датчиков (при необходимости вы можете добавить их еще больше).

На вышеприведённой схеме датчик повёрнут закруглённой стороной к нам. Плоская сторона смотрит в обратную сторону.
Подготовка среды разработки Arduino IDE
Для среды Arduino IDE существует дополнение, которое позволяет программировать микросхему ESP32 посредством этой среды и её языка программирования.
Скоро выйдет отдельный материал, как подготовить среду Arduino IDE для работы с ESP32.
Установка библиотек
Перед загрузкой кода вам необходимо установить две библиотеки в среду Arduino IDE. Библиотека OneWire Пола Штоффрегена и библиотека Dallas Temperature. Выполните следующие шаги, чтобы установить эти библиотеки.
Библиотека OneWire
- Библиотека OneWire скачиватся здесь. После скачивания, в вашей папке с загрузками должен появиться архивный файл с расширением .zip (например, в папке Downloads — «Загрузки»).
- Разархивируйте файл с расширением .zip — должна появиться папка OneWire-master.
- Смените название папки OneWire-master на OneWire.
- Переместите папку OneWire в папку с установленными библиотеками среды Arduino IDE.
- Перезапустите среду Arduino IDE для подгрузки бибоиотеки.
Библиотека Dallas Temperature
- Библиотека DallasTemperature скачивается здесь. В вашей папке с загрузками должен появиться архивный файл с расширением .zip (например, в папке Downloads — «Загрузки»).
- Разархивируйте файл с расширением .zip — должна появиться папка Arduino-Temperature-Control-Library-master.
- Смените название папки Arduino-Temperature-Control-Library-master на DallasTemperature
- Переместите папку DallasTemperature в папку с установленными библиотеками среды Arduino IDE
- Перезапустите среду Arduino IDE.
Получение адреса датчика DS18B20
Каждому датчику температуры DS18B20 еще на заводе назначается свой серийный номер. В первую очередь вам необходимо узнать этот номер, чтобы промаркировать с его помощью соответствующий датчик. Это необходимо для того, чтобы позже вы могли понять, от какого именно датчика получены показания температуры.
Загрузите следующий код в микросхему ESP32. Убедитесь, что выбрали правильную плату и последовательный COM-порт.