Arduino и термометр DS18B20
DS18B20 – высокоточный цифровой датчик температуры. Основные характеристики:
- Диапазон: -55.. 125 °C
- Точность: 0.5 °C
- Разрешение: 9.. 12 бит (0.48.. 0.06 °C)
- Питание: 3-5.5V
- Период выдачи результата:
- 750 мс при точности 12 бит
- 94 мс при точности 9 бит
В наборе идёт датчик в герметичном исполнении со стандартным гнездом (шаг 2.54 мм) для подключения
Подключение
Датчик имеет следующие назначения пинов:

Датчик подключается к любому цифровому пину Arduino, но пин должен быть подтянут к питанию резистором 4.7 кОм. На один пин можно подключить несколько датчиков DS18B20.


В рамках набора GyverKIT резистор на 4.7 кОм можно заменить двумя резисторами на 10 кОм (есть в комплекте), подключенными параллельно:

Библиотеки
Для этого датчика есть несколько библиотек:
- “Официальная” библиотека DallasTemperature.h, для работы которой также понадобится библиотека OneWire.h.
- Наша библиотека microDS18B20
В примерах на этом сайте мы будем использовать microDS18B20, так как она в несколько раз легче и проще в использовании, чем официальная. Библиотека идёт в архиве к набору GyverKIT, а свежую версию всегда можно установить/обновить из встроенного менеджера библиотек Arduino по названию microDS18B20. Краткая документация находится по ссылке выше, базовые примеры есть в самой библиотеке.
Работа с microDS18B20
Без адресации
В этом режиме на один пин МК подключается один датчик, для работы с ним не требуется предварительного чтения адреса и записи его в программу. Можно подключить несколько датчиков, каждому указать свой пин, см. пример one_pin_one_sensor.
С адресацией
В этом режиме можно подключить сколько угодно датчиков на один пин МК, но для работы с ними понадобится занести в программу уникальные адреса датчиков. В момент чтения адреса к пину должен быть подключен только один датчик! Пример – address_read. Для дальнейшей работы адреса хранятся в массивах на стороне программы и передаются датчикам при инициализации, пин указывается один и тот же:
Также адрес можно сменить во время работы программы, см. документацию.
Чтение температуры
Чтение температуры делится на два этапа – запрос и получение данных. Запрос делается функцией requestTemp() . После получения запроса датчик начинает измерение температуры, которое длится от 90 до 750 мс в зависимости от настроенной точности (по умолчанию точность максимальная, преобразование длится 750 мс). Если прочитать температуру до окончания преобразования – датчик вернёт результат предыдущего измерения, поэтому в примерах используется задержка или опрос по таймеру на 1 секунду. Получить температуру можно при помощи getTemp() [float] или getTempInt() [int]. Если принятые данные повреждены или датчик отсутствует на линии – функция вернёт предыдущее успешно прочитанное значение температуры.
Примечание: при повторных вызовах getTemp() не запрашивает с датчика новую температуру (долгое выполнение функции), вместо этого она просто возвращает предыдущий результат до тех пор, пока не будет сделан новый запрос requestTemp().
В версии библиотеки 3.5 появилась возможность отдельно запросить температуру и определить корректность полученных данных, чтобы только после этого их прочитать и применить в программе – функция readTemp() . Также это позволяет определить состояние подключения и всё ли в порядке с датчиком. Для чтения температуры рекомендуется использовать конструкцию вида:
где readTemp() запрашивает данные с датчика и возвращает true , если они прочитаны корректно. После этого можно забрать текущую температуру из getTemp() , которая уже не запрашивает температуру с датчика, а отдаёт прочитанный в readTemp() результат.
Примеры
Библиотека позволяет работать по схеме “один датчик – один пин”, в которой адрес датчика получать не нужно. Достаточно подключить и использовать:
Взаимодействие нескольких 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 при инициализации обнаруживает все датчики, использующие одну шину. Она рассматривает всю шину как массив датчиков и присваивает им индексы. Поэтому мы можем точно выбрать каждый датчик по его индексу и прочитать показания температуры.
Вывод вышеприведенного скетча выглядит так:
Рисунок 5 – Вывод показаний нескольких датчиков DS18B20 индексным методомОбъяснение кода
Скетч начинается с включения библиотек, объявления вывода, к которому подключена шина датчиков, и создания объекта библиотеки DallasTemperature .
В настроечной части кода мы сначала вызываем функцию begin() . Она инициализирует шину и обнаруживает все DS18B20, присутствующие на ней. Затем каждому датчику присваивается индекс и устанавливается разрешение в 12 бит.
Затем мы вызываем функцию getDeviceCount() , чтобы получить количество устройств, найденных на шине.
В циклической части кода мы используем функцию requestTemperatures() , чтобы отправить команду всем датчикам для преобразования температуры.
Теперь, используя простой цикл for(int i = 0; i < deviceCount; i++) , мы можем перебирать массив датчиков и считывать температуру DS18B20 по индексу i , просто вызывая getTempCByIndex(i) .
Способ 2: чтение датчика DS18B20 по адресу
Мы знаем, что каждому DS18B20 назначен уникальный 64-битный адрес, чтобы отличать их друг от друга. В этом методе мы найдем этот адрес для соответствующей маркировки каждого датчика. Затем этот адрес можно использовать для считывания каждого датчика в отдельности.
Поиск адресов датчиков DS18B20s на шине
Следующий скетч обнаруживает все DS18B20, присутствующие на шине, и печатает их адреса на 1-Wire в монитор последовательного порта.
Вы можете подключать только один датчик за раз, чтобы определить его адрес (или последовательно добавлять по одному новому датчику, чтобы вы могли идентифицировать каждый из них по его адресу). Затем вы можете пометить каждый датчик.
Теперь откройте монитор последовательного порта. Вы должны получить что-то подобное:
Рисунок 6 – Нахождение адресов 1-Wire всех датчиков DS18B20 на шинеСкопируйте все адреса, так как они нам понадобятся в следующем скетче.
Чтение показаний датчиков DS18B20 по адресу
Следующий скетч считывает температуру датчиков DS18B20 по их адресам. Прежде чем приступить к загрузке скетча, вам нужно изменить адреса датчиков DS18B20 на те, которые вы определили в предыдущем скетче.
Вывод вышеприведенного эскиза выглядит так
Рисунок 7 – Вывод показаний нескольких датчиков DS18B20 методом адресаОбъяснение кода
Как обычно, скетч начинается с включения библиотек, объявления вывода, к которому подключена шина датчиков, и создания объекта библиотеки DallasTemperature .
Далее мы вводим адреса, которые были найдены ранее для каждого датчика температуры. В нашем случае имеем следующее.
Во фрагменте настройки мы инициализируем библиотеку путем вызова функции begin() и инициализируем последовательную связь с ПК.
В цикле мы просто посылаем команду всем датчикам для преобразования температуры, используя функцию requestTemperatures() .
Затем, чтобы напечатать температуру датчика, мы вызываем пользовательскую функцию printTemperature(DeviceAddress deviceAddress) , для которой deviceAddress передается в качестве параметра.
Вышеприведенная функция просто вызывает библиотечные функции getTempC(deviceAddress) для отображения температуры в градусах Цельсия и DallasTemperature::toFahrenheit() для отображения температуры в градусах Фаренгейта.
На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.
В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.
Ясен пень тоже самое, но без функций и лишних печатей. Вы этим уроком что хотели преподнести? Как функции работают или как датчики подключать. Уроки для начинающих? Надо думать как начинающий. Нахрена туда пихать лишнее. Кое как разобрался в вашей писанине. Проще надо быть и люди потянутся.
Что именно усложнено? Какие циклы?
Вы переписали всё то же самое, но без отдельной функции печати температуры в градусах Цельсия и Фаренгейта с символами градусов ‘°’.Трындец всё как сложно запутываете нет чтобы тремя простыми словами нет надо циклы мутить запутанные.
#include <onewire.h>
#include <dallastemperature.h>
#define ONE_WIRE_BUS 2OneWire 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);
>И всё. Чё усложнять?
Здравствуйте. Подскажите, пожалуйста, в каком порядке датчикам присваиваются индексы? Могут ли одни и те же датчики получать разные индексы? Спасибо.
Interfacing Multiple DS18B20 Digital Temperature Sensors with Arduino
One of the DS18B20’s features is that multiple DS18B20s can coexist on the same 1-Wire bus. Because each DS18B20 is pre-programmed with a unique 64-bit serial code, they can be distinguished from one another.
The following tutorial will show you how to read the temperature from multiple DS18B20s connected to the same bus. This feature can be extremely useful when you need to control multiple DS18B20s spread across a large area.
Before proceeding with this tutorial, you should be familiar with the basics of the DS18B20 one-wire temperature sensor. Please consider reading the tutorial below first.

