Как подключить несколько датчиков к ардуино
Перейти к содержимому

Как подключить несколько датчиков к ардуино

  • автор:

FLProg — Урок 17. Как подключить несколько датчиков ds18b20 к одной шине

FLProg — Урок 17. Как подключить несколько датчиков ds18b20 к одной шине.

Ссылки на используемые компоненты:

Датчик температуры DS18b20 — http://ali.pub/y34um

ЖК-дисплей LCD1602 (синий экран)- http://ali.pub/alnru

Модуль расширителя интерфейса (I2C)- http://ali.pub/dwj5n

Урок 17 — Как подключить несколько датчиков ds18b20 к одной шине

Урок 17 - Как подключить несколько датчиков ds18b20 к одной шине

Оставьте комментарий:

Навигация по сайту:

Юный Технарь:

Помощь проекту:

Деньги можно перечислить на карту Сбербанка России:

4276 5400 2194 5088

Поиск

Последние статьи

Вторая жизнь раритетных часов ЭЧЛ

Вторая жизнь раритетных часов ЭЧЛ.

Игра — «кто быстрее» и цикличный таймер …

Игра — «кто быстрее» и цикличный таймер на Ардуино.

Мой канал на YouTube

Подпишитесь!

2015, Arduinoprom.ru — блог Чилингаряна Грачика. Все авторские права на тексты принадлежат ему.

При размещении текстов и видеоматериалов на сторонних ресурсах активная гиперссылка ОБЯЗАТЕЛЬНА.

Все логотипы и товарные знаки, размещенные на сайте, принадлежат только их законным владельцам (правообладателям).

Взаимодействие нескольких DS18B20, цифровых датчиков температуры, с Arduino

Одним из самых больших преимуществ датчиков температуры DS18B20 является то, что на одной шине 1-Wire могут сосуществовать несколько таких датчиков. Поскольку каждый DS18B20 имеет уникальный 64-битный последовательный код, зашитый на заводе, их легко отличать друг от друга.

Взаимодействие с несколькими DS18B20, цифровыми датчиками температуры, с Arduino

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

Это может показаться пугающим, но, прежде чем углубляться в это руководство, вы должны быть знакомы с основами работы с однопроводными датчиками температуры DS18B20. Если вы не знакомы с ними, посмотрите следующую статью:

А теперь, без дальнейших задержек, давайте подключим датчики DS18B20 к нашей плате Arduino.

Подключение нескольких датчиков DS18B20 к Arduino

Подключение довольно простое.

Начните с подключения всех датчиков DS18B20 параллельно, то есть объединения всех выводов VDD, выводов GND и сигнальных выводов. Затем подключите шину VDD к выходу 5V на Arduino, GND к выводу земли Arduino, и подключите сигнальные выводы к цифровому выводу 2 на Arduino.

Затем, чтобы обеспечить стабильную передачу данных, вам нужно добавить один подтягивающий резистор 4,7 кОм для всей шины между сигнальными выводами и выводами питания (внутренние подтягивающие резисторы на ардуино не работают).

Рисунок 1 Подключение нескольких датчиков температуры DS18B20 с Arduino

Установка библиотеки для DS18B20

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

Чтобы установить библиотеку, перейдите в раздел «Скетч»→ «Подключить библиотеку» → «Управление библиотеками…». Подождите, пока менеджер библиотеки загрузит индекс библиотек и обновит список установленных библиотек.

Рисунок 2 Установка библиотеки Arduino – выбор управления библиотеками в Arduino IDE

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

Рисунок 3 Установка библиотеки DallasTemperature в Arduino IDE

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

Рисунок 4 Установка библиотеки OneWire в Arduino IDE

Способ 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); >

Вывод вышеприведенного скетча выглядит так:

Рисунок 5 Вывод показаний нескольких датчиков DS18B20 индексным методом

Объяснение кода

Скетч начинается с включения библиотек, объявления вывода, к которому подключена шина датчиков, и создания объекта библиотеки 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(""); >

