Считываем показания датчика ds18b20 (ds18s20)

Датчик температуры Arduino DS18B20

Датчик температуры в Arduino — один из самых распространенных видов датчиков. Разработчику проектов с термометрами на Arduino доступно множество разных вариантов, отличающихся по принципу действия, точности, конструктивному исполнению.

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

В этой статье вы найдете описание датчика ds18b20 на русском, мы вместе рассмотрим особенности подключения к ардуино, принцип работы датчика, описание библиотек и скетчей.

Описание датчика DS18B20 для Arduino

DS18B20 – это цифровой температурный датчик, обладающий множеством полезных функций.

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

Микросхема имеет три выхода, из которых для данных используется только один, два остальных — это земля и питание. Число проводов можно сократить до двух, если использовать схему с паразитным питанием и соединить Vdd с землей. К одному проводу с данными можно подключить сразу несколько датчиков DS18B20 и в плате Ардуино будет задействован всего один пин.

Виды корпусов DS18B20

Температурный датчик DS18B20 имеет разнообразные виды корпуса. Можно выбрать один из трех — 8-Pin SO (150 mils), 8-Pin µSOP, и 3-Pin TO-92.

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

Для корпуса TO-92 нужно смотреть на цвет проводов: черный — земля, красный — питание и белый/желтый/синий — сигнал. В интернет-магазинах можно купить готовый модуль 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 на Ардуино – в этом случае пригодятся только два провода. Работу в паразитном режиме лучше не использовать без необходимости, так как могут ухудшиться быстродействие и стабильность.

Скетч для DS18B20

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

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

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

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

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

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

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

#include
#include // Номер пина Arduino с подключенным датчиком
#define PIN_DS18B20 8 // Создаем объект OneWire
OneWire oneWire(PIN_DS18B20); // Создаем объект DallasTemperature для работы с сенсорами, передавая ему ссылку на объект для работы с 1-Wire.
DallasTemperature dallasSensors(&oneWire); // Специальный объект для хранения адреса устройства
DeviceAddress sensorAddress; void setup(void){ Serial.begin(9600); Serial.println(“Пример работы с датчиком температуры ds18b20 с помощью библиотеки DallasTemperature”); // Выполняем поиск устрйоств на линии Serial.print(“Ищем устройства…”); dallasSensors.begin(); Serial.print(“Найдено “); Serial.print(dallasSensors.getDeviceCount(), DEC); Serial.println(” устройств.”); // Определяем режим питания (по отдельной линии или через паразитное питание по линии данных) Serial.print(“Режим паразитного питания: “); if (dallasSensors.isParasitePowerMode()) Serial.println(“ВКЛЮЧЕН”); else Serial.println(“ВЫКЛЮЧЕН”); // Раскомментируйте, если хотите задать адрес устройства вручную //sensorAddress = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 }; // Поиск устройства: // Ищем адрес устройства по порядку (индекс задается вторым параметром функции) if (!dallasSensors.getAddress(sensorAddress, 0)) Serial.println(“Не можем найти первое устройство”); // Второй вариант поиска с помощью библиотеки OnewWire. // Перезапускаем поиск //oneWire.reset_search(); // Находим первое устройство и запоминаем его адрес в sensorAddress //if (!oneWire.search(sensorAddress)) Serial.println(“Unable to find address for sensorAddress”); // Отображаем адрес ds18b20, который мы нашли Serial.print(“Адрес устройства: “); printAddress(sensorAddress); Serial.println(); // Устанавливаем разрешение датчика в 12 бит (мы могли бы установить другие значения, точность уменьшится, но скорость получения данных увеличится dallasSensors.setResolution(sensorAddress, 12); Serial.print(“Разрешение датчика: “); Serial.print(dallasSensors.getResolution(sensorAddress), DEC); Serial.println();
} 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, для которого уже написана отличная библиотека. Можно и нужно использовать ее, чтобы не реализовывать все функции вручную.

Скачать OneWire можно здесь. Для установки библиотеки скачайте архив, распакуйте в папку library вашего каталога Arduino.

Подключается библиотека с помощью команды #include<\p>

Основные команды библиотеки OneWire:

  • search(addressArray) – ищет температурный датчик, при нахождении в массив addressArray записывается его код, в ином случае – false.
  • reset_search() – производится поиск на первом приборе.
  • reset() – выполнение сброса шины перед тем, как связаться с устройством.
  • select(addressArray) – выбирается устройство после операции сброса, записывается его ROM код.
  • write(byte) – производится запись байта информации на устройство.
  • write(byte, 1) – аналогично write(byte), но в режиме паразитного питания.
  • read() – чтение байта информации с устройства.
  • crc8(dataArray, length) – вычисление CRC кода. dataArray – выбранный массив, length – длина кода.

Важно правильно настроить режим питания в скетче. Для паразитного питания в строке 65 нужно записать ds.write(0x44, 1);. Для внешнего питания в строке 65 должно быть записано ds.write(0x44).

Write позволяет передать команду на термодатчик. Основные команды, подаваемые в виде битов:

  • 0x44 – измерить температуру, записать полученное значение в SRAM.
  • 0x4E – запись 3 байта в третий, четвертый и пятый байты SRAM.
  • 0xBE – последовательное считывание 9 байт SRAM.
  • 0х48 – копирование третьего и четвертого байтов SRAM в EEPROM.
  • 0xB8 – копирование информации из EEPROM в третий и четвертый байты SRAM.
  • 0xB4 – возвращает тип питания (0 – паразитное, 1 – внешнее).

Подключение нескольких датчиков температуры DS18B20 к Ардуино

Все датчики DS18B20 подключаются параллельно, для них всех достаточно одного резистора.  При помощи библиотеки OneWire можно одновременно считать все данные со всех датчиков. Если количество подключаемых датчиков более 10, нужно подобрать резистор с сопротивлением не более 1,6 кОм.

Также для более точного измерения температуры нужно поставить дополнительный резистор на 100…120 Ом между выходом data на плате Ардуино и data на каждом датчике.

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

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

В режиме паразитного питания схема выглядит иначе. Контакт Vdd практически не задействован, питание идет через выход data.

Выводы

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

За дополнительные возможности приходится платить относительной сложностью работы с датчиком. Для подключения нам обязательно понадобится резистор с номиналом около 5К.

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

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

Источник: https://ArduinoMaster.ru/datchiki-arduino/arduino-ds18b20/

Практическое программирование Arduino/CraftDuino – температурный 1-Wire датчик DS18S20

В продолжение темы рассмотрим температурный 1-Wire датчик — DS18S20 🙂

DS18S20 – высокоточный цифровой термометр с интерфейсом (High Precision 1-Wire Digital Thermometer) от DALLAS Semiconductor (Maxim).

Для подключения датчика достаточно двух проводов – линии данных и заземления;

питание элемента в этом случае называется «паразитным»/фантомным (Parasite power mode) и осуществляется по линии данных за счёт накопления энергии во встроенном конденсаторе во время высокого уровня напряжения

Нормальный режим питания (external supply), заключается в подключении к датчику источника питания (3V-5V).

В обоих случаях рекомендуется использовать подтягивающий резистор в 4.7k

Характеристики DS18S20:

Интерфейс 1-Wire

Измеряемая температура от -55 до +125 °C

Точность 0.5 °C в диапазоне от -10 до +85 °С
Температура считывается 9-ю битами данных
Время на конвертацию температуры — 750 ms (максимальное) Как и любое 1-Wire устройство — каждый DS18S20 содержит уникальный 64-битный ROM

Первые 8 бит — код серии ( для DS18S20 код — 10h, а для DS18B20 — 28h ).

Затем 48 бит уникального номера, и в конце 8 бит CRC-кода.

Однако, самое интересное — данные о температуре хранятся в оперативной памяти(scratch-pad memory) датчика.

Память состоит из оперативной ROM и энергонезависимой EEPROM: Первые два байта – содержат данные об измеренной температуре, Третий и четвёртый байты хранят верхний (TH) и нижний (TL) пределы температуры. Пятый и шестой – не используются. Седьмой и восьмой – байты – счётчики – могут использоваться для более точного измерения температуры. Девятый байт хранит CRC-код предыдущих восьми 🙂 Теперь осталось разобраться с тем – какие команды может выполнять этот датчик. Кроме уже знакомых нам:

Поиск адресов — Search ROM [F0h]

Чтение адреса устройства — Read ROM [33h]
Выбор адреса — Match ROM [55h]
Игнорировать адрес — Skip ROM [CCh] Добавились:

Поиск Тревоги — Alarm Search [ECh] – операция этой команды идентична операции поиска адресов [F0h], за исключением того, что в данном случае ответят только те датчики, у которых, при последнем измерении, температуры вышла за установленные пределы (выше TH или ниже TL).

И команды работы со scratch-pad memory:

Конвертировать температуру — Convert T [44h] – датчик произведёт измерение и запись данных о текущей температуре. Если ведущее устройство будет за этой командой слать тайм-слоты чтения, то пока конвертация не закончена — DS18S20 будет выдавать в линию «0», а после завершения конвертации «1».

Если датчик работает в режиме паразитного питания, то не позже 10 мкс после подачи команды устройство управления должно установить высокий уровень на шине на время продолжительности преобразование (не менее 750 ms)

Запись в память — Write Scratchpad [4Eh] – эта команда позволяет записать 3 байта в память датчику. Первый байт запишется в TH, второй в TL, а третий байт запишется в пятый байт памяти – у DS18S20 – он не используется, а у DS18B20 – это байт конфигурации

Чтение памяти — Read Scratchpad [BEh] – позволяет нам считать память датчика. В ответ на эту команду датчик вернёт 9 байт своей памяти, начиная с 0-го байта TEMPERATURE LSB и заканчивая восьмым – CRC.

Копировать память — Copy Scratchpad [48h] – датчик скопирует содержимое ОЗУ — TH и TL в EEPROM

Повторная загрузка — Recall E2 [B8h] – загружает данные из EEPROM в ОЗУ. Эта операция выполняется автоматически, как только на датчик подаётся напряжение.

Вид электропитания датчика — Read Power Supply [B4h] – с помощью этой команды можно определить – какой вид питания использует датчик. Если датчик выставит на шине «0» — значит он использует паразитное питание. Если же датчик использует внешнее питание, то он ответит «1».

Теперь становится понятно, что нужно сделать, чтобы получить от датчика данные о температуре 🙂 После RESET-а и поиска устройств на линии 1-Wire, нужно выдать команду

0x44, чтобы запустить конвертацию температуры датчиком.

Подождать не менее 750 ms и выдать команду

0xBE, чтобы считать ОЗУ датчика.

