Проводка

Подключение ds18b20 к arduino. Ардуино: датчик температуры DS18B20 от ROC

Подключение ds18b20 к arduino. Ардуино: датчик температуры DS18B20 от ROC

DS18B20 подключение к Arduino — это фантастический датчик определения температурной составляющей с цифровым интерфейсом в своем составе — следовательно он не требует выполнения калибровки. Поэтому, такие устройства можно подключить одновременно в множественном количестве к одному контакту arduino. Такую возможность предоставляет оригинальный адрес, который был запрограммирован в схему DS18B20 при его изготовлении.

Вот так выглядит эта «супер-сложная» схема DS18B20 подключение к Arduino:

Здесь нужен всего один резистор и больше ничего))). К тому же здесь отсутствуют необходимость в калибровании температуры, а также исключаются возможные неточности при выполнении сборки. Питающее напряжение возможно подавать в диапазоне от 3v до 5v. Все элементарно. А отображение температурного значения - три строки)). Ниже показан образец, все досконально и четко расписано.

Вот отсюда нужно скачать библиотеку:

Тут все аналогично, код в образце Multiple.pde. Разница лишь в том, что применено некоторое количество переменных величин имеющих адреса термометров — следовательно на три датчика три переменные величины со своим адресом и аналогичный код для поиска:

If (!sensors.getAddress(Thermometer1, 0)) Serial.println("Не найден адрес датчика 0"); if (!sensors.getAddress(Thermometer2, 1)) Serial.println("Не найден адрес датчика 1"); if (!sensors.getAddress(Thermometer3, 2)) Serial.println("Не найден адрес датчика 2");

Естественно и вывода температурных составляющих также по три.

Так исторически сложилось, что на текущий момент одним из самых популярных цифровых температурных датчиков является датчик DS18B20 корпорации Dallas Semiconductor. Конечно же и мы не можем обойти его стороной.

Вся память DS18B20 включает в себя оперативную (SRAM) и энергонезависимую (EEPROM) память. В EEPROM хранятся регистры TH, TL и регистр конфигурации. Если функция тревожного сигнала не используется, то регистры TH и TL могут использоваться как регистры общего назначения. В режиме термостата TH содержит значение верхнего порога температуры, TL соответственно нижнего порога.

Кодинг.

Первым делом нам потребуется библиотека OneWire которая нам очень упростит жизнь. Скачать можно с GitHub или с нашего сайта .

Любое общение с датчиком начинается с команды Reset . То есть МК прижимает шину данных в состояние логический «0» на 480 µs, потом отпускает ее. Датчик отвечает на это сигналом присутствия, после чего мы отправляем команду Skip ROM (0xCC) . Тое сть обратимся ко всем датчика которые присутствуют на шине.

OneWire(uint8_t pin);

Конструктор, Pin – номер вывода, к которому подключен датчик.

uint8_t reset(void);

Инициализация операции на шине. С этой команды должна начинаться любая операция обмена данными. Возвращает:

  • 1 – если устройство подключено к шине (был ответный импульс присутствия);
  • 0 – если устройство отсутствует на шине (ответного импульса не было).
void write(uint8_t v, uint8_t power = 0);

Запись байта. Передает байт в устройство на шине.

Отправим команду 0x44 инициализации измерения температуры.

Пауза 1 сек . Ожидание на время, необходимое для выполнения датчиком преобразования температуры. Это время зависит от выбранной разрешающей способности датчика. Разрешение 12 бит установлено в датчике по умолчанию. Время преобразования для него – 750 мс.

Затем мы отправляем команду Reset , Skip ROM (0xCC) , а замет команду 0xBE чтения памяти датчика.

Вот и сам код из библиотеке:

