Подключение цифрового датчика температуры DS18B20 1-Wire к Arduino
Хотите измерять температуру в вашем следующем проекте на Arduino? Строите ли вы метеостанцию, мониторите температуру почвы в саду или просто экспериментируете для удовольствия — цифровой датчик температуры DS18B20 1-Wire является одним из самых простых и доступных способов начать.
DS18B20 не только точный и надёжный, но и требует очень мало подключений для работы. И благодаря уникальной однопроводной связи 1-Wire вы можете подключить несколько датчиков к одному выводу Arduino — идеально для более крупных или сложных конфигураций.
В этом руководстве вы узнаете, как подключить датчик DS18B20 к Arduino, поймёте, как он работает, и напишете простой код для начала считывания данных о температуре в реальном времени. Всего с несколькими компонентами и небольшим количеством кода вы сможете измерять температуру в кратчайшие сроки!
Давайте начнём!
Датчик температуры DS18B20 1-Wire
DS18B20 — это цифровой датчик температуры, созданный компанией Dallas Semiconductor (теперь часть Maxim Integrated). Он использует специальный протокол связи `1-Wire® `_. Этот протокол позволяет передавать данные, используя только одну линию данных, что значительно сокращает количество необходимых подключений!
Этот датчик доступен в двух основных форм-факторах:
Корпус TO-92, который выглядит как маленький транзистор
Водонепроницаемый зонд, который идеально подходит для измерения температуры во влажных средах, под землёй или в труднодоступных местах
С точки зрения производительности DS18B20 может измерять широкий диапазон температур от -55°C до +125°C с типичной точностью ±0,5°C в диапазоне от -10°C до +85°C.
Вы можете выбрать, насколько точными будут ваши показания температуры, регулируя разрешение на 9, 10, 11 или 12 бит. По умолчанию датчик использует 12-битное разрешение, что означает, что он может обнаруживать изменения температуры размером всего 0,0625°C.
Датчик работает с напряжением от 3 В до 5,5 В. Он также энергоэффективен, потребляя всего около 1 мА тока при измерении температуры.
Вот технические характеристики:
Напряжение питания |
3V to 5.5V |
|---|---|
Потребляемый ток |
1mA |
Диапазон температур |
-55 to 125°C |
Точность |
±0.5°C |
Разрешение |
9 to 12 bit (выбирается) |
Время преобразования |
< 750ms |
Использование нескольких датчиков DS18B20 на одном проводе
Одна из самых удивительных особенностей DS18B20 — это то, что вы можете подключить множество датчиков к одному проводу. Это работает, потому что каждый датчик имеет свой уникальный 64-битный серийный код, уже запрограммированный в нём. Этот специальный код позволяет вашему микроконтроллеру идентифицировать каждый датчик индивидуально.
Эта функция невероятно полезна, когда вы хотите измерять температуру в разных точках дома, теплицы или большой территории, используя при этом всего один провод данных.
Хотите узнать, как считывать данные с более чем одного DS18B20 одновременно? Ознакомьтесь с этим руководством:
Распиновка датчика DS18B20
Датчик DS18B20 обычно поставляется в корпусе TO-92 (который выглядит как маленький транзистор) или в водонепроницаемых зондах с металлическим корпусом. Независимо от формы, внутренняя разводка и распиновка одинаковы.
GND — это вывод заземления.
DQ — линия данных, используемая для связи (и питания в паразитном режиме). Она должна быть подключена к цифровому выводу ввода/вывода вашего микроконтроллера и требует подтягивающего резистора 4,7 кОм к VDD.
VDD — подаёт питание на датчик. Обычно принимает от 3,0 В до 5,5 В. В режиме паразитного питания этот вывод подключается к GND, и датчик берёт питание с линии данных.
В водонепроницаемом зонде DS18B20 провода обычно имеют следующую цветовую маркировку:
Красный → VDD (питание)
Чёрный → GND
Жёлтый или белый → DQ (данные)
Схема подключения датчика температуры DS18B20 к Arduino
Давайте узнаем, как подключить датчик температуры DS18B20 к Arduino.
Подключение довольно простое. Сначала подключите вывод VDD датчика к выводу 5V на Arduino. Далее подключите вывод GND (земля) датчика к любому из выводов GND Arduino.
Для подключения данных соедините вывод DQ (данные) датчика с цифровым выводом 2 на Arduino. Чтобы сигнал данных оставался стабильным, вам нужно добавить подтягивающий резистор 4,7 кОм между выводом DQ и выводом питания 5V. (Примечание: внутренние подтягивающие резисторы Arduino для этого не подойдут, поэтому нужно использовать внешний.)
Вот краткая справочная таблица подключений:
| DS18B20 | Arduino | Notes | |
| VDD | 5V | – | |
| GND | GND | – | |
| DQ | 2 | pulled up by 4.7kΩ |
Если вы используете водонепроницаемый зонд DS18B20, провода имеют цветовую маркировку: подключите красный провод к выводу 5V Arduino, чёрный провод к GND, а жёлтый провод к цифровому выводу 2.
Как и прежде, не забудьте добавить резистор 4,7 кОм между жёлтым проводом (данные) и красным проводом (питание) для стабильной связи.
Установка библиотеки
Протокол связи 1-Wire, используемый датчиком DS18B20, довольно сложный, и написание всего кода с нуля заняло бы много времени. К счастью, есть специальная библиотека `DallasTemperature `_, которая значительно упрощает работу.
Для установки библиотеки:
Сначала откройте вашу программу Arduino IDE. Затем нажмите на значок Менеджер библиотек на левой боковой панели.
Введите «ds18b20» в поле поиска для фильтрации результатов.
Найдите библиотеку DallasTemperature от Miles Burton.
Нажмите кнопку Install, чтобы добавить её в вашу Arduino IDE.
Для правильной работы библиотеке DallasTemperature необходима ещё одна библиотека — `OneWire `_.
Для установки библиотеки OneWire:
Снова откройте Менеджер библиотек.
В поле поиска введите «onewire».
Найдите библиотеку OneWire и нажмите Install.
С обеими установленными библиотеками вы будете готовы начать работу с вашим датчиком температуры DS18B20!
Пример кода Arduino
Приведённый ниже пример скетча поможет вам понять, как считывать и отображать данные о температуре с датчика DS18B20.
#include <OneWire.h>
#include <DallasTemperature.h>
// Data wire is plugged into digital pin 2 on the Arduino
#define ONE_WIRE_BUS 2
// Setup a oneWire instance to communicate with any OneWire device
OneWire oneWire(ONE_WIRE_BUS);
// Pass oneWire reference to DallasTemperature library
DallasTemperature sensors(&oneWire);
void setup(void) {
Serial.begin(9600);
sensors.begin();
}
void loop(void) {
// Send the command to get temperatures
sensors.requestTemperatures();
//print the temperature in Celsius
Serial.print("Temperature: ");
Serial.print(sensors.getTempCByIndex(0));
Serial.print("°C | ");
//print the temperature in Fahrenheit
Serial.print((sensors.getTempCByIndex(0) * 9.0) / 5.0 + 32.0);
Serial.println("°F");
delay(500);
}
После загрузки скетча на Arduino откройте монитор последовательного порта и установите скорость 9600 бод. Вы увидите текущую температуру, отображаемую как в °C, так и в °F.
Объяснение кода:
Скетч начинается с подключения двух важных библиотек: OneWire.h, которая знает, как взаимодействовать с устройствами, использующими протокол 1-Wire, и DallasTemperature.h, которая упрощает работу с датчиком DS18B20 и получение показаний температуры.
#include <OneWire.h>
#include <DallasTemperature.h>
Далее мы сообщаем Arduino, к какому выводу подключён провод данных датчика — в данном случае цифровой вывод 2.
#define ONE_WIRE_BUS 2
Для связи с датчиком DS18B20 нам нужно сделать две вещи. Сначала мы создаём объект OneWire и указываем, к какому выводу подключён датчик. Затем мы создаём объект DallasTemperature и передаём ему ссылку на только что созданный объект OneWire.
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
В разделе setup() мы запускаем последовательную связь, чтобы видеть результаты в мониторе последовательного порта. Затем мы используем sensors.begin(), который сканирует шину 1-Wire для обнаружения подключённых датчиков DS18B20 и устанавливает их разрешение на 12 бит.
void setup(void) {
Serial.begin(9600);
sensors.begin();
}
В разделе loop() мы вызываем функцию sensors.requestTemperatures(). Она сообщает всем датчикам на шине выполнить преобразование температуры.
После завершения преобразования мы вызываем sensors.getTempCByIndex(deviceIndex) для считывания температуры с датчика. deviceIndex — это число, которое сообщает Arduino, с какого датчика на шине 1-Wire мы хотим считать данные. Поскольку у нас подключён только один датчик, мы используем 0 для обращения к нему. Если бы у вас было несколько датчиков, вы бы использовали 1, 2, 3 и т.д., в зависимости от их порядка на шине.
Показания температуры затем отображаются в мониторе последовательного порта как в градусах Цельсия, так и в Фаренгейта.
Наконец, функция delay(500) приостанавливает программу на полсекунды перед следующим считыванием и повторением процесса.
void loop(void) {
// Send the command to get temperatures
sensors.requestTemperatures();
//print the temperature in Celsius
Serial.print("Temperature: ");
Serial.print(sensors.getTempCByIndex(0));
Serial.print("°C | ");
//print the temperature in Fahrenheit
Serial.print((sensors.getTempCByIndex(0) * 9.0) / 5.0 + 32.0);
Serial.println("°F");
delay(500);
}
Другие полезные функции библиотеки DallasTemperature.h
Библиотека DallasTemperature предлагает несколько полезных функций, которые дают вам лучший контроль над датчиком DS18B20. Вот некоторые из наиболее полезных:
Функция
setResolution()позволяет выбрать, насколько точными будут ваши показания температуры. Вы можете выбрать одно из четырёх разрешений: 9 бит = точность 0,5°C10 бит = точность 0,25°C
11 бит = точность 0,125°C
12 бит = точность 0,0625°C (значение по умолчанию)
Более высокая точность даёт более точные показания, но требует немного больше времени для измерения.
Режим паразитного питания
Датчик температуры DS18B20 имеет интересную функцию — режим паразитного питания. Этот специальный режим позволяет датчику работать, используя всего два провода — GND и DQ (данные) — вместо обычных трёх (которые обычно включают VDD для питания). Это действительно полезно, когда пространство ограничено и вам нужно упростить проводку.
В режиме паразитного питания датчик работает интересным образом. Когда линия данных находится в высоком состоянии (логическая 1), датчик берёт питание с этой линии данных и сохраняет энергию в крошечном конденсаторе внутри датчика. Затем, когда линия данных переходит в низкое состояние (логический 0), датчик использует накопленную энергию из внутреннего конденсатора для продолжения работы.
Для настройки DS18B20 в режиме паразитного питания подключите вывод VDD напрямую к GND. Подключите вывод DQ (данные) датчика к цифровому выводу 2 на Arduino, а вывод GND (земля) датчика к любому из выводов GND Arduino.
Вам по-прежнему потребуется подтягивающий резистор 4,7 кОм между линией DQ и источником питания.
Однако есть несколько важных моментов, которые нужно помнить при использовании паразитного режима:
Паразитный режим может плохо работать в проектах, где датчик находится очень далеко от Arduino. Это связано с тем, что длинные провода имеют большее электрическое сопротивление, что затрудняет доставку питания к датчику. В результате датчик может не получить достаточно энергии для правильной работы.
Также, если вы пытаетесь подключить несколько датчиков DS18B20 одновременно в паразитном режиме, вы можете столкнуться с проблемами питания. Это связано с тем, что каждому датчику нужно определённое количество энергии для работы, а паразитный режим обеспечивает меньше энергии, чем обычный метод подключения. Поэтому чем больше датчиков вы подключаете, тем больше вероятность возникновения проблем.