Данные о температуре будут в первых двух байтах.Остаётся только сложить эти два байта, предварительно сдвинув старший байт на 8 бит влево:TReading = (HighByte

Источник: http://robocraft.ru/blog/arduino/136.html

Инструкция по применению датчика температуры DS18B20

DS18B20 — современный программируемый датчик цифрового типа для контроля изменений температуры с функцией аварийного сигнала.

 Данные устройства работают согласно протоколу 1-Wire (однопроводная линия связи с микроконтроллером) и снабжены энергонезависимой памятью для сохранения и контроля запрограммированных параметров интерфейса.

 Корректное измерение температуры DS18B20 происходит в диапазоне от -55° до +125°С, но наименьшая погрешность, составляющая 0,5°С, достигается в диапазоне от -10° до +85°С.

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

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

Общая характеристика, названия и маркировка выводов моделей DS18B20

В зависимости от конструкции микросхема-датчик температуры Dallas DS18B20 для контроля заданных параметров доступна в 3 формах:

  • ТО-92;
  • SO (150 mm);
  • µSOP.

Расшифруем, где какой вывод микросхемы, и как правильно ее подключить.

Основные особенности и характеристики датчика температуры DS18B20:

  • низкий уровень U питания от линии (3–5,5 В);
  • высокоэффективная работа с помощью протокола 1-Wire;
  • уникальный идентификационный 64-битный код, записываемый в независимую ROM-память устройства для работы большего количества устройств с помощью одной линии связи, что позволяет получать точное положение датчика, температурный режим которого находится выше или ниже запрограммированного уровня;
  • широкий диапазон температурных измерений: -55°–+125°С с точностью 0,5°С в диапазоне -10°–+85°С;
  • встроенный АЦП позволяет запрограммировать DS18B20 в диапазоне 9–12 разрядов, что позволяет снизить время измерений до 750 мс;
  • удобное подключение микросхемы DS18B20 Raspberry Pi;
  • для программирования термодатчика достаточно его подключить к любому устройству, работающему под управлением архитектур Arduino, ARM, PIC или AVR.

Как работают современные датчики температуры

Блок-схема датчика температуры типа DS18B20 выглядит следующим образом:

Исходя из вышеприведенной структуры, рассматриваемый датчик состоит из:

  • регистра конфигурации, программируемого пользователем (9–12 разрядов);
  • датчика температуры;
  • верхнего Th и нижнего Tl порога срабатывания сигнала тревоги;
  • 64-битной памяти типа ROM и блока обработки протокола 1-Wire;
  • внутреннего источника питания, способного работать как от внешнего источника, так и от «паразитных» импульсов.

Принцип работы

Основная функция микросхемы DS18B20 — трансформация показаний встроенного датчика температуры в цифровой код. Это преобразование зависит от разрешения преобразования, установленного пользователем, которое варьируется от 9 до 12 бит (0,5°–0,625°С). Если настройки не производились, то установка регистра конфигурации соответствует 12 битам.

В начальном состоянии DS18B20 находится в состоянии покоя или иными словами в низком энергетическом уровне. Для начала измерений микроконтроллер подает сигнал [0х44], после чего полученные данные сохраняются в регистр, а сам датчик переходит в режим «покоя».

При работе цифрового датчика температуры DS18B20 от независимого источника питания микроконтроллер способен контролировать процесс выполнения команды [0х44], которая осуществляет измерение температуры. Таким образом, датчик температуры DS18B20 сформирует логический «0» во время трансформации показаний температурного режима и логическую «1» в случае окончания процесса преобразования.

Если питание микросхемы осуществляется при помощи «паразитного метода», то контроль логических «0» и «1» невозможен, поскольку на шине будет постоянно дежурить высокий уровень напряжения питания.

https://www.youtube.com/watch?v=ks4_XXK1B8w

После снятия и обработки сигнала с датчика температуры в микросхеме DS18B20 полученные данные в градусах Цельсия сохраняются в виде 16-битного числа с признаком (S), который отвечает за знак «+» или «-» температуры. Структура регистра температуры будет выглядеть так, как показано ниже.

Если показания температуры выше «0», то показатель S=0, если же значение температуры отрицательное, то S=1. Ниже представлена таблица соответствия данных и температуры.

Как формируются и передаются тревожные сигналы Th и Tl

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

Если полученные данные, 11–4 биты регистра, превышают Th или же ниже параметра Tl, то формируется сигнал аварии на микросхеме. Но на этом измерения не прекращаются, и в случае снижения Th ниже или Tl выше заданного диапазона условие «Авария» сбрасывается.

Если же необходимо самостоятельно выявить один из датчиков, который выдает сигнал «Тревога», то микроконтроллер с помощью команды ECh выполнит тестирование каждого датчика. В случае изменения параметров Th и Tl, выше или ниже занесенных в регистр значений, выдаст код устройства с нарушениями температурного режима.

Как выполнить правильное питание DS18B20

Микросхема DS18B20 позволяет осуществить 2 типа подключения:

  • паразитный режим;
  • подключение к внешнему источнику.

Рассмотрим более детально каждый из них.

Паразитный режим

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

При высоком U на шине микросхемы DS18B20 работает и заряжает Cpp при помощи вывода DQ. Обязательное условие для работы устройства в подобном режиме — заземление Vdd.

При смене уровня сигнала на логический «0» питание схемы осуществляется от ранее заряженного конденсатора.

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

Однако при выполнении микросхемой частых преобразований и взаимодействий с памятью потребляемый ток может превысить 1,5 мА. Это приведет к просадке напряжения на шине ниже минимально допустимого уровня.

 Для решения этой задачи необходимо использовать MOSFET транзистор. Он работает, когда выполняется копирование данных или же преобразование температуры.

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

Недостатки паразитного подключения

В большинстве случаев рационально применять данный метод. Однако если измеряемая температура выше 100°С, то возникает большой ток утечки, и заряда конденсатора Cpp не хватает для полноценного функционирования микросхемы. В таких случаях лучше применять питание микросхемы от внешнего источника.

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

Основное достоинство прямого подключения — отсутствие MOSFET транзистора. Питание микросхемы осуществляется от внешнего источника с помощью резистора номиналом 4,7 кОм. Во время работы по данной схеме основная шина преобразования может быть использована в других целях, потому что она остается свободной.

Контроль чтения DS18B20

Для контроля процесса чтения данных 64-битного ROM-кода девятый байт — это CRC или байты циклического кода SRAM. Генератор CRC выглядит следующим образом:

Данный код находится в старшем байте памяти ROM и вычисляется для предыдущих 56 битов. Основная задача девятого байта (CRC) — контроль чтения данных из микросхемы. Для этого микропроцессор производит вычисление полученного циклического кода и выполняет его сравнение с заранее принятым кодом. В результате сравнения микроконтроллер получает данные о корректности полученных данных.

Для проверки полученных данных служит полином циклического кода следующей структуры:

C R C = X8 + X5 + X4 + 1

Кодировка датчика DS18B20

Для контроля уровня температур в различных точках применяется большое количество датчиков, каждый из которых закодирован 64-битным кодом в ROM-памяти. В первые 8 бит записан код семейства (28h), во вторые 48 бит — серийный номер датчика и в последние 8 бит запрограммирован циклический код (CRC) для всех предыдущих битов.

Регистр конфигураций

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

Для установки разрешения преобразования необходимо сменить параметры R0 и R1, которые в первоначальном состоянии соответствуют 11. В таблице приведено соответствие значений данных параметров, разрешения и время преобразования.

Работа с интерфейсом 1-Wire

Система для измерения перепада температурного режима на основе датчиков DS18B20 работает при помощи протокола 1-Wire, который в свою очередь состоит из ведущего (главного или «Мастер») и ведомого устройства (СЛЕЙВ).

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

 Все данные и сигналы в подобной системе передаются с младшим битом вначале.

Как выполнена память цифрового датчика данного типа

Для полноценной работы DS18B20 состоит из 2 типов памяти: EEPROM и SRAM. Первый тип памяти — энергонезависимый, а второй — оперативный. Карта памяти выглядит следующим образом:

В EEPROM-памяти хранятся данные граничных порогов температур, а также регистр конфигураций.

А в карте памяти SRAM первые 2 байта (0 и 1) отвечают за измеренную температуру, вторые 2 байта предназначены только для чтения и отвечают за значения граничных температур из памяти EEPROM, четвертый байт содержит в себе параметры конфигурации. А зарезервированные байты с пятого по седьмой всегда выдают логическую «1» при чтении и не могут быть записаны. Для корректной работы памяти есть также восьмой байт или генератор циклического кода, отвечающий за первые 8 байт.

Чтобы выполнить запись в байты 2–4, потребуется выполнить команду [4Eh] ЗАПИСЬ ПАМЯТИ. Для получения доступа к записанным данным достаточно выполнить команду [BEh] ЧТЕНИЕ ПАМЯТИ. А если необходимо выполнить запись параметров TH, TL или же регистра конфигурации, тогда следует выполнить команду [48h] КОПИРОВАНИЕ ПАМЯТИ.

Что понадобится для работы с микросхемой DS18B20

Для работы с микросхемой DS18B20 потребуется:

  • программное обеспечение Arduino IDE;
  • библиотека для работы с протоколом 1-Wire OneWire library;
  • скетч.

Вышеуказанные приложения позволят произвести прошивку микросхемы. Однако, чтобы это осуществить, потребуется следующее оборудование:

  • контроллер Arduino;
  • USB-кабель, подключающий контроллер к персональному компьютеру;
  • монтажная плата для установки микросхемы и 3 коннектора.

Подключение микросхемы к Arduino

Для подключения датчика, как показано на схеме ниже, контакт 1 (GND) подключается к общему «-» платы, контакт 2 (Vdd) подключается к источнику питания +5 В через подтягивающий резистор номиналом 4,7 кОм, а последний контакт 3 (DATA) подключается к одному из пинов на микроконтроллере Arduino (на схеме использован второй пин).

Для данного случая строка 10 должна иметь следующий вид: OneWire ds(2).

Настройка кода и работа с библиотеками

После окончания монтажных работ можно приступать к программированию устройства. Для этого с помощью приложения Arduino IDE требуется смонтировать библиотеку OneWire library.

Для этого в меню приложения необходимо выбрать «Add Library», которое расположено в меню «Sketch» или для русскоязычного варианта «Скетч» — «Подключить библиотеку» — «OneWire».

Далее в открывшейся библиотеке следует найти пример программирования «DS18x20_Temperature». Для этого необходимо в меню «Файл» выбрать подменю «Примеры», далее раздел «OneWire» и пункт «DS18x20_Temperature».

В примере из библиотеки OneWire в строке 10 изначально запрограммирован 10 pin микроконтроллера, для рассматриваемого случая его требуется заменить на 2. В итоге 10 строка должна выглядеть следующим образом:

После корректно выполненных операций, компиляции и загрузки программы в окне монитора порта «Инструменты» — «Монитор порта» появится примерно следующее:

Заключение

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

Видео по теме

Источник: https://VashUmnyiDom.ru/obshhaya-avtomatika/datchik-temperatury-ds18b20.html

Как подключить DALLAS 18B20 датчик к Ардуино

Опубликовано 03.07.2013 11:37:00

В ассортименте нашего магазина появился датчик температуры DALLAS 18B20 во влагозащищенном корпусе с широким диапазоном измеряемых температур от -55 до +125°С. Данные о влагозащищенности и максимальной температуре в +125 градусов сразу натолкнули на мысли об экстремальном тестировании в кипящей воде. Этим мы и займемся.

Компоненты для повторения (купить в Китае):

Arduino UNO, либо Arduino Nano, либо Arduino Mega

Dallas 18B20 во влагозащищенном копрусе

Dallas 18B20

Соединительные провода (перемычки)

Резисторы

Данный датчик работает по шине 1-Wire.

Для устройств, работающих по шине 1-Wire в среде Arduino IDE используется библиотека OneWire.
Последнюю версию библиотеки, а также полную документацию можно найти на странице разработчиков.

Каждое такое устройство содержит уникальный 64-битный 'ROM' код, состоящий из 8 битов, определяющих код серии, 48 бит уникального номера и 8 бит помехоустойчивого CRC кода.

Информация об измеренной температуре хранится в оперативной памяти датчика, которая состоит из 9 байт.

1 и 2 байты хранят информацию о температуре.

3 и 4 байты хранят соответственно верхний и нижний пределы температуры.

5 и 6 байты зарезервированы.

7 и 8 байты используются для сверхточного измерения температуры.

9 байт хранит помехоустойчивый CRC код предыдущих 8 байт.

Основные команды, используемые при работе с библиотекой:

search(addressArray)

Выполняет поиск следующего 1-Wire устройства, если устройство найдено, то в 8 байтный массив addressArray записывается его ROM код, иначе возвращает false.

reset_search()

Выполняет новый поиск с первого устройства.

reset()

Выполняет сброс шины, необходимо перед связью с датчиком.

select(addressArray)

Выполняет выбор устройства после сброса, передается ROM Код устройства.

write(byte)

Передает информационный байт на устройство

write(byte, 1)

Передает информационный байт на устройство, работающее в паразитном режиме питания

read()

Считывает информационный байт с устройства

crc8(dataArray, length)

Вычисляет CRC код байтов из массива dataArray, длиной length

При помощи команды write, мы можем передавать управляющие команды на датчик в виде байтов, рассмотрим основные из них:

 0x44 – провести измерение температуры и записать данные в оперативную память

 0x4E – записать 3 байта в 3й, 4й и 5й байты оперативной памяти

 0xBE – считать последовательно 9 байт оперативной памяти

 0x48 – скопировать 3й и 4й байты оперативной памяти в EEPROM

 0xB8 – скопировать данные из EEPROM В 3й и 4й байты оперативной памяти

 0xB4 – вернет тип питания (0 – паразитное, 1 – внешнее)

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

Из датчика выходят три провода:

Красный: “+” питания.

Черный: “-” питания

Белый: Вывод выходного сигнала

Подключение датчика: 

Красный: на + 5 Вольт Arduino.

Черный на любой из GND пинов­­­ Arduino.

Белый на любый цифровой вход Arduino (в примере D10).

Для работы датчика необходимо соединить сигнальный провод с проводом питания резистором номиналом 4.7 кОм.

Для начала рассмотрим самый полезный пример для работы с датчиком – вывод показаний температуры в монитор порта.

#include OneWire ds(10); // подключен к 10 пину (резистор на 4.7к обязателен) void setup(void) { Serial.begin(9600);
} void loop(void) { byte i; byte present = 0; byte type_s; byte data[12]; byte addr[8]; 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[7]) { Serial.println("CRC is not valid!"); return; } Serial.println(); // the first ROM byte indicates which chip switch (addr[0]) { 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("Device is not a DS18x20 family device."); return; } ds.reset(); ds.select(addr); ds.write(0x44, 1); // начало коммуникации delay(1000); 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(); // Преобразуем получненный данные в температуру // Используем int16_t тип, т.к. он равен 16 битам // даже при компиляции под 32-х битный процессор int16_t raw = (data[1]