Теперь откройте монитор последовательного порта. Вы должны получить что-то подобное:

Рисунок 6 Нахождение адресов 1-Wire всех датчиков DS18B20 на шине

Скопируйте все адреса, так как они нам понадобятся в следующем скетче.

Чтение показаний датчиков 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)

Вывод вышеприведенного эскиза выглядит так

Рисунок 7 Вывод показаний нескольких датчиков DS18B20 методом адреса

Объяснение кода

Как обычно, скетч начинается с включения библиотек, объявления вывода, к которому подключена шина датчиков, и создания объекта библиотеки 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

В этом руководстве рассказывается, как считывать показания с нескольких датчиков температуры DS18B20 посредством микросхемы ESP32 с помощью среды разработки Arduino IDE.

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

Считывание показаний с датчиков DS18B20 через ESP32

Описание датчика температуры DS18B20

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

Это особенно полезно для проектов с регистрацией данных и управлением температурой. DS18B20 — прекрасный датчик, поскольку он недорог, точен и его очень просто использовать.

Считывание показаний с нескольких датчиков температуры DS18B20 посредством микросхемы ESP32

Распиновка слева-направо: первый вывод — заземление GND, второй — данные, третий, крайний справа, — питание VCC.

Примечание: также существует водонепроницаемая версия датчика температуры DS18B20.

Основные характеристики датчика температуры DS18B20:

  • Связь поддерживается посредством однопроводной шины
  • Рабочий диапазон температуры: -55…+125 °C
  • Точность: ±0,5 °C (при температуре от -10 до +85 °C)

Подключение нескольких датчиков DS18B20

Для подключения датчика температуры DS18B20 вам нужно подключить резистор на 4,7 кОм между питанием VCC и линией данных. На следующей схеме показан пример для трёх датчиков (при необходимости вы можете добавить их еще больше).

Считывание показаний с нескольких датчиков температуры DS18B20 посредством микросхемы ESP32

На вышеприведённой схеме датчик повёрнут закруглённой стороной к нам. Плоская сторона смотрит в обратную сторону.

Подготовка среды разработки Arduino IDE

Для среды Arduino IDE существует дополнение, которое позволяет программировать микросхему ESP32 посредством этой среды и её языка программирования.

Скоро выйдет отдельный материал, как подготовить среду Arduino IDE для работы с ESP32.

Установка библиотек

Перед загрузкой кода вам необходимо установить две библиотеки в среду Arduino IDE. Библиотека OneWire Пола Штоффрегена и библиотека Dallas Temperature. Выполните следующие шаги, чтобы установить эти библиотеки.

Библиотека OneWire

  1. Библиотека OneWire скачиватся здесь. После скачивания, в вашей папке с загрузками должен появиться архивный файл с расширением .zip (например, в папке Downloads — «Загрузки»).
  2. Разархивируйте файл с расширением .zip — должна появиться папка OneWire-master.
  3. Смените название папки OneWire-master на OneWire.
  4. Переместите папку OneWire в папку с установленными библиотеками среды Arduino IDE.
  5. Перезапустите среду Arduino IDE для подгрузки бибоиотеки.

Библиотека Dallas Temperature

  1. Библиотека DallasTemperature скачивается здесь. В вашей папке с загрузками должен появиться архивный файл с расширением .zip (например, в папке Downloads — «Загрузки»).
  2. Разархивируйте файл с расширением .zip — должна появиться папка Arduino-Temperature-Control-Library-master.
  3. Смените название папки Arduino-Temperature-Control-Library-master на DallasTemperature
  4. Переместите папку DallasTemperature в папку с установленными библиотеками среды Arduino IDE
  5. Перезапустите среду 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 датчика?
Вам же сверху написали — берете два датчика, на одном из них, запаяв/убрав (нужно даташит смотреть) перемычку, меняете адрес, подключаете оба паралельно и все работает. Тупо проводами, без белых/розовых/голубых/зелёных/и т.п. платок.
Че вам не ймется то?

2020-04-29_15.59.20.jpg

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *