Академический Документы
Профессиональный Документы
Культура Документы
Задача
Обзор цифрового сенсора температуры DS18B20, технические характеристики,
подключение к Arduino, работа с библиотеками и пример использования.
Товары
Много Достаточно
0
Содержание
● Обзор
● Технические характеристики
● Подключение к Arduino
● Работа с готовыми библиотеками
● Пример использования
● Часто задаваемые вопросы
Технически, датчики DS18B20 выпускаются в 3-х корпусах: ТО-92, SO, uSOP. Внешний вид и
распиновка корпусов показаны на рисунке №1.
0
Для того, чтобы понять принципы общения с датчиком, необходимо ознакомиться с его
внутренней составляющей. Эта на вид маленькая микросхема содержит в себе целый ряд
электронных блоков и модулей. На рисунке №2 показана структурная схема датчика DS18B20.
0
Первое на что хотелось бы обратить внимание – это способ питания микросхемы. Их всего два:
режим прямого питания (напряжение подаётся на выводы Vdd и GND) и режим паразитного
питания (датчик запитывается от линии данных). Более подробно эти режимы будут
рассмотрены ниже в статье.
Из структурной схемы видно, что за прямое питание отвечает блок (POWER SUPPLY SENSE), а
режим паразитного питания обеспечивает блок (PARASIT POWER CIRCUIT) в составе которого
основную роль играет конденсатор Срр, как питающий буфер.
Далее следует модуль “64-BIT ROM AND 1-WIRE PORT”. В нём содержится информация об
уникальном адресе каждого устройства. Как было сказано выше данный код записывается
заводом-изготовителем во внутреннюю энергонезависимую память датчика (EEPROM) и никогда
не повторяется. Здесь же размещена и подсистема взаимодействия с 1-Wire интерфейсом.
● ALARM HIGH TRIGGER и ALARM LOW TRIGGER. Эти регистры позволяют выставить верхний и
нижний порог срабатывания сигналов тревоги при выходе температуры за указанные
пределы.
● CONFIGURATON REGISTER. Данный регистр предназначен для настройки разрешающей
0
способности температурного датчика. Регистр может быть сконфигурирован на выполнение
преобразования температуры с точностью 9 бит, 10 бит, 11 бит или 12 бит, что соответствует
точности измерения 0.5оС, 0.25оС, 0.125оС и 0.0625оС.
● 8-BIT CRC GENERATOR. Данный регистр предназначен для генерации контрольной суммы с
целью повышения защиты данных.
Здесь всё довольно просто. Запитываем DS18B20 от самой платы Arduino, подавая 5V на вывод
Vdd датчика. Аналогичным образом соединяем между собой выводы GND. Средний вывод
термодатчика подключим, например, к выводу D2 нашей Arduino Nano. Подключать вывод
данных (DQ) можно практически на любой вход Arduino, предварительно прописав его номер в
скетче. Единственный и самый важный момент, на который следует обратить внимание – это
наличие резистора номиналом 4,7k между плюсом питания и линией данных термодатчика. Этот
резистор служит для подтяжки линии данных к логической единице и его отсутствие вызовет
сбой в работе алгоритма обмена информацией. Значение 4,7k не сильно критично и в некоторых
пределах его можно изменять, главное не увлекаться.
С прямым подключением одного датчика всё понятно, теперь рассмотрим прямое подключение
группы датчиков к одному выводу Arduino. На рисунке №4 показан пример подключения 5-ти
датчиков DS18B20. Это количество может быть любым и ограничивается только рамками
временем на опрос каждого из них (750мС).
0
Режим паразитного питания отличается от прямого тем, что датчики получают энергию
непосредственно с линии данных, без использования прямых 5V. При этом выводы Vdd и GNG
каждого термодатчика соединяются между собой. Более наглядно этот процесс отражён на
рисунке №5.
0
Как и в предыдущих схемах, здесь присутствует резистор 4,7k, который в данном случае играет
двойную роль, а именно: подтяжка линии данных к логической «1» и питание самого датчика.
Возможность такого включения обеспечивает встроенная в DS18B20 специальная схема и
буферный конденсатор Срр (рисунок №2). Иногда это позволяет сэкономить 1 провод в общем
шлейфе подключения группы термодатчиков, что в некоторых проектах играет существенную
роль.
После рассмотрения схем включения, самое время перейти к программированию и здесь можно
пойти тремя путями:
Библиотека OneWire.h
Рассмотрим для начала работу с библиотекой OneWire.h. Ниже приведён перечень её функций с
кратким описанием.
Данная функция является конструктором класса OneWire и создаёт объект temperatureSensor, т.е.
открывает канал связи с датчиком или групой датчиков на выводе pinNumber. В наших примерах
(рисунки 3-5) это вывод “D2” Arduino Nano. Именно к нему мы подключали шину данных DQ
DS18B20.
Пример:
● uint8_t search(addrArray)
Функция ищет очередное устройство на шине 1-Wire и при его обнаружении заносит значение
адреса в массив addrArray, возвращая при этом true. Так как уникальный адрес каждого датчика
составляет 64-бит, то массив addrArray должен иметь размерность 8 байт. В случае неудачного
поиска, функция возвращает false. Следует отметить, что при подключении нескольких
термодатчиков к одной шине, каждый вызов функции search будет адресован к следующему
датчику, затем следующему и т.д., пока не будут перебраны все устройства на шине. Особенность
0
данной функции – запоминать уже обработанные адреса. Для сброса очереди необходимо
вызвать функцию reset_search(), речь о которой пойдёт ниже.
Пример:
else {
● void reset_search()
Как говорилось выше, данная функция сбрасывает очередь опроса устройств на шине 1-Wire в
самое начало. Её всегда необходимо использовать в паре с функцией search, когда последняя
возвращает значение false. Например для нашего случая с 5-ю датчиками на шине, вызвав
функцию search 5 раз, мы можем получить 5 адресов. На шестой раз функция search вернёт нам
false и будет делать это при каждом следующем опросе до момента сброса очереди. На это
следует обращать внимание, чтобы избежать непонятных ситуаций.
Пример:
byte addrArray[8]; // Массив для хранения 64-битного адреса 0
if(!temperatureSensor.search(addrArray))
temperatureSensor.reset_search();
● uint8_t reset()
Функция сброса шины 1-Wire инициализирует процесс обмена данными. Она вызывается
каждый раз, когда мы хотим общаться с датчиком температуры. В качестве возвращаемых
значений могут быть true или false. Значение true мы получим, если хотя-бы один датчик на шине
ответит на сброс импульсом присутствия. В противном случае получим false;
Пример:
● void select(addrArray)
Пример:
byte addrArray[8]; // Массив для хранения 64-битного адреса 0
else {
● void skip()
Функция актуальна только при работе с одним датчиком на шине и просто пропускает выбор
устройства. Другими словами можно не использовать поиск функцией search, и следовательно
быстро получить доступ с своему единственному датчику.
Пример:
Функция посылает байт данных byte выбранному устройству на шине. Аргумент powerType
указывает тип питания датчиков (0 – датчики питаются напрямую от внешнего источника; 1 –
используется подключение с паразитным питанием). Второй параметр можно не указывать, если
используется внешнее питание, так как он по умолчанию равен 0.
Пример:
temperatureSensor.reset(); // Сбрасываем шину 0
temperatureSensor.write(0x44, 1);
● uint8_t read()
Данная функция считывает один байт данных, посланный ведомым устройством (датчиком) на
шину 1-Wire.
Пример:
byte array[9];
array[i] = temperatureSensor.read();
Пример:
byte addrArray[8]; // Массив для хранения 64-битного адреса 0
else {
// ОСНОВНОЙ ЦИКЛ
void loop(void) {
byte i; //
Вспомогательная переменная для циклов
byte data[12]; //
Массив для хранения принятой от датчика информации
byte addr[8]; //
Массив для хранения 64-битного адреса датчика
// и осуществляем повторный
поиск, выждав 250мС
if (!ds.search(addr)) {
Serial.println("No more
addresses.");
Serial.println();
ds.reset_search();
delay(250); return;
}
0
Serial.print("ROM =");
if (OneWire::crc8(addr, 7) != addr[7]) {
return;
Serial.println();
// байта, выводим в монитор порта серию чипа. Если нулевой байт содержит
неизвестное
switch (addr[0]) {
default: Serial.println("Device is
not a DS18x20 family device.");
return;
0
ds.write(0x44, 1);
delay(1000);
present = ds.reset();
ds.select(addr);// Повторно
выбираем датчик по его адресу, так как был импульс сброса
ds.write(0xBE);
data[i] = ds.read();
Serial.print(data[i], HEX); Serial.print(" ");
0
Serial.print(" CRC=");
Serial.println();
// Перед дальнейшим
преобразованием, на потребуется определить семейство, к которому
}
else {
0
if (cfg == 0x00) raw = raw & ~7; // 9 бит (преобразование занимает 93.75 ms)
else if (cfg == 0x20) raw = raw & ~3; // 10 бит (преобразование
занимает 187.5 ms)
else if (cfg == 0x40) raw = raw & ~1; // 11 бит (преобразование
занимает 375 ms)
Serial.print(fahrenheit); Serial.println("
Fahrenheit");
Если всё сделано правильно, то в окне монитора порта мы должны будем увидеть примерно
следующее (рисунок №6):
0
Библиотека DallasTemperature.h
Данная библиотека основана на предыдущей и немного упрощает процесс программирования за
счёт более понятных для восприятия функций. После установки, вы получите доступ к 14
примерам хорошо документированного кода на все случаи жизни. В рамках этой статьи будет
рассмотрен пример работы одним датчиком.
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
// ФУНКЦИЯ ПРЕДУСТАНОВОК
void setup(void)
// ОСНОВНОЙ ЦИКЛ
void loop(void)
Serial.print("Reading
Temperature...");
sensors.requestTemperatures();
Serial.println("Read");
0
Serial.print("Sensor
Temperature 1: ");
Serial.print(sensors.getTempCByIndex(0));
2. Как применять подобные датчики для измерения температур в жидкой или агрессивной
среде?
● Да, возможно. В этом случае для каждой шины данных создаётся свой экземпляр класса
библиотеки OneWire или DallasTemperature.
Товары
0
Много Достаточно
Наши контакты
+7 (499) 390-50-30
info@3d-diy.ru