Without further ado, let’s connect the DS18B20s to our Arduino.
Wiring Multiple DS18B20 Sensors to Arduino
Connections are pretty straightforward.
Begin by connecting all of the DS18B20s in parallel, sharing all of the VDD, GND, and signal pins. Then connect VDD to the Arduino’s 5V output, GND to the Arduino’s ground, and signal pin to digital pin 2 on the Arduino.
To keep the data transfer stable, add one 4.7k pull-up resistor for the entire bus between the signal and power pin (Note: internal pull-ups on the Arduino do not work here).

Wiring Multiple DS18B20 Temperature Sensors With Arduino
Installing Library For DS18B20
The 1-Wire protocol is a bit complicated, and it takes a lot of code to make it work. DallasTemperature.h was written to abstract away this unnecessary complexity, allowing us to issue simple commands to obtain temperature readings from the sensor.
To install the library, navigate to Sketch > Include Library > Manage Libraries… Wait for the Library Manager to download the library index and update the list of installed libraries.

Filter your search by entering ‘ds18b20’. There should be a couple of entries. Look for DallasTemperature by Miles Burton. Click on that entry and then choose Install.

Dallas Temperature is a hardware-specific library that handles lower-level functions. It must be paired with the One Wire Library in order to communicate with any one-wire device, not just the DS18B20. Install this library as well.

