Датчик температуры arduino ds18b20
Содержание:
Описание датчика DS18B20 для Arduino
Микросхема имеет три выхода, из которых для данных используется только один, два остальных – это земля и питание. Число проводов можно сократить до двух, если использовать схему с паразитным питанием и соединить Vdd с землей. К одному проводу с данными можно подключить сразу несколько датчиков DS18B20 и в плате Ардуино будет задействован всего один пин.
Особенности цифрового датчика DS18B20
Погрешность измерения не больше 0,5 С (для температур от -10С до +85С), что позволяет точно определить значение температуры. Не требуется дополнительная калибровка.
Температурный диапазон измерений лежит в пределах от -55 С до +125 С.
Датчик питается напряжением от 3,3В до 5В.
Можно программно задать максимальную разрешающую способность до 0,0625С, наибольшее разрешение 12 бит.
Присутствует функция тревожного сигнала.
Каждое устройство обладает своим уникальным серийным кодом.
Не требуются дополнительные внешние элементы.
Можно подключить сразу до 127 датчиков к одной линии связи.
Информация передается по протоколу 1-Wire.
Для присоединения к микроконтроллеру нужны только 3 провода.
Существует так называемый режим паразитного питания – в нем происходит питание напрямую от линии связи. Для подключения в этом случае нужны только 2 провода
Важно, что в этом режиме не гарантируется корректная работа при температурах выше 100С. Режим паразитного питания удобно обычно применяется для приложений с удаленным температурным датчиком.
Память датчика состоит из двух видов: оперативной и энергонезависимой – SRAM и EEPROM. В последнюю записываются регистры конфигурации и регистры TH, TL, которые могут использоваться как регистры общего назначения, если не используются для указания диапазона допустимых значений температуры.
Основной задачей DS18B20 является определение температуры и преобразование полученного результата в цифровой вид. Мы можем самостоятельно задать необходимое разрешение, установив количество бит точности – 9, 10, 11 и 12. В этих случаях разрешающие способности будут соответственно равны 0,5С, 0,25С, 0,125С и 0,0625С.
Во время включения питания датчик находится в состоянии покоя. Для начала измерения контроллер Ардуино выполняет команду «преобразование температуры». Полученный результат сохранится в 2 байтах регистра температуры, после чего датчик вернется в первоначальное состояние покоя. Если схема подключена в режиме внешнего питания, микроконтроллер регулирует состояние конвертации. Во время выполнения команды линия находится в низком состоянии, после окончания программы линия переходит в высокое состояние. Такой метод не допустим при питании от паразитной емкости, так как на шине постоянно должен сохраняться высокий уровень сигнала.
Полученные температурные измерения сохраняются в 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 представлена на рисунке.
В режиме паразитного питания контакт Vdd с датчика подключается к GND на Ардуино – в этом случае пригодятся только два провода. Работу в паразитном режиме лучше не использовать без необходимости, так как могут ухудшиться быстродействие и стабильность.
Программа 2
Теперь будем выводить такую строку: “температура с момента запуска программы” -> “текущая температура”. Может быть полезным для исследования изменения температуры. Нам нужно завести переменную для хранения первого значения, назовём её . При запуске программы запросим температуру с датчика, подождём, запишем результат в переменную и будем выводить на дисплей как в предыдущем примере:
#include <LiquidCrystal_I2C.h> // подключаем библу LiquidCrystal_I2C lcd(0x27, 16, 2); // адрес, столбцов, строк #include <microDS18B20.h> MicroDS18B20<2> sensor; float prevT; // переменная для хранения температуры void setup() { lcd.init(); // инициализация lcd.backlight(); // включить подсветку sensor.requestTemp(); // запрос температуры delay(1000); // ждём prevT = sensor.getTemp(); // запомнили } void loop() { sensor.requestTemp(); // запрос температуры delay(1000); // ждём lcd.home(); // курсор в 0,0 lcd.print(prevT, 1); // вывод prevT с точностью 1 знак lcd.write(223); // градус lcd.print(' '); // пробел lcd.write(126); // стрелочка lcd.print(' '); // пробел lcd.print(sensor.getTemp(), 1); // текущая температура lcd.write(223); // градус }
Также можно вывести время, прошедшее с момента запуска программы, например в формате часы:секунды.
- У нас есть функция , которая возвращает время работы программы в миллисекундах.
- даст нам секунды, запишем в переменную .
- Чтобы получить количество секунд в пределах одной минуты, разделим секунды на 60:
- Чтобы получить количество минут из общего количества секунд – нужно выполнить операцию остаток от деления, опять же на 60:
- Чтобы выводить значения с ведущим нулём (например 03 вместо 3), сделаем простое условие:
- Обернём вывод времени в функцию для лучшей читаемости кода
#include <LiquidCrystal_I2C.h> // подключаем библу LiquidCrystal_I2C lcd(0x27, 16, 2); // адрес, столбцов, строк #include <microDS18B20.h> MicroDS18B20<2> sensor; float prevT; // переменная для хранения температуры void setup() { lcd.init(); // инициализация lcd.backlight(); // включить подсветку sensor.requestTemp(); // запрос температуры delay(1000); // ждём prevT = sensor.getTemp(); // запомнили } void loop() { sensor.requestTemp(); // запрос температуры delay(1000); // ждём lcd.home(); // курсор в 0,0 lcd.print(prevT, 1); // вывод prevT с точностью 1 знак lcd.write(223); // градус lcd.print(' '); // пробел lcd.write(126); // стрелочка lcd.print(' '); // пробел lcd.print(sensor.getTemp(), 1); // текущая температура lcd.write(223); // градус printTime(); // выводим время } // функция вывода времени void printTime() { lcd.setCursor(0, 1); // курсор на вторую строку int sec = millis() / 1000; // общее количество секунд byte thisM = sec / 60; // количество минут if (thisM < 10) lcd.print(0); // ведущий 0 lcd.print(thisM); // минуты lcd.print(':'); // двоеточие byte thisS = sec % 60; // количество секунд if (thisS < 10) lcd.print(0); // ведущий 0 lcd.print(thisS); // секунды }
Внутренняя структура микросхемы и памяти, шина 1-Wire
Для понимания принципа работы, вначале стоит ознакомиться с блок-схемой корпуса:
Любая работа с микросхемой производится всегда, начиная с трех процедур: инициализации, команды ROM и отправки функционального кода. После, при необходимости, идет обмен данными между датчиком и контроллером. В случае не соблюдения последовательности, — логическая часть DS18B20 станет в своеобразный «ступор», не реагируя до сброса. Единственным исключением здесь будут команды F0 и EC, первая из которых «Поиск ПЗУ», вторая «Определение тревоги датчика».
Понятие инициализации подразумевает подачу микроконтроллером краткосрочного импульса на шину 1-Wire длительностью 480 мс и ожидание им ответа от датчика в течении 60 мс. Сам сенсор, при своей готовности к работе, отправляет сигнал высокого уровня с длительностью до 240 мс.
Обмен данными в рамках шины 1-Wire производится по 1 биту, когда они передаются в определенные временные интервалы, начиная с младшего. Каждый фиксированный промежуток в 60 мс предназначен для хранения одного состояния, нуля или единицы.
В сущности, процесс работы в рамках 1-Wire всегда одинаков. Выполнив сброс, описанный ранее, и получив ответ о присутствии устройства на линии микроконтроллер должен выбрать, к какому именно датчику на шине обратиться. Для этого используются ROM команды. Полный их список шины 1-Wire:
Команда | Действие | |
---|---|---|
F0 | Поиск ROM | Определение устройств на линии. В текущем виде ответом будет номер каждого из датчиков |
33 | Чтение ROM | Применяется, если на 1-Wire находится только одно устройство, оно будет выбрано по умолчанию |
CC | Пропуск ROM | Отправка последующей команды всем устройствам шины |
55 | Совпадение ROM | Выбор конкретного датчика для ответа. После отсылки этой ROM команды следом должен быть отправлен 64 битный ИД подключенной точки, от которой будут ожидаться последующие ответы. |
EC | Поиск тревожного сигнала | Эта ROM команда вызовет отклик только тех DS18B20, на которых есть состояние тревоги |
После отправки ROM команды, идет обмен с конкретным датчиком и посылка функциональных кодов для него. В высоко уровневой части, все эти операции выполняются подключением готовых библиотек в Arduino IDE с кодом, который и будет производить необходимые временные задержки и подачу напряжения на выходах контроллера для шины 1-Wire.
Немного про ИД устройства. Он содержит в себе не только сам уникальный номер корпуса, но и информацию о семействе сенсора и его контрольную сумму.
С передачей данных разобрались. Теперь нужно рассмотреть структуру памяти EEPROM самой микросхемы. Это требуется знать по причине того, что сенсор всегда в ответ на функциональную команду BE отправляет все ее содержимое.
На запись доступны только байты 2–4, которые используются при работе функциональных команд. Значение температур измерителя читается из 0–1, а 5–7 зарезервированы и всегда возвращают 1. В 8 хранится код CRC позволяющий проверить правильность прочтенных байт памяти.
С регистром конфигурации все немного сложнее. Из представляющего его байта используется только 5 и 6 бит, устанавливающий разрядность датчика. При запуске они равны 11, что означает 12 битное представление числа измеренной температуры. Чем оно выше, тем дольше логический сенсор будет преобразовывать его. В следующей таблице представлены значения битов R0(6) и R1(5), соответственно шестого и пятого по очереди в байте конфигурации, а также зависимость разрядности от них:
Регистры Th и Tl используются только с целью задания промежутка значений температуры порога тревоги. Их содержимое, как и конфигурацию можно сохранять в энергонезависимой памяти устройства.
Как выполнить правильное питание DS18B20
Микросхема DS18B20 позволяет осуществить 2 типа подключения:
- паразитный режим;
- подключение к внешнему источнику.
Рассмотрим более детально каждый из них.
Паразитный режим
Данный тип подключения считается более рациональным. Основное его преимущество — возможность работы с большим количеством датчиков с помощью специальных приложений.
При высоком U на шине микросхемы DS18B20 работает и заряжает Cpp при помощи вывода DQ. Обязательное условие для работы устройства в подобном режиме — заземление Vdd. При смене уровня сигнала на логический «0» питание схемы осуществляется от ранее заряженного конденсатора. В обычном режиме работы микросхема DS18B20 способна демонстрировать непрерывную и стабильную работу при соблюдении электрических характеристик.
Однако при выполнении микросхемой частых преобразований и взаимодействий с памятью потребляемый ток может превысить 1,5 мА. Это приведет к просадке напряжения на шине ниже минимально допустимого уровня. Для решения этой задачи необходимо использовать MOSFET транзистор. Он работает, когда выполняется копирование данных или же преобразование температуры. Тем не менее его используют очень редко, так как запас мощности микросхемы DS18B20 позволяет выполнять вычисления без снижения уровня напряжения.
Недостатки паразитного подключения
В большинстве случаев рационально применять данный метод. Однако если измеряемая температура выше 100°С, то возникает большой ток утечки, и заряда конденсатора Cpp не хватает для полноценного функционирования микросхемы. В таких случаях лучше применять питание микросхемы от внешнего источника.
Подключение цифрового датчика температуры DS18B20 к внешнему источнику питания
Основное достоинство прямого подключения — отсутствие MOSFET транзистора. Питание микросхемы осуществляется от внешнего источника с помощью резистора номиналом 4,7 кОм. Во время работы по данной схеме основная шина преобразования может быть использована в других целях, потому что она остается свободной.
Примеры работы для Arduino
Один датчик
Рассмотрим простой пример — подключения одного датчика.
Сенсор подключается к управляющей плате через один сигнальный пин.
При подключении к Arduino в компактном формфакторе, например Arduino Micro или Iskra Nano Pro, воспользуйтесь макетной платой и парочкой нажимных клеммников.
Между сигнальным проводом и питанием установите сопротивление 4,7 кОм.
При коммуникации сенсора со стандартными платами Arduino формата Rev3, Arduino Uno или Iskra Neo, используйте Troyka Slot Shield совместно с модулем подтяжки.
Код программы
Выведем температуру сенсора в Serial-порт.
- simple.ino
-
// библиотека для работы с протоколом 1-Wire #include <OneWire.h> // библиотека для работы с датчиком DS18B20 #include <DallasTemperature.h> // сигнальный провод датчика #define ONE_WIRE_BUS 5 // создаём объект для работы с библиотекой OneWire OneWire oneWire(ONE_WIRE_BUS); // создадим объект для работы с библиотекой DallasTemperature DallasTemperature sensor(&oneWire); void setup(){ // инициализируем работу Serial-порта Serial.begin(9600); // начинаем работу с датчиком sensor.begin(); // устанавливаем разрешение датчика от 9 до 12 бит sensor.setResolution(12); } void loop(){ // переменная для хранения температуры float temperature; // отправляем запрос на измерение температуры sensor.requestTemperatures(); // считываем данные из регистра датчика temperature = sensor.getTempCByIndex(); // выводим температуру в Serial-порт Serial.print("Temp C: "); Serial.println(temperature); // ждём одну секунду delay(1000); }
Серия датчиков
Каждый сенсор DS18B20 хранит в своей памяти уникальный номер, такое решение позволяет подключить несколько датчиков к одному пину.
Добавим к предыдущем схемам подключения ещё по паре датчиков в параллель.
Код программы
Просканируем все устройства на шине и выведем температуру каждого сенсора отдельно в Serial-порт.
- multipleSensors.ino
-
// библиотека для работы с протоколом 1-Wire #include <OneWire.h> // библиотека для работы с датчиком DS18B20 #include <DallasTemperature.h> // сигнальный провод датчика #define ONE_WIRE_BUS 5 // создаём объект для работы с библиотекой OneWire OneWire oneWire(ONE_WIRE_BUS); // создадим объект для работы с библиотекой DallasTemperature DallasTemperature sensors(&oneWire); // создаём указатель массив для хранения адресов датчиков DeviceAddress *sensorsUnique; // количество датчиков на шине int countSensors; // функция вывода адреса датчика void printAddress(DeviceAddress deviceAddress){ for (uint8_t i = ; i < 8; i++){ if (deviceAddressi < 16) Serial.print("0"); Serial.print(deviceAddressi, HEX); } } void setup(){ // инициализируем работу Serial-порта Serial.begin(9600); // ожидаем открытия Serial-порта while(!Serial); // начинаем работу с датчиком sensors.begin(); // выполняем поиск устройств на шине countSensors = sensors.getDeviceCount(); Serial.print("Found sensors: "); Serial.println(countSensors); // выделяем память в динамическом массиве под количество обнаруженных сенсоров sensorsUnique = new DeviceAddresscountSensors; // определяем в каком режиме питания подключены сенсоры if (sensors.isParasitePowerMode()) { Serial.println("Mode power is Parasite"); } else { Serial.println("Mode power is Normal"); } // делаем запрос на получение адресов датчиков for (int i = ; i < countSensors; i++) { sensors.getAddress(sensorsUniquei, i); } // выводим полученные адреса for (int i = ; i < countSensors; i++) { Serial.print("Device "); Serial.print(i); Serial.print(" Address: "); printAddress(sensorsUniquei); Serial.println(); } Serial.println(); // устанавливаем разрешение всех датчиков в 12 бит for (int i = ; i < countSensors; i++) { sensors.setResolution(sensorsUniquei, 12); } } void loop(){ // переменная для хранения температуры float temperature10; // отправляем запрос на измерение температуры всех сенсоров sensors.requestTemperatures(); // считываем данные из регистра каждого датчика по очереди for (int i = ; i < countSensors; i++) { temperaturei = sensors.getTempCByIndex(i); } // выводим температуру в Serial-порт по каждому датчику for (int i = ; i < countSensors; i++) { Serial.print("Device "); Serial.print(i); Serial.print(" Temp C: "); Serial.print(temperaturei); Serial.println(); } Serial.println(); // ждём одну секунду delay(1000); }
Как работают современные датчики температуры
Блок-схема датчика температуры типа DS18B20 выглядит следующим образом:
Исходя из вышеприведенной структуры, рассматриваемый датчик состоит из:
- регистра конфигурации, программируемого пользователем (9–12 разрядов);
- датчика температуры;
- верхнего Th и нижнего Tl порога срабатывания сигнала тревоги;
- 64-битной памяти типа ROM и блока обработки протокола 1-Wire;
- внутреннего источника питания, способного работать как от внешнего источника, так и от «паразитных» импульсов.
Принцип работы
Основная функция микросхемы DS18B20 — трансформация показаний встроенного датчика температуры в цифровой код. Это преобразование зависит от разрешения преобразования, установленного пользователем, которое варьируется от 9 до 12 бит (0,5°–0,625°С). Если настройки не производились, то установка регистра конфигурации соответствует 12 битам.
В начальном состоянии DS18B20 находится в состоянии покоя или иными словами в низком энергетическом уровне. Для начала измерений микроконтроллер подает сигнал , после чего полученные данные сохраняются в регистр, а сам датчик переходит в режим «покоя».
При работе цифрового датчика температуры DS18B20 от независимого источника питания микроконтроллер способен контролировать процесс выполнения команды , которая осуществляет измерение температуры. Таким образом, датчик температуры DS18B20 сформирует логический «0» во время трансформации показаний температурного режима и логическую «1» в случае окончания процесса преобразования.
Если питание микросхемы осуществляется при помощи «паразитного метода», то контроль логических «0» и «1» невозможен, поскольку на шине будет постоянно дежурить высокий уровень напряжения питания.
После снятия и обработки сигнала с датчика температуры в микросхеме DS18B20 полученные данные в градусах Цельсия сохраняются в виде 16-битного числа с признаком (S), который отвечает за знак «+» или «-» температуры. Структура регистра температуры будет выглядеть так, как показано ниже.
Если показания температуры выше «0», то показатель S=0, если же значение температуры отрицательное, то S=1. Ниже представлена таблица соответствия данных и температуры.
Описание датчика DS18B20 для Arduino
DS18B20 – это цифровой температурный датчик, обладающий множеством полезных функций. По сути, DS18B20 – это целый микроконтроллер, который может хранить значение измерений, сигнализировать о выходе температуры за установленные границы (сами границы мы можем устанавливать и менять), менять точность измерений, способ взаимодействия с контроллером и многое другое. Все это в очень небольшом корпусе, который, к тому же, доступен в водонепроницаемом исполнении.
Микросхема имеет три выхода, из которых для данных используется только один, два остальных – это земля и питание. Число проводов можно сократить до двух, если использовать схему с паразитным питанием и соединить Vdd с землей. К одному проводу с данными можно подключить сразу несколько датчиков DS18B20 и в плате Ардуино будет задействован всего один пин.
Где купить датчик
Влагозащищенный датчик температуры DS18B20 с длиной провода 1 м от надежного магазина | Комплект из 10 микросхем DS18B20 TO92 | Модуль DS18B20 для удобного подключения к Ардуино от Keyestudio |
Беспроводной модуль DS18B20 на ESP8266 ESP-01 ESP-01S для проектов умного дома | Шилд датчика DS18B20 для платы D1 MINI – беспроводная передача данных | Датчик DS18B20 с модулем для подключения к Ардуино |
Особенности цифрового датчика DS18B20
Погрешность измерения не больше 0,5 С (для температур от -10С до +85С), что позволяет точно определить значение температуры. Не требуется дополнительная калибровка.
Температурный диапазон измерений лежит в пределах от -55 С до +125 С.
Датчик питается напряжением от 3,3В до 5В.
Можно программно задать максимальную разрешающую способность до 0,0625С, наибольшее разрешение 12 бит.
Присутствует функция тревожного сигнала.
Каждое устройство обладает своим уникальным серийным кодом.
Не требуются дополнительные внешние элементы.
Можно подключить сразу до 127 датчиков к одной линии связи.
Информация передается по протоколу 1-Wire.
Для присоединения к микроконтроллеру нужны только 3 провода.
Существует так называемый режим паразитного питания – в нем происходит питание напрямую от линии связи. Для подключения в этом случае нужны только 2 провода
Важно, что в этом режиме не гарантируется корректная работа при температурах выше 100С. Режим паразитного питания удобно обычно применяется для приложений с удаленным температурным датчиком.
Память датчика состоит из двух видов: оперативной и энергонезависимой – SRAM и EEPROM. В последнюю записываются регистры конфигурации и регистры TH, TL, которые могут использоваться как регистры общего назначения, если не используются для указания диапазона допустимых значений температуры.
Основной задачей DS18B20 является определение температуры и преобразование полученного результата в цифровой вид. Мы можем самостоятельно задать необходимое разрешение, установив количество бит точности – 9, 10, 11 и 12. В этих случаях разрешающие способности будут соответственно равны 0,5С, 0,25С, 0,125С и 0,0625С.
Во время включения питания датчик находится в состоянии покоя. Для начала измерения контроллер Ардуино выполняет команду «преобразование температуры». Полученный результат сохранится в 2 байтах регистра температуры, после чего датчик вернется в первоначальное состояние покоя. Если схема подключена в режиме внешнего питания, микроконтроллер регулирует состояние конвертации. Во время выполнения команды линия находится в низком состоянии, после окончания программы линия переходит в высокое состояние. Такой метод не допустим при питании от паразитной емкости, так как на шине постоянно должен сохраняться высокий уровень сигнала.
Полученные температурные измерения сохраняются в SRAM датчика. 1 и 2 байты сохраняют полученное значение температуры, 3 и 4 сохраняют пределы измерения, 5 и 6 зарезервированы, 7 и 8 используются для высокоточного определения температуры, последний 9 байт хранит устойчивый к помехам CRC код.
Выводы
Микросхема Dallas DS18B20 является очень интересным устройством. Датчики температуры и термометры, созданные на ее основе, обладают приемлемыми для большинства задач характеристиками, развитым функционалом, относительно не дороги. Особенную популярность датчик DS18B20 снискал как влагозащищенное устройство для измерения температуры жидкостей.
За дополнительные возможности приходится платить относительной сложностью работы с датчиком. Для подключения DS18B20 нам обязательно понадобится резистор с номиналом около 5К. Для работы с датчиком в скетчах ардуино нужно установить дополнительную библиотеку и получить определенные навыки для работы с ней – там все не совсем тривиально. Впрочем, можно купить уже готовый модуль, а для скетча в большинстве случаев хватит простых примеров, приведенных в этой статье.