#include // OneWire DS18S20, DS18B20, DS1822 Temperature Example // // http://www.pjrc.com/teensy/td_libs_OneWire.html // // The DallasTemperature library can do all this work for you! // http://milesburton.com/Dallas_Temperature_Control_Library OneWire ds(10); // датчик на выводе 10 (а резистор 4.7 K является необходимым) void setup(void) { Serial.begin(9600); } void loop(void) { byte i; byte present = 0; //переменные byte type_s; byte data; byte addr; float celsius, fahrenheit; if (!ds.search(addr)) { Serial.println("No more addresses."); Serial.println(); ds.reset_search(); delay(250); return; } Serial.print("ROM ="); for(i = 0; i < 8; i++) { Serial.write(" "); Serial.print(addr[i], HEX); } if (OneWire::crc8(addr, 7) != addr) { Serial.println("CRC недопустимый!"); return; } Serial.println(); // первый байт ROM указывает, какой чип (8 бит код чипа, 48 бит серийный номер, 8 бит CRC) switch (addr) { case 0x10: Serial.println(" Chip = DS18S20"); // or old DS1820 type_s = 1; break; case 0x28: Serial.println(" Chip = DS18B20"); type_s = 0; break; case 0x22: Serial.println(" Chip = DS1822"); type_s = 0; break; default: Serial.println("Не является устройством семейства DS18x20."); return; } ds.reset(); ds.select(addr); ds.write(0x44, 0); // старт преобразования с питание от внешнего источника. delay(1000); // ждем конца преобразования. // we might do a ds.depower() here, but the reset will take care of it. present = ds.reset(); ds.select(addr); ds.write(0xBE); // Читаем память. Serial.print(" Data = "); Serial.print(present, HEX); Serial.print(" "); for (i = 0; i < 9; i++) { // нам нужно 9 байт data[i] = ds.read(); Serial.print(data[i], HEX); Serial.print(" "); } Serial.print(" CRC="); Serial.print(OneWire::crc8(data, 8), HEX); Serial.println(); // Преобразование данных в фактическую температуру //поскольку результатом является 16-разрядное целое число со знаком // ранится в типе "int16_t", который всегда составляет 16 бит // даже при компиляции на 32-битном процессоре. int16_t raw = (data << 8) | data; if (type_s) { raw = raw << 3; // 9 бит разрешение по умолчанию у датчиков DS18S20 or old DS1820 if (data == 0x10) { // "количество остается" дает полное разрешение 12 бит raw = (raw & 0xFFF0) + 12 - data; } } else { byte cfg = (data & 0x60); // при более низком разрешении низкие биты не определены, поэтому давайте обнуляем их. if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms //// default is 12 bit resolution, 750 ms conversion time } celsius = (float)raw / 16.0; fahrenheit = celsius * 1.8 + 32.0; Serial.print(" Temperature = "); Serial.print(celsius); Serial.print(" Celsius, "); Serial.print(fahrenheit); Serial.println(" Fahrenheit"); }

Собственно это библиотека подходить для всех датчиков семейства DS18 (DS18B20, DS18S20, DS1820, DS1822) подключение не чем не отключаются. Ну а некоторые различия можно уже узнать из datesheet к ним.

DS18B20 - это цифровой датчик температуры. Датчик очень прост в использовании.

Во-первых, он цифровой, а во вторых - у него всего лишь один контакт, с которого мы получаем полезный сигнал. То есть, вы можете подключить к одному Arduino одновременно огромное количество этих сенсоров. Пинов будет более чем достаточно. Мало того, вы даже можете подключить несколько сенсоров к одному пину на Arduino! Но обо всем по порядку.

DS18B20 имеет различные форм-факторы. Так что выбор, какой именно использовать, остается за вами. Доступно три варианта: 8-Pin SO (150 mils), 8-Pin µSOP, и 3-Pin TO-92. Серфинг по eBay или Aliexpress показывает, что китайцы предлагают версию TO-92 во влагозащищенном корпусе. То есть, вы можете смело окунать подобное чудо в воду, использовать под дождем и т.д. и т.п. Эти сенсоры изготавливаются с тремя выходными контактами (черный - GND, красный - Vdd и белый - Data).

Различные форм-факторы датчиков DS18B20 приведены на рисунке ниже.

Модель DS18B20 во влагозащищенном корпусе:


DS18B20 удобен в использовании. Запитать его можно через контакт data (в таком случае вы используете всего два контакта из трех для подключения!). Сенсор работает в диапазоне напряжений от 3.0 В до 5.5 В и измеряет температуру в диапазоне от -55°C до +125°C (от -67°F до +257°F) с точностью ±0.5°C (от -10°C до +85°C).