Источник: http://zelectro.cc/dallas-18b20

1-Wire. Работа с DS18B20. Часть 1

     Все (и в том числе я) называют DS18B20 цифровым датчиком температуры. Однако это не просто датчик, это программируемый цифровой термометр.

Он измеряет температуру в диапазоне от –55 до +125 градусов Цельсия, имеет программируемое температурное разрешение от 9 до 12 бит и позволяет задавать верхний и нижний температурные пороги, в случае превышения которых,  устанавливается флаг аварии.

 

   Каждый термометр DS18B20 имеет уникальный 64 битный серийный номер, который используется для его адресации на 1-Wire шине. Это позволяет объединять на одной шине несколько независимо работающих термометров и осуществлять между ними и микроконтроллером обмен данными по 1-Wire протоколу. 

   Также особенностью данного термометра является то, что его можно запитывать не только от источника питания, но и от сигнального провода. Это так называемый режим паразитного питания. В этом режиме для подключения DS18B20 требуется всего два провода — сигнальный и возвратный (земляной, GND).

      Схема подключения нескольких датчиков DS18B20 с внешним питанием.    1-Wire шина  должна быть обязательно подтянута к плюсу питания через резистор номиналом 4,7 Ком. Напряжение источника питания от 3 до 5 Вольт. 

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

   Вывод Vdd соединяется с GND, а 1-Wire шина дополнительно подключается к источнику питания через полевой транзистор. 

   Когда датчик DS18B20 выполняет преобразование температуры или копирует данные из ОЗУ в EEPROM память, он потребляет ток до 1,5 мА. Этот ток может вызывать недопустимое снижение напряжения на 1-Wire шине. Чтобы этого не происходило, 1-Wire шину на время выполнения этих операций подключают к источнику питания. Для этого и нужен полевой транзистор.   

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

