FLProg — Урок 17. Как подключить несколько датчиков ds18b20 к одной шине
FLProg — Урок 17. Как подключить несколько датчиков ds18b20 к одной шине.
Ссылки на используемые компоненты:
Датчик температуры DS18b20 — http://ali.pub/y34um
ЖК-дисплей LCD1602 (синий экран)- http://ali.pub/alnru
Модуль расширителя интерфейса (I2C)- http://ali.pub/dwj5n
Урок 17 — Как подключить несколько датчиков ds18b20 к одной шине
![]()
Оставьте комментарий:
Навигация по сайту:
Юный Технарь:
Помощь проекту:
Деньги можно перечислить на карту Сбербанка России:
4276 5400 2194 5088
Поиск
Последние статьи
Вторая жизнь раритетных часов ЭЧЛ
Вторая жизнь раритетных часов ЭЧЛ.
Игра — «кто быстрее» и цикличный таймер …
Игра — «кто быстрее» и цикличный таймер на Ардуино.
Мой канал на YouTube

Подпишитесь!
![]()
2015, Arduinoprom.ru — блог Чилингаряна Грачика. Все авторские права на тексты принадлежат ему.
При размещении текстов и видеоматериалов на сторонних ресурсах активная гиперссылка ОБЯЗАТЕЛЬНА.
Все логотипы и товарные знаки, размещенные на сайте, принадлежат только их законным владельцам (правообладателям).
Взаимодействие нескольких 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-порт.
Как подключить несколько датчиков к ардуино
Как два датчика подключить?
- Автор темы Alexander67
- Дата начала 26 Апр 2020
Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно.
Вам необходимо обновить браузер или попробовать использовать другой.
Alexander67
26 Апр 2020 22 1
Здравствуйте. приехало это чудо с алиэкспресса. https://aliexpress.ru/item/32849462236.html
один датчик работает отлично, второй не знаю как подключить. хочу его в корпусе на улицу вынести. в интернетах читал надо один датчик вешать на 76 канал второй на 77, как это сделать у кого был опыт? Или есть другие варианты? Подключения без белой печатной платы.
И ещё вопрос либо без белой платы ничего не выйдет?
Raspberry pi 3. Собираю метеостанцию.
Сильно не питайте. жду конструктивные советы.
Старик Похабыч
14 Авг 2019 4,112 1,259 Москва
Все верно сказали. надо что бы у датчиков были разные адреса. у тебя какой адрес стоит ?
Вот тебе документ https://www.bosch-sensortec.com/media/boschsensortec/downloads/datasheets/bst-bme280-ds002.pdf
пункт 7.1 — распиновка датчика. Там есть контакт SDO, он либо к земле притянут либо Vcc, что дает разные адреса.

Если смотреть на поату, то он идет от левого нижнего пина чипа к средней ногое и тут похоже к земле. если есть перемычка между платформой над буквой B и платформой над буковй M. Мультиметр в руки . Соотв. ненужную связь разрушить, а нужную запаять.
Alexander67
26 Апр 2020 22 1
Ой страшно это что то там. в датчике мутить. Вот только как второй датчик подключить если на «Малинке SCL, SDA. в одном экземпляре.
kalobyte
1 Янв 2020 726 146
ну так эта шина и позволяет подключать параллельно много периферии
для этого у них и есть адреса и выводы установки адреса
на фиолетовой плате он там даже площадки для напайки перемычек есть, можно 2 таких датчика подключить при таком раскладе
если еще какой другой датчик, то у него и адрес другой и они указаны в даташитее и надо смотреть еще разводку платы, потому что китайцы делают разные платы и выставляют разные адреса
такой глюк есть в платах расширителях для жк индикатора на хитачевском контроллере
еще в ардуине где-то был скетч i2c scanner называелся и он позволяет выявить все адреса всех устройств на шине
а под линупс он тоже есть и идет в составе i2c-util
Старик Похабыч
14 Авг 2019 4,112 1,259 Москва
@kalobyte, Точно! Напомнил про один ролик. Убил 5 минут, но нашел:
Alexander67
26 Апр 2020 22 1
На видео снова с этой с белой платой, объясните, нужна она или нет?
Старик Похабыч
14 Авг 2019 4,112 1,259 Москва
нужна плата на 1:38
Alexander67
26 Апр 2020 22 1
А тогда какую посоветуете? вот эта подойдёт? https://aliexpress.ru/item/32910834320.html
Старик Похабыч
14 Авг 2019 4,112 1,259 Москва
Alexander67
26 Апр 2020 22 1
Такой вопрос, если датчик подключить в USB-uart порт к Raspberry pi 3, то адрес вроде не надо менять? только датчик надо на 5 вольт покупать?
Изменено: 29 Апр 2020
kostyamat
29 Окт 2019 1,095 629
@Alexander67, вы что, прикалываетесь? Каким образом UART-USB мост сможет помочь вам в подключении I2C датчика?
Вам же сверху написали — берете два датчика, на одном из них, запаяв/убрав (нужно даташит смотреть) перемычку, меняете адрес, подключаете оба паралельно и все работает. Тупо проводами, без белых/розовых/голубых/зелёных/и т.п. платок.
Че вам не ймется то?

Вот, читайте https://robotchip.ru/bme280-datchik-atmosfernogo-davleniya-vlazhnosti-i-temperatury/
Чтобы получить альтернативный адрес: красное — разрезать соединение между пятаками, зелёное — соеденить пятаки. Получите адрес 76h, второй датчик оставить как есть, у него адрес 77h