Еще одна крутая фича: вы можете подключить параллельно вплоть до 127 датчиков! и считывать показания температуры с каждого отдельно. Не совсем понятно, в каком проекте подобное может понадобится, но подключить два сенсора и контролировать температуру в холодильнике и морозильной камере можно. При этом вы оставите свободными кучу пинов на Arduino... В общем, фича приятная.

Что вам понадобится для контроля температуры с помощью Arduino и DS18B20

Программное обеспечение

  • Естественно, вам необходима Arduino IDE;
  • Библиотека OneWire library, которая значительно облегчает работу с Arduino и датчиком DS18B20;
  • Скетч...

Загружаем скетч на Arduino

Скетч, который представлен ниже, есть в библиотеке OneWire, в категории examples. Перейдите в “File” - “Examples” - “OneWire” и выберите пример “DS18x20_Temperature”. Код программы представлен ниже.

Данный пример использует библиотеку OneWire Library, для того, чтобы собрать данные со всех подключенных датчиков температуры DS28B20 (как подключить несколько сенсоров описано в конце статьи) и отобразить их в окне серийного монитора Arduino IDE.

В окне серийного монитора вы увидите примерно следующее:

ROM = 28 88 84 82 5 0 0 6A

No more addresses.

ROM = 28 88 84 82 5 0 0 6A

Data = 1 56 1 4B 46 7F FF A 10 D1 CRC=D1

Temperature = 21.37 Celsius, 70.47 Fahrenheit

No more addresses.

ROM = 28 88 84 82 5 0 0 6A

Data = 1 56 1 4B 46 7F FF A 10 D1 CRC=D1

Temperature = 21.37 Celsius, 70.47 Fahrenheit

No more addresses.

Убедитесь, что вы указали корректные пины!

В строке 10, где указано “OneWire ds(2);” устанавливается пин, к которому подключен контакт data с сенсора.

В этом примере использован пин 2, но значения пина по умолчанию в примере OneWire стоит на 10. Можно использовать и его.

#include <OneWire.h>

// пример использования библиотеки OneWire DS18S20, DS18B20, DS1822

OneWire ds(2); // на пине 10 (нужен резистор 4.7 КОм)