Methods for Reading Multiple DS18B20s
There are two methods for reading multiple DS18B20s connected to the same bus.
- By Index – In this method, we use an index (assigned by the library) to pinpoint each sensor and read its temperature.
- By Address – In this method, we read each sensor individually by taking advantage of the fact that each sensor has its own 64-bit address (preprogrammed).
Let’s go over each method one by one.
Method 1: Reading DS18B20 By Index
When the Dallas Temperature library is initialized, it scans the bus for all sensors that share the same bus. It considers the entire bus to be an array of sensors and assigns each one an index. As a result, we can identify each sensor by its index and read temperature.
Here is a simple sketch that locates all the DSB1820s on the bus and then shows the temperature of each one.
The result looks like this:

Code Explanation:
The sketch begins by including libraries, declaring the pin to which the sensor bus is connected, and creating a DallasTemperature library object. In the same global scope, two variables are defined: deviceCount stores the number of sensors found on the bus, and tempC stores the temperature read from each sensor.
In the setup section of the code, we first call the begin() function. It initializes the bus and detects all connected DS18B20s. Each sensor is then assigned an index, and the bit resolution is set to 12-bit.
The getDeviceCount() function is then called to print the number of devices discovered on the bus.
In the looping section of the code, we use the requestTemperatures() function to instruct all sensors on the bus to perform a temperature conversion.
Finally, we use a simple for loop to iterate through the array of sensors and read the temperature of a specific DS18B20 by calling the function getTempCByIndex(i)
Method 2: Reading DS18B20 By Address
Each DS18B20 is programmed with a unique 64-bit address at the time of manufacture, allowing them to be distinguished from one another. So we’ll use one sketch to find and record the address of each sensor, and then another sketch to read each sensor individually.
Finding the Addresses of DS18B20s on a Bus
The sketch below detects all DS18B20s on the bus and prints their one-wire addresses on the serial monitor.
It is recommended that you connect only one sensor at a time so that you can find each sensor’s address and assign it a name.
Now, open up Serial Monitor. You’ll get to see something like this.

Make a note of all the addresses because we’ll need them in the next sketch.
Reading DS18B20s By Address
The sketch below uses the addresses of the DS18B20s to read the temperatures. Before you begin uploading the sketch, you must replace the addresses of the DS18B20s with the ones found in the previous sketch.
The output of the above sketch looks like:

Code Explanation:
The sketch begins as usual by including libraries, declaring the pin to which the sensor bus is connected, and creating an object of the DallasTemperature library.
Next, we enter the previously discovered addresses for each temperature sensor.
In the setup section, we initialize serial communication with the PC and call the begin() function. The begin() function initializes the bus, detects all connected DS18B20s, and sets the bit resolution for each to 12-bit.
In the looping section of the code, we use the requestTemperatures() function to instruct all sensors on the bus to perform a temperature conversion.
Finally, we call the custom function printTemperature(deviceAddress) to print the temperature of the sensor whose deviceAddress is passed as a parameter.
The custom function printTemperature() simply calls the library’s getTempC(deviceAddress) function to display temperature in Celsius and DallasTemperature::toFahrenheit() function to display temperature in Fahrenheit.

report this ad
Подключение нескольких датчиков DS18B20 к Arduino Uno
Разместите на макетной плате группу из трех проводов, создав таким образом 3-проводной сегмент шины GND — DQ — VCC. Используйте эти провода для подключения платы Arduino к макетной плате, как показано на схеме. Установите на шину подтягивающий резистор 4,7 кОм, соединяющий DQ и VCC. Затем добавьте еще 2-3 сегмента 3-х проводной шины, соединив их проводами одного цвета. Затем установите на эти сегменты несколько датчиков DS18B20 в корпусе TO92. Cмотрите на фото для наглядности.

-
-
- Красный — Arduino Uno 5V -> VCC DS18B20
- Белый — Arduino Uno IO4 -> DQ DS18B20*
- Черный — Arduino Uno GND -> GND DS18B20
* Можно использовать другой IO на Arduino, но тогда внесите изменение в программу тоже
-