Это низкоскоростной двунаправленный полудуплексный последовательный протокол обмена данными использующий всего один сигнальный провод.

Естественно требуется еще и возвратный (земляной) провод, но об этом маркетологи обычно умалчивают. 1-Wire протокол был разработан фирмой Dallas Semiconductor в конце 90-х годов.    

   Имеется несколько типов сигналов, определенных 1-Wire протоколом – импульс сброса, импульс присутствия, запись 0, запись 1, чтение 0 и чтение 1. Все эти сигналы, за исключением импульса присутствия, формируются на шине главным устройством — MASTERом . В нашем случае это  микроконтроллер AVR. 

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

  Физически это реализуется так. 

  Операция записи бита: Вывод микроконтроллера устанавливается в режим выхода и на нем устанавливается логический ноль. Выдерживается пауза, длительность которой зависит от значения передаваемого бита (0 или 1), затем вывод переводится в режим входа в состоянии Hi-z и снова выдерживается пауза. 

  Операция чтения бита: Вывод микроконтроллера устанавливается в режим выхода и на нем устанавливается логический ноль. Выдерживается определенная пауза, вывод переводится в режим входа в состоянии Hi-z, выдерживается пауза, а затем микроконтроллер считывает потенциал вывода. 

   Все сеансы связи микроконтроллера с датчиком DS18B20 начинаются с сигнала сброса.  Микроконтроллер на 480 мкс «проваливает» 1-Wire шину в ноль, а затем «отпускает» ее. Если к шине подключен термометр DS18B20, то он  обнаруживает положительный перепад и после паузы в 15-60 мкс отвечает микроконтроллеру импульсом присутствия — «проваливает» шину в ноль на время от 60 до 240 мкс. 

  

   Обмен данными по 1-Wire шине происходит последовательно, младшим битом вперед. Передача или прием одного бита данных выполняются в течении фиксированного промежутка времени, так называемого тайм слота (time slot). Различают тайм слоты записи и тайм слоты чтения. Длительность всех тайм слотов должна быть > 60 мкс, а пауза между тайм слотами  > 1 мкс.   

   Для передачи нуля микроконтроллер «проваливает» 1-Wire шину на время от 60 до 120 мкс. Затем «отпускает» ее и перед записью следующего бита выдерживает паузу >1  мкс.

   Для передачи единицы микроконтроллер «проваливает» 1-Wire шину на время от 1 до 15 мкс,  «отпускает» ее и выдерживает паузу. Пауза должна быть такой, чтобы длительность тайм слота была > 60+1 мкс. 

   

   DS18B20 является подчиненным устройством и может передавать данные, только когда микроконтроллер формирует на 1-Wire шине тайм слоты чтения.