void setup(void) {

Serial.begin(9600);

void loop(void) {

byte present = 0;

float celsius, fahrenheit;

if (!ds.search(addr)) {

Serial.println("No more addresses.");

Serial.println();

ds.reset_search();

Serial.print("ROM =");

Serial.write(" ");

Serial.print(addr[i], HEX);

if (OneWire::crc8(addr, 7) != addr) {

Serial.println("CRC is not valid!");

Serial.println();

// первый байт определяет чип

Serial.println(" Chip = DS18S20"); // или более старый DS1820

Serial.println(" Chip = DS18B20");

Serial.println(" Chip = DS1822");

Serial.println("Device is not a DS18x20 family device.");

ds.select(addr);

delay(1000); // 750 может быть достаточно, а может быть и не хватит

// мы могли бы использовать тут ds.depower(), но reset позаботится об этом

present = ds.reset();

ds.select(addr);

Serial.print(" Data = ");

Serial.print(present, HEX);

Serial.print(" ");

data[i] = ds.read();

Serial.print(data[i], HEX);

Serial.print(" ");

Serial.print(" CRC=");

Serial.print(OneWire::crc8(data, 8), HEX);

Serial.println();

// конвертируем данный в фактическую температуру

// так как результат является 16 битным целым, его надо хранить в

// переменной с типом данных "int16_t", которая всегда равна 16 битам,

// даже если мы проводим компиляцию на 32-х битном процессоре

int16_t raw = (data

if (data == 0x10) {

raw = (raw & 0xFFF0) + 12 - data;

byte cfg = (data & 0x60);

// при маленьких значениях, малые биты не определены, давайте их обнулим

if (cfg == 0x00) raw = raw & ~7; // разрешение 9 бит, 93.75 мс

else if (cfg == 0x20) raw = raw & ~3; // разрешение 10 бит, 187.5 мс

else if (cfg == 0x40) raw = raw & ~1; // разрешение 11 бит, 375 мс

//// разрешение по умолчанию равно 12 бит, время преобразования - 750 мс

celsius = (float)raw / 16.0;

fahrenheit = celsius * 1.8 + 32.0;

Serial.print(" Temperature = ");

Serial.print(celsius);

Serial.print(" Celsius, ");

Serial.print(fahrenheit);

Serial.println(" Fahrenheit");

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

Вы можете подключить несколько цифровых датчиков температуры DS18B20 параллельно. При этом библиотека OneWire library позволит вам считывать данные со всех датчиков одновременно.

Ниже описаны два метода подключения сенсоров.

Для большого количества сенсоров (больше 10), надо использовать резисторы с меньшим сопротивлением (например, 1.6 КОм или даже меньше).

Кроме того, если вы подключаете параллельно более 10 датчиков, могут возникнуть проблемы (погрешности при съеме показаний). Поэтому рекомендуется устанавливать дополнительный резистор сопротивлением 100...120 Ом между контактом data на Arduino и data на каждом сенсоре!

Результат работы предыдущего скетча с двумя подключенными сенсорами может выглядет примерно следующим образом:

ROM = 28 88 84 82 5 0 0 6A

Data = 1 51 1 4B 46 7F FF F 10 FE CRC=FE

Temperature = 21.06 Celsius, 69.91 Fahrenheit

ROM = 28 DA CA 27 5 0 0 49

Data = 1 4E 1 4B 46 7F FF 2 10 D9 CRC=D9

Temperature = 20.87 Celsius, 69.57 Fahrenheit

No more addresses.

Выбираем правильный сенсор

Было бы неплохо знать, с какого именно сенсора вы получаете данные, когда вы используете параллельно несколько датчиков. Как это сделать?

Серийный номер

Так как датчики цифровые, у каждого из них есть индивидуальный серийный номер, который можно использовать для опознавания того или иного сенсора. Вроде бы все просто. Но... нам ведь надо предварительно определить эти серийные номера, прежде чем использовать их для опознавания сенсора, правильно?

Вы могли обратить на примерах выше, что скетч выдает нам данные в виде 64-битного серийного номера - значение “ROM”. Например:

28 88 84 82 5 0 0 6A или 28 DA CA 27 5 0 0 49 в примере выше.

Не забывайте, если вы используете одновременно большое количество датчиков (10 и больше), надо добавить резисторы 100 … 120 Ом между контактами data с сенсора DS18B20 и пином data на Arduino (для каждого датчика!).

Ниже показана схема параллельного подключения нескольких сенсоров с использованием трех контактов.


Оставляйте Ваши комментарии, вопросы и делитесь личным опытом ниже. В дискуссии часто рождаются новые идеи и проекты!

В этом уроке мы будем использовать датчик температуры DS18B20 с Arduino UNO для создания термометра. Датчик DS18B20 является хорошим вариантом, когда в проекте с высокой точностью требуется хорошая реакция. Мы покажем как подключить DS18B20 к вашему и отобразить данные температуры на ЖК-дисплее 16x2.

Обзор датчика DS18B20

Датчик DS18B20 взаимодействует с Arduino через 1-проводную шину. По определению для связи с Arduino требуется только одна линия данных (и земля).

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

Особенности DS18B20

  • Необходим только один однопроводный интерфейс для связи между микроконтроллером и датчиком.
  • Требуется только один внешний компонент: резистор 4,7 кОм.
  • Может питаться от линии передачи данных напрямую, требуя напряжения от 3,0 до 5,5 В.
  • Каждое устройство имеет уникальный 64-битный последовательный код, хранящийся на встроенном ПЗУ.
  • Может измерять температуру в диапазоне от -55° C до + 125° C (от -67° F до + 257° F).
  • Точность ± 0,5° C в диапазоне от -10° C до + 85° C.

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

Требования к комплектующим

Требования к оборудованию для вашего термометра достаточно стандартные, нам пригодятся:

  • ЖК-дисплей 16х2
  • Датчик температуры DS18B20
  • Провода для перемычек
  • Резистор 1K
  • Макетная плата

Схема соединения

Сделайте соединения согласно приведенной ниже схеме.

Соединяем датчик и Ардуино

  • VCC -> Arduino 5V, плюс резистор 4,7K, идущий от VCC к Data
  • Data -> Пин 7 Arduino
  • GND -> GND Arduino

Соединения для ЖК-дисплея и Arduino UNO

  • Пин 1 -> GND
  • Пин 2 -> VCC
  • Пин 3 -> Arduino Пин 3
  • Пин 4 -> Arduino Пин 33
  • Пин 5 -> GND
  • Пин 6 -> Arduino Пин 31
  • Пин 7-10 -> GND
  • Пин 11 -> Arduino Пин 22
  • Пин 12 -> Arduino Пин 24
  • Пин 13 -> Arduino Пин 26
  • Пин 14 -> Arduino Пин 28
  • Пин 15 -> VCC через резистор 220 Ом
  • Пин 16 -> GND

Подключите потенциометр, как показано выше, к контакту 3 на ЖК-дисплее, для управления контрастностью.

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

Исходный код для термометра

Перед загрузкой исходного кода вам нужно настроить две библиотеки, необходимые для запуска этого кода в среде Arduino.

  • Первая библиотека называется - OneWire ().
  • Вторая библиотека называется - DallasTemperature ().

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

//Code begins #include #include #include #define ONE_WIRE_BUS 7 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); float tempC = 0; float tempF = 0; LiquidCrystal lcd(12,11,5,4,3,2); void setup() { sensors.begin(); lcd.begin(16,2); lcd.clear(); pinMode(3, OUTPUT); analogWrite(3, 0); Serial.begin(9600); } void loop() { sensors.requestTemperatures(); tempC = sensors.getTempCByIndex(0); tempF = sensors.toFahrenheit(tempC); delay(1000); Serial.println(tempC); lcd.setCursor(0,0); lcd.print("C: "); lcd.print(tempC); lcd.print(" degrees"); lcd.setCursor(0,1); lcd.print("F: "); lcd.print(tempF); lcd.print(" degrees"); }

Примерно это выглядит так:

Мы смогли измерить температуру до 100°C с помощью этого датчика! Он очень отзывчив.

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

Датчик температуры в Arduino – один из самых распространенных видов сенсоров. Разработчику проектов с термометрами на Arduino доступно множество разных вариантов, отличающихся по принципу действия, точности, конструктивному исполнению. Цифровой датчик DS18B20 является одним из наиболее популярных температурных датчиков, часто он используется в водонепроницаемом корпусе для измерения температуры воды или других жидкостей. В этой статье вы найдете описание датчика ds18b20 на русском, мы вместе рассмотрим особенности подключения к ардуино, принцип работы датчика, описание библиотек и скетчей.

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

Температурный датчик DS18B20 имеет разнообразные виды корпуса. Можно выбрать один из трех – 8-Pin SO (150 mils), 8-Pin µSOP, и 3-Pin TO-92. Последний является наиболее распространенным и изготавливается в специальном влагозащитном корпусе, так что его смело можно использовать под водой. У каждого датчика есть 3 контакта. Для корпуса TO-92 нужно смотреть на цвет проводов: черный – земля, красный – питание и белый/желтый/синий – сигнал. В интернет-магазинах можно купить готовый модуль DS18B20.

Где купить датчик

Естественно, что DS18B20 дешевле всего купить на Алиэкспрессе, хотя он продается и в любых специализированных российских интернет-магазинах с ардуино. Приведем несколько ссылок для примера:

Память датчика состоит из двух видов: оперативной и энергонезависимой – SRAM и EEPROM. В последнюю записываются регистры конфигурации и регистры TH, TL, которые могут использоваться как регистры общего назначения, если не используются для указания диапазона допустимых значений температуры.

Основной задачей DS18B20 является определение температуры и преобразование полученного результата в цифровой вид. Мы можем самостоятельно задать необходимое разрешение, установив количество бит точности – 9, 10, 11 и 12. В этих случаях разрешающие способности будут соответственно равны 0,5С, 0,25С, 0,125С и 0,0625С.

Полученные температурные измерения сохраняются в SRAM датчика. 1 и 2 байты сохраняют полученное значение температуры, 3 и 4 сохраняют пределы измерения, 5 и 6 зарезервированы, 7 и 8 используются для высокоточного определения температуры, последний 9 байт хранит устойчивый к помехам CRC код.

Подключение DS18B20 к Arduino

DS18B20 является цифровым датчиком. Цифровые датчики передают значение измеряемой температуры в виде определенного двоичного кода, который поступает на цифровые или аналоговые пины ардуино и затем декодируется. Коды могут быть самыми разными, ds18b20 работает по протоколу данных 1-Wire. Мы не будем вдаваться в подробности этого цифрового протокола, укажем лишь необходимый минимум для понимания принципов взаимодействия.

Обмен информацией в 1-Wire происходит благодаря следующим операциям:

  • Инициализация – определение последовательности сигналов, с которых начинается измерение и другие операции. Ведущее устройство подает импульс сброса, после этого датчик должен подать импульс присутствия, сообщающий о готовности к выполнению операции.
  • Запись данных – происходит передача байта данных в датчик.
  • Чтение данных – происходит прием байта из датчика.

Для работы с датчиком нам понадобится программное обеспечение:

  • Arduino IDE;
  • Библиотека OneWire, если используется несколько датчиков на шине, можно использовать библиотеку DallasTemperature. Она будет работать поверх OneWire.

Из оборудования понадобятся:

  • Один или несколько датчиков DS18B20;
  • Микроконтроллер Ардуино;
  • Коннекторы;
  • Резистор на 4,7 кОм (в случае подключения одного датчика пойдет резистор номиналом от 4 до 10K);
  • Монтажная плата;
  • USB-кабель для подключения к компьютеру.

К плате Ардуино UNO датчик подключается просто: GND с термодатчика присоединяется к GND Ардуино, Vdd подключается к 5V, Data – к любому цифровому пину.

Простейшая схема подключения цифрового датчика DS18B20 представлена на рисунке.

Алгоритм получения информации о температуре в скетче состоит из следующих этапов:

  • Определение адреса датчика, проверка его подключения.
  • На датчик подается команда с требованием прочитать температуру и выложить измеренное значение в регистр. Процедура происходит дольше остальных, на нее необходимо примерно 750 мс.
  • Подается команда на чтение информации из регистра и отправка полученного значения в «монитор порта»,
  • Если требуется, то производится конвертация в градусы Цельсия/Фаренгейта.

Пример простого скетча для DS18B20

Самый простой скетч для работы с цифровым датчиком выглядит следующим образом. (в скетче мы используем библиотеку OneWire, о которой поговорим подробнее чуть позже).

#include /* * Описание взаимодействия с цифровым датчиком ds18b20 * Подключение ds18b20 к ардуино через пин 8 */ OneWire ds(8); // Создаем объект OneWire для шины 1-Wire, с помощью которого будет осуществляться работа с датчиком void setup(){ Serial.begin(9600); } void loop(){ // Определяем температуру от датчика DS18b20 byte data; // Место для значения температуры ds.reset(); // Начинаем взаимодействие со сброса всех предыдущих команд и параметров ds.write(0xCC); // Даем датчику DS18b20 команду пропустить поиск по адресу. В нашем случае только одно устрйоство ds.write(0x44); // Даем датчику DS18b20 команду измерить температуру. Само значение температуры мы еще не получаем - датчик его положит во внутреннюю память delay(1000); // Микросхема измеряет температуру, а мы ждем. ds.reset(); // Теперь готовимся получить значение измеренной температуры ds.write(0xCC); ds.write(0xBE); // Просим передать нам значение регистров со значением температуры // Получаем и считываем ответ data = ds.read(); // Читаем младший байт значения температуры data = ds.read(); // А теперь старший // Формируем итоговое значение: // - сперва "склеиваем" значение, // - затем умножаем его на коэффициент, соответсвующий разрешающей способности (для 12 бит по умолчанию - это 0,0625) float temperature = ((data << 8) | data) * 0.0625; // Выводим полученное значение температуры в монитор порта Serial.println(temperature); }

Скетч для работы с датчиком ds18b20 без delay

Можно немного усложнить программу для ds18b20, чтобы избавиться от , тормозящей выполнение скетча.

#include OneWire ds(8); // Объект OneWire int temperature = 0; // Глобальная переменная для хранения значение температуры с датчика DS18B20 long lastUpdateTime = 0; // Переменная для хранения времени последнего считывания с датчика const int TEMP_UPDATE_TIME = 1000; // Определяем периодичность проверок void setup(){ Serial.begin(9600); } void loop(){ detectTemperature(); // Определяем температуру от датчика DS18b20 Serial.println(temperature); // Выводим полученное значение температуры // Т.к. переменная temperature имеет тип int, дробная часть будет просто отбрасываться } int detectTemperature(){ byte data; ds.reset(); ds.write(0xCC); ds.write(0x44); if (millis() - lastUpdateTime > TEMP_UPDATE_TIME) { lastUpdateTime = millis(); ds.reset(); ds.write(0xCC); ds.write(0xBE); data = ds.read(); data = ds.read(); // Формируем значение temperature = (data << 8) + data; temperature = temperature >> 4; } }

Библиотека DallasTemperature и DS18b20

В своих скетчах мы можем использовать библиотеку DallasTemperature, упрощающую некоторые аспекты работы с датчиком ds18b20 по 1-Wire. Пример скетча:

#include // Номер пина Arduino с подключенным датчиком #define PIN_DS18B20 8 // Создаем объект OneWire OneWire oneWire(PIN_DS18B20); // Создаем объект DallasTemperature для работы с сенсорами, передавая ему ссылку на объект для работы с 1-Wire. DallasTemperature dallasSensors(&oneWire); // Специальный объект для хранения адреса устройства DeviceAddress sensorAddress; void loop(void){ // Запрос на измерения датчиком температуры Serial.print("Измеряем температуру..."); dallasSensors.requestTemperatures(); // Просим ds18b20 собрать данные Serial.println("Выполнено"); // Запрос на получение сохраненного значения температуры printTemperature(sensorAddress); // Задержка для того, чтобы можно было что-то разобрать на экране delay(1000); } // Вспомогательная функция печати значения температуры для устрйоства void printTemperature(DeviceAddress deviceAddress){ float tempC = dallasSensors.getTempC(deviceAddress); Serial.print("Temp C: "); Serial.println(tempC); } // Вспомогательная функция для отображения адреса датчика ds18b20 void printAddress(DeviceAddress deviceAddress){ for (uint8_t i = 0; i < 8; i++) { if (deviceAddress[i] < 16) Serial.print("0"); Serial.print(deviceAddress[i], HEX); } }

Библиотека OneWire для работы с DS18B20

DS18B20 использует для обмена информацией с ардуино протокол 1-Wire, для которого уже написана отличная библиотека. Можно и нужно использовать ее, чтобы не реализовывать все функции вручную. . Для установки библиотеки скачайте архив, распакуйте в папку library вашего каталога Arduino. Подключается библиотека с помощью команды #include

Все датчики DS18B20 подключаются параллельно, для них всех достаточно одного резистора. При помощи библиотеки OneWire можно одновременно считать все данные со всех датчиков. Если количество подключаемых датчиков более 10, нужно подобрать резистор с сопротивлением не более 1,6 кОм. Также для более точного измерения температуры нужно поставить дополнительный резистор на 100…120 Ом между выходом data на плате Ардуино и data на каждом датчике. Узнать, с какого датчика получено то или иное значение, можно с помощью уникального серийного 64-битного кода, который будет выдан в результате выполнения программы.

Для подключения температурных датчиков в нормальном режиме нужно использовать схему, представленную на рисунке.

Выводы

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

За дополнительные возможности приходится платить относительной сложностью работы с датчиком. Для подключения DS18B20 нам обязательно понадобится резистор с номиналом около 5К. Для работы с датчиком в скетчах ардуино нужно установить дополнительную библиотеку и получить определенные навыки для работы с ней – там все не совсем тривиально. Впрочем, можно купить уже готовый модуль, а для скетча в большинстве случаев хватит простых примеров, приведенных в этой статье.