Для формирования тайм слота чтения микроконтроллер «проваливает» 1-Wire шину на время от 1 до 15 мкс, а затем «отпускает» ее, передавая  управление состоянием 1-Wire шины датчику DS18B20.

Если DS18B20 передает ноль, он удерживает шину в «проваленном» состоянии (в состоянии логического нуля) до конца тайм слота. Если он передает 1, он оставляет шину в «подтянутом» состоянии. 

   Микроконтроллер может считывать данные датчика DS18B20 через 15 мкс после начала тайм слота чтения. 

Источник: http://chipenable.ru/index.php/item/80

Цифровой датчик температуры DS18B20

Цифровой датчик температуры DS18B20, работает по протоколу 1-Wire. Используется при разработке домашней метеостанции на Arduino.

Описание датчика DS18B20

DS18B20 — цифровой термометр с программируемым разрешением от 9 до 12 битов, которое может сохраняться в памяти EEPROM прибора. DS18B20 обменивается данными по шине 1-Wire и при этом может быть как единственным устройством на линии, так и работать в группе. Все процессы на шине управляются центральным микропроцессором.

Диапазон измерений датчика: от –55 до +125 °C и точностью 0,5 °C в диапазоне от –10 до +85 °C. В дополнение DS18B20 может питаться напряжением линии данных  при отсутствии внешнего источника напряжения.

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

Первые 8 битов — код серии (для DS18B20 — 28h), затем 48 битов уникального номера, и в конце 8 битов CRC-кода.

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

Характеристики датчика DS18S20:

  • интерфейс 1-Wire;
  • измеряемая температура от –55 до +125 °C;
  • точность 0,5 °C в диапазоне от –10 до +85 °С;
  • температура считывается 9-ю битами данных;
  • время на конвертацию температуры — 750 ms (максимальное).
 Датчик DS18B20

Данные о температуре хранятся в оперативной памяти датчика. Память состоит из оперативной ROM и энергонезависимой EEPROM:

 первые два байта — содержат данные об измеренной температуре;

 третий и четвертый байты хранят верхний (TH) и нижний (TL) пределы температуры;

 пятый и шестой — не используются;

 седьмой и восьмой — байты-счетчики. Они могут использоваться для более точного измерения температуры;

 девятый байт хранит CRC-код предыдущих восьми.

Карта памяти DS18B20

Кроме общих команд для всех типов устройств 1-Wire, представленных в таблице, датчик может выполнять следующие команды:

 Alarm Search [ECh] — операция этой команды идентична операции поиска адресов [F0h], за исключением того, что в данном случае ответят только те датчики, у которых при последнем измерении температура вышла за установленные пре- делы (выше TH или ниже TL);

 Convert T [44h] — конвертировать температуру. Датчик произведет измерение и запись данных о текущей температуре. Если ведущее устройство будет за этой командой слать тайм-слоты чтения, то пока конвертация не закончена, DS18S20 будет выдавать в линию “0”, а после завершения конвертации “1”.

 Write Scratchpad [4Eh] — запись в память. Эта команда позволяет записать 3 байта в память датчика. Первый байт запишется в TH, второй — в TL, а третий байт запишется в пятый байт памяти — это байт конфигурации;

 Read Scratchpad [BEh] — чтение памяти. Команда позволяет нам считать память датчика. В ответ на эту команду датчик вернет 9 байтов своей памяти, начиная с 0-го байта TEMPERATURE LSB и заканчивая восьмым — CRC;

 Copy Scratchpad [48h] — копировать память. Датчик скопирует содержимое ОЗУ — TH и TL в EEPROM.

Последовательность команд для получения данных от датчика о температуре:

Произвести RESET и поиск устройств на линии 1-Wire.

Выдать команду 0x44, чтобы запустить конвертацию температуры датчиком.

Подождать не менее 750 ms.

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

Выдать команду 0xBE, чтобы считать ОЗУ датчика (данные о температуре будут в первых двух байтах).

Датчик может запитываться двумя способами: внешним питанием (3 провода) или паразитным (питание от шины, 2 провода).

Использование библиотеки OneWire

Для работы с датчиками с интерфейсом 1-Wire можно использовать библиотеку OneWire. 

Cкетч получения данных с датчика температуры DS18B20 и вывода данных в последовательный порт с помощью библиотеки OneWire представлен в примере

 Скачать библиотеку OneWire.h:  OneWire.h.zip

 #include<\p>

OneWire ds(10); // линия 1-Wire будет на pin 10

void setup(void)

{

Serial.begin(9600);

}

void loop(void)

{

byte i;

byte present = 0; byte data[12]; byte addr[8];

if ( !ds.search(addr)) { Serial.print(“No more addresses.
“); ds.reset_search();

return;

}

if ( OneWire::crc8( addr, 7) != addr[7]) { Serial.print(“CRC is not valid!
“); return;

}

if ( addr[0] != 0x28) {

Serial.print(“Device is not a DS18B20 family device.
“); return;

}

ds.reset(); ds.select(addr);

ds.write(0x44,1); // запускаем конвертацию delay(750); // ждем 750ms

present = ds.reset(); ds.select(addr);

ds.write(0xBE); // считываем ОЗУ датчика

for ( i = 0; i < 9; i++) { // обрабатываем 9 байт data[i] = ds.read();

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

}

// высчитываем температуру 🙂

int HighByte, LowByte, TReading, Tc_100; LowByte = data[0];

Serial.print(“LB= “);Serial.print(LowByte,HEX); HighByte = data[1];

Serial.print(” HB= “);Serial.print(HighByte,HEX); TReading = (HighByte<\p>

Источник: http://www.progdron.com/ru/arduino-shield/arduino-shield/343-tsifrovoj-datchik-temperatury-ds18b20

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}