Подключение датчика температуры ds18b20 к микроконтроллеру

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

Главными его преимуществами являются:

  • Наличие всего одного контакта для получения полезного сигнала. Это дает возможность подключения огромного количества идентичных сенсоров DS18B20 к одному Arduino Processing LCD.
  • Цифровая система функционирования.
  • Возможность подключения огромного количества идентичных сенсоров к одному пину Arduino Processing LCD.

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

Все датчики типа DS18B20 имеют несколько форм-факторов, которые могут существенно облегчить работу с ними. Право выбора самого форм-фактора всегда, само собой, остается за клиентом. Сегодня на рынке преобладают 3 варианта этой продукции, а именно: 8Pin SO (150 mils), 8Pin µSOP и 3Pin TO92.

Информация, которую мы почерпнули, свидетельствует о том, что китайские производители также предлагают приобрести датчик 3Pin TO92, снабженный специальной влагозащитной оболочкой. Это даст вам возможность погружать аппарат в жидкость, использовать во время плохой погоды и в других случаях.

У всех сенсоров всегда имеется 3 выходных контакта: черного, красного и белого цветов. Они соответствуют значениям GND, Vdd и Data соответственно.

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

Датчик способен функционировать при напряжении в сети от 3 до 5,5 Вольт, а также фиксировать изменения температуры, если она находится в диапазоне от -55 до плюс 125 по Цельсию.

Погрешность, которую может выдавать термостат при измерении температуры, составляет 0,5 градуса по Цельсию.

Трудно представить себе ситуацию, в которой это может потребоваться. Но если установить, например, один датчик в холодильнике, а другой — в морозилке, это будет весьма полезно. Опять же в таком случае у вас останется просто огромное количество свободных пинов для «Ардуино».

Что нужно, чтобы настроить работу датчика DS18B20 для Arduino Processing LCD

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

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

Программу «Ардуино» можно скачать с ее официального сайта — там есть ее последняя версия в открытом доступе.

Программа Arduino IDE

Из оборудования вам в обязательном порядке потребуются:

  • Nano-датчик для измерения температурных показателей DS 18B20 в количестве минимум одного экземпляра.
  • Контроллер «Ардуино».
  • Термостат.
  • Коннекторы в количестве 3 штук.
  • Плата для монтажных работ.
  • Кабель, который будет обеспечивать подключение «Ардуино» к вашему компьютеру посредством USB-соединения.

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

Nano-датчик температуры DS 18B20

Подключение датчика DS 18B20 к Arduino Processing LCD

Чтобы правильно произвести подключение датчика к системе «Ардуино», необходимо действовать в соответствии со следующим алгоритмом:

  • Черный контакт температурного датчика нужно подключить к GND-системе «Ардуино».
  • Красный контакт температурного датчика нужно подключить к +5V системы «Ардуино».
  • Красный контакт температурного датчика может быть подключен к любому свободному цифровому пину в системе «Ардуино».
  • Подключить к внешней обвязке системы специальный резистор на 4,7 килоома.

Полная схема подключения датчика температуры DS 18B20 к системе Arduino Processing LCD показана на изображении ниже.

Схема подключения датчиков температуры DS 18B20 к системе Arduino

Установка базы данных OneWireLibrary

После успешной закачки архива с базой данных на свой компьютер, ее необходимо импортировать в систему «Ардуино». В панели управления программой необходимо выбрать следующие пункты Sketch – «Импортировать базу данных» — «Добавить базу данных».

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

Загрузка скетча в систему

Как правило, нужный скетч всегда есть в базе данных OneWireLibrary в категории «примеры». Вам нужно перейти в панели управления программой по такому алгоритму: “Файл” — “Примеры” — OneWire и выбрать пример, который будет содержать название подключаемого датчика температуры.

Какой тип питания выбрать

Все датчики температуры типа DS 18B20 для Arduino Processing LCD могут работать в обычном или так называемом «паразитном» режиме.

При этом если обычный режим подключения предусматривает нормальное функционирование всех 3 коннекторов, то «паразитический» — только 2.

Что бы получать правильную и точную информацию со всех датчиков, нужно выбрать правильный режим питания в скетче:

  • чтобы воспользоваться «паразитным» режимом, необходимо ввести dswrite (0x44,1) в 65-й строке;
  • обычным режимом — ввести dswrite (0x44) в 65-й строке.

Подключение термодатчика DS18b20 к программе Arduino

Как подключить несколько датчиков температуры DS 18B20 одновременно

Подключение нескольких датчиков температуры типа DS 18B20 к Arduino Processing LCD возможно. Это обеспечивается базой данных OneWirelibrary, способной считывать всю информацию со всех подключенных устройств одновременно.

Если же вы собрались подсоединять больше десятка датчиков DS 18B20, могут быть проблемы с их точностью. В таком случае можно установить резистор (сопротивление — примерно 100 Ом) между белым контактом на аппарате «Ардуино» и белым контактом на каждом датчике.

Originally posted 2016-05-20 13:27:11.

Источник: https://proumnyjdom.ru/kontrollery/ds18b20-podklyuchenie-k-arduino.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» невозможен, поскольку на шине будет постоянно дежурить высокий уровень напряжения питания.

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

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

Если показания температуры выше «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

Датчик температуры DS18B20. Описание, характеристики, подключение, распиновка, datasheet

DS18B20 – цифровой датчик температуры фирмы Dallas. Отправляет данные о температуре, используя только один цифровой вывод и специальный протокол, называемый 1-Wire. Вы можете подключить несколько датчиков к одному контакту. Датчик измеряет температуру в градусах Цельсия.

Технические характеристики DS18B20

  • Датчик можно питать напряжением от 3 до 5,5В
  • Датчик может измерять температуру от -55 до 125 °C
  • Датчик имеет цифровое разрешение от 9 до 12 бит
  • Точность измерения +/- 0,5 °C в диапазоне от -10 до 85 °C
  • Точность измерения: + /- 2 °C для диапазона от -55 до 125 °C
  • Дрейф измерения +/- 0,2 °C

Распиновка DS18B20

Схема подключения DS18B20

Что такое разрешение?

В технических характеристиках сообщается, что датчик DS18B20 может измерять температуру с различным разрешением. Разрешение – это как у линейки: миллиметры между сантиметрами. Так же и c разрешением у DS18B20 – это шаг между последовательными ступенями градусов Цельсия.

Разрешение выбирается с помощью количества бит. Диапазон выбора от 9 до 12 бит. Выбор разрешения влечет за собой определенные последствия. Чем выше разрешение, тем дольше придется ждать результат измерений.

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

Для 9 битного разрешения есть 2 шага между последовательными уровнями:

То есть, вы можете прочитать температуру с разрешением 0,5 °C. Для 9 битного разрешения время измерения составляет 93,75 мс. То есть, вы можете выполнять 10,6 измерений в секунду.

Для 10 битного разрешения есть 4 шага между последовательными уровнями:

  • 0,0 °C
  • 0,25 °C
  • 0,5 °C
  • 0,75 °C

В этом случае мы считываем температуру с разрешением 0,25 °C. Время измерения для 10 битного разрешения составляет 187,5 мс, что позволяет выполнить 5,3 измерений в секунду.

Для 11 битного разрешения есть 8 шагов между последовательными уровнями:

  • 0,0 °C
  • 0,125 °C
  • 0,25 °C
  • 0,375 °C
  • 0,5 °C
  • 0,625 °C
  • 0,75 °C
  • 0,875 °C

То есть разрешение составляет 0,125 °C. Время измерения для 11 битного разрешения составляет 375 мс. Это позволяет выполнить 2,6 измерения в секунду.

Для 12 битного разрешения есть 16 шагов между последовательными уровнями:

  • 0,0 °C
  • 0,0625 °C
  • 0,125 °C
  • 0,1875 °C
  • 0,25 °C
  • 0,3125 °C
  • 0,375 °C
  • 0,4375 °C
  • 0,5 °C
  • 0,5625 °C
  • 0,625 °C
  • 0,6875 °C
  • 0,75 °C
  • 0,8125 °C
  • 0,875 °C
  • 0,9375 °C

Следовательно, разрешение составляет 0,0625 °C. Время измерения для 12 битного разрешения в районе 750 мс. То есть вы можете сделать 1,3 измерений в секунду.

Что такое точность измерения?

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

В технических характеристиках сказано, что в диапазоне измерения от -10 до 85 °C датчик DS18B20 имеет точность на уровне +/- 0,5 °C. Это значит, что, когда в комнате у нас температура 22,5 °C, то датчик может вернуть нам результат измерения от 22 до 23 °C. То есть, может показать на 0,5 °C больше или меньше. Все это зависит от индивидуальной характеристики датчика.

В диапазоне от -55 до 125 °C погрешность измерения может возрасти до +/- 2 °C. То есть, когда вы измеряете что-то с температурой 100 °C, то датчик может показать температуру от 98 до 102 °C.

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

Что такое дрейф измерения?

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

Дрейф датчика температуры DS18B20 +/- 0.2 °C. Например, когда в комнате постоянная температура составляет 24 °C, датчик может выдавать результат в диапазоне от 23,8 °C до 24,2 °C.

Скачать datasheet DS18B20 (379,0 Kb, скачано: 446)

Источник: http://www.joyta.ru/10615-datchik-temperatury-ds18b20-opisanie-xarakteristiki-podklyuchenie-raspinovka-datasheet/

Работа с датчиком температуры DS18B20

avrki@avrki.ru

Дата: 15 Мая 2014. Автор: Алексей

В библиотеке AXLIB есть набор функций для работы с данным датчиком. Весна в полном разгаре. Скоро лето, жара. А жара это сколько? Надо померить. А как? Вот и решил я поработать с датчиком температуры DS18B20. Благо он дешевый и его можно купить где угодно. И еще под этот датчик в CVAVR есть библиотека. Но….

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

Жуть!!! Короче пообщавшись с умными людьми на форуме, я залез внутрь библиотеки и нарыл тело функции чтения температуры и о чудо! Там за каким-то лешим после команды на старт преобразования стоит пауза на 550 мс. Зачем? Для тех кто все же останется преданным CVAVR, эту паузу можно стереть. Заработало немного быстрее.

Еще остался вопрос, а где лежат функции для работы с шиной 1-wire? Только хедер и все. Просто возник еще вопрос. Если при динамической индикации использовать таймер и в прерывании выводить цифры, то фигня выходит. Терзают меня смутные сомнения, что при обработке функций шины 1-wire запрещаются прерывания. Короче мне эти непонятки надоели и я переехал на AVRStudio 6.

1 и ни капли не сожалею. Ну и еще получил пинок для изучения принципа работы шины 1-wire. Перед тем как писать код, давайте окунемся немного в теорию. Сразу оговорюсь, я рассчитываю на то что статьи такого типа читают люди которые чуть ли не впервые взяли в руки паяльник. И если начать трактат о временных слотах и тому подобное, то многие прокиснут и скажут, а ну его на фиг.

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

  • 1. Подать команду сброса.
  • 2. Получить подтверждение о наличии хотя бы одного датчика.
  • 3. Читать РОМ код (эта фигня с его идентификационным номером. Нужно для работы не с одним датчиком).
  • 4. Передать настройки
  • 5. Подать команду на начало преобразования температуры
  • 6. Получить данные
  • 7. Преобразовать в человеческий вид

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

У датчика есть три ноги, две для питания(возможна работа от паразитного питания, но о ней мы пока говорить не будем. Считаем что у нас есть полноценное питание и оно подведено к датчику). Третья нога как раз для передачи данных. Но тут есть свой нюанс. Просто дергать ногу верх и вниз нельзя.

Между этой ножкой и плюсом питания стоит резистор на 4,7К, который подтягивает ногу к плюсу питания. То есть если мы шину не трогаем(нет передачи) то на линии висит плюс питания. Также надо запомнить, что все начала передач инициируем мастер. Датчик всегда сидит и нюхает шину, а как только там что-то появилось, отвечает. Подаем команду сброса.

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

Если шина упала к нулю и так продержалась не менее 60 мкс, то значит на шине висит датчик и он нам ответил ” Я тут”. Если на шине после выжидания 15 мкс ноль не появился, значит на шине кроме мастера никого больше нет. Вот и вся команда.

Если на шине никого нет, то забиваем на все и занимаемся чем-нибудь другим, а вот если кто-то есть, а скорее всего наш датчик, то мы имеем полное право ему дать команду. Следующая команда по очереди должна быть чтение РОМ кода. Что такое РОМ код. Это группа из 8 байтов которая несет в себе некую информацию, а именно: Младший байт содержит код семейства.

В мануале написано что равен 0х28, но я почему-то получал 0х10. Следующие 6 байтов это идентификационный номер датчика. Как я понял он уникален или фирма выпустила больше 281474976710655 датчиков. Я даже не знаю как это число произнести)). И последний байт это CRC контрольная сумма предыдущих байт. Получить ее можно подав команду 0х33. Но тут тоже не все так просто.

Команда 0х33 это запрос РОМ кода если датчик один, а чтоб выудить их из кучи датчиков, то нужно сказать 0хF0. Мудрено? Да… Но если вспомнить что мы хотим общаться с одним датчиком, то нам этот РОМ код ваще читать не надо. Но мануал требует обязательного чтения РОМ кода. Что делать? А вот что. Есть такая команда под названием “Гей хлопцы се кричим!”. То есть пишем 0хСС.

Это означает пропустить РОМ код и всем устройствам на шине принять команду. В научном мире это называется широковещательная передача. То есть не важно сколько там устройств на шине, следующая после 0хСС команда одресованна всем.
Замечательно, подготовили устройство к получению команды и оно напряглось. Что дальше.

А дальше нам нужно сказать ему “А нука друг измерий ка мне температурку. И шлем ему код 0х44. Тот получив приказ, тут же подрывается на работу. Вопрос. А как узнать когда датчик измерил температуру? А просто. Пока он меряет, то прижимает шину к нулю. Отсюда мы нюхаем шину и как только получили единицей по носу, о! Измерил.
Получение температуры. Датчик туп как пробка.

Получив приказ измерить температуру он это сделал и положил данные в память. А дальше выпучив глаза ждет очередной команды. Мы в ту же очередь, получив единицей по носу, говорим 0хВЕ. Датчик получив эту команду понимает что надо передать данные из памяти. А какие? Память датчика состоит из 9 байт. Первые два это температура.

Потом два байта тревог по превышению верхнего или нижнего предела температуры.(некий термостат). Следующий байт это конфигурационный регистр. Ну мол как цифровать температуру. Далее три байта в резерве. И наконец последний CRC. Помним что это). Так вот при подачи команды 0хВЕ датчик не будет думать о том что надо передать, а просто вывалит все девять байт в шину.

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

Ну для начала надо понять что температура бывает как положительной, так и отрицательной. А с учетом того что у нас два байта, то и выделять под переменную нам надо типа int. Далее вроде все просто. Младший байт в младший инта, а старший в старший. Да не все так просто. Я долго вкуривал в это безумие и так и не понял)) Но всеми известный научный метод тыка пока не кто не отменял.

Короче берем старший байт и кладем его как есть в старший байт инта, а младший сначала умножаем на 5, а потом кладем в младший байт того же инта. Все, вот наша температура правда умноженная на 10. То есть если температура 23,5 гр. то в инте будет 235. А если температура отрицательная? Во подстава.

Глядя в таблицу температур датчика я понял что ее передают в, как по научному вроде, обратной нотации что ли. Короче, после получения данных от датчика, нужно проверить старший бит у старшего байта на 0. Если ноль, значит плюс, а если единица, значит зима) А дальше склеиваем как плюсовую, а потом инвертируем каждый бит. То есть те что были нулями должны стать единицами, а единицы нулями. После прибавляем единицу и получаем температуру так сказать по модулю. Выводим как плюсовую, только не забываем поставить знак минус.
Ну вроде и все. Вот фотки плюсовой и минусовой температуры. Правда минус не совсем низкий так как сейчас за окном май месяц, а от куска мяса из морозилки много не выдавишь но все же работу программы надо показать)
Программный код я здесь выкладывать не буду, так как это лишнее. Я выкладываю архив в котором лежат файлы основной программы и подключаемого хедера с функциями передачи команд. Каждая строка подробно закоментированна. Если все же возникнут вопросы, то я на связи. Удачи! В библиотеке AXLIB есть набор функций для работы с данным датчиком.

Архив с файлами.



Алексей, вопрос – я могу с помощью команды читать ROM, определить наличие датчика? Скажем, выдать 0x33, и прочитать в первом байте код семейства DS18B20. Если он не равен 0x28 – значит, датчика нет. Или так не не годится?

А чем не устраивает команда сброса? Или на шине еще что-то висит?

Но, ведь по команде сброса можно только определить – есть ли любые устройства 1- wire или нет. А хотелось бы именно удостовериться в отсутствии термодатчика DS18B20.

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

Поэтому и возникла идея – дать команду 0x33, потом принять первый байт из 8, и его проанализировать на наличие кода семейства. Типа, если там есть 0x28 –

Хорошо. Если есть два датчика НО НА РАЗНЫХ шинах, то какая разница как определить наличие датчика. Подали команду сброса и все. Датчик ответил, значит все в порядке. Не ответил, увы. Команды на обнаружение по семейству нужно подавать только тогда, когда на шине висит больше одного датчика. А если один, то зачем такие сложности. Или я что-то не понимаю в вашем вопросе.

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

Собственно, а почему нет. Если известен адрес датчика и он ответил на любую команду значит он априори жив и здоров.

Меня как раз интересовал способ, при котором неизвестен адрес датчика, сидящего на отдельной шине. Зачем полностью читать все 64 бита идентификации, вполне хватит и 8-ми бит, в которых есть код семейства. Например, 0x28 для DS18B20. Если принят любой другой код – значит, датчика нет, он не тот, или неисправен, что в конкретном случае почти одинаково.

Стоп, стоп, стоп. Это сработает при широковещательном запросе при условии только одного датчика на шине. С тем же успехом можно и команду сброса подать.

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

А если просто одному человеку в комнате крикните, “Эй, ты!”. Он один и ответит.

Правильно, я и написал – “…датчика, сидящего на отдельной шине…”. У меня как раз ситуация, когда каждый датчик термометра – сидит на отдельной шине. Именно поэтому и возник такой вопрос. И потом, стоит задача определения наличия именно DS18B20, мало ли что там народ еще может подключить. А так – датчик ответил кодом 0x28, значит все в порядке.

Алексей, еще поясните такую вещь, если не трудно, а то что-то в даташите про это нигде не сказано.

Я подал команду записать в датчик 0x33 (чтение ROM), затем должен сколько-то подождать, или могу сразу читать с датчика? Где-то в сети народ жаловался на то, что типа, пока не поставил между командами записи-чтения задержку около 1 миллисекунды – датчик не отзывался вовсе, или вывдавал всякую белиберду.

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

Если после команды на преобразования шина в нуле, значит не готов. Как шина к поднялась к единице, можно читать температуру.

С этой проблемой часто сталкиваются те кто выводит температуру на динамический индикатор.

Когда нужна температура, задержка обычно подразумевается. Потому что делать поллинг (опрос бита готовности), не всегда удобно. А вот когда пишется команда, не связанная с преобразованием температуры? Например, та же 0x33 – чтение ROM.

Ну я не знаю. Вообще задержка не нужна. Ради собственного удовлетворения то пару миллисекунд вляпать можно. Если это не дипломная работа, то я бы воспользовался импирикой и не парил себе мозг. 🙂

Есть желание немножко усложнить конструкцию? Я очень хочу поработать с вами вместе. Передо мной была поставлена интересная задача. Денежкой поделюсь. Жду ответа тут

А по конкретнее какая задача. Точнее ТЗ.

Нужно сделать два термометра МК1 и МК2. На мк1 навшано BT модуль HC-05, ds18b20,радио NRF24L01. На мк2 ds18b20,радио NRF24L01.

—————-мк1—————– мк 1 измеряет temp_mk1 пишем в РОН инициируем подключение по радио NRF, если есть подключение, кидаем ему общую уставку Y и просим передать temp_mk2 c MK2 (пишем в POH) -инициируем подключение по БТ,если есть отправляем temp_mk1 и temp_mk2 и просим получить уставку Y(получаем и копируем в РОН) – считаем ошибку температуры мк1, если отрицательная включаем реле. ————-Мк2—————- Измеряем температуру и пишем в РОН слушаем эфир NRF, если есть отправляем _температуру и просим уставку. Сравниваем, результат в ошибку. Если отрицательная, включаем реле. Это регулятор для фуры отца. Будет греть прицеп. Говорит, мол не обойтись. Платит мне 10К а я все нее могу с модулями и ассемблером разобраться. Нашел ваш терморегулятор. Разбираю ваш пример пока. Изложение мысли понравилось.

Такой регулятор…Как связаться с вами?

Отлаживаю на плате STK500 в связке с STK502. Примерную схему я набросал в ИГЛКАД Для связи могу предложить скайп. Мой логин : 819 готов отдать 7К

Честно, я ничего не понял. avrki@avrki.ru моя почта. Можно более подробно и сформулировано объяснить что нужно сделать. И при чем здесь РОН? Обязательно на ассемблере? Какой МК рулить всем этим будет? Нужна конкретика, ТЗ. Напишите поверхностный псевдо-код, что должно происходить в течении работы устройства. На какой шине висят радио модуль и ВТ модуль. Зачем вообще ВТ? Связь с телефоном?

Здравствуйте, а скажите насколько точно он меряет температуру. У меня он по ощущениям на 3-4 градуса завышает. Минусовую вроде точно выводит. Также хочу заметить, что нет смысла выводить десятые доли градуса при такой точности. Тогда температуру можно получать так temper = (temp_0>>4)+(temp_1

Источник: http://www.avrki.ru/articles/content/ds18b20/

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

Существует множество способов подключения распрастраненных датчиков температуры DS18B20 к компьютеру,например используя СОМ порт(которого уже в большинстве современных компьютеров нет).Но как подключить с наименьшими усилиями DS18B20 к компьютеру ? Продолжаем эксперементы со сторублевым программатором USBasp ,ранее мы уже научили его работать как i2c-usb переходник.

 Для подключения датчиков мы возьмём за основу проект  USBTemp ,который изначально заточен под другой микроконтроллер -Atmega168,но,используя несложные манипуляции исходный код проекта адаптируется под м/к atmega8 и схему от USBasp.

Принцип действия данного устройства: м/к каждую минуту запрашивает данные с датчиков(в это время светодиод гаснет) и сохраняет в свою память, а программа на компьютере потом запрашивает их.

Скомпилированную версию USBtemp под USBasp качаем тут.В архиве имеется и программы для чтения показаний датчиков на компьютере,в том числе из ОС Windows.Если Вы хотите модифицировать прошивку ,то исходный код можно найти на официальной странице проекта.

Как перепрограммировать устройство можно почитать на страничке  USBasp в разделе “Допиливание” программатора. .Вкраце лишь укажу строку для программирования через arduino :

avrdude -C avrdude.conf -c avrisp -P COM1 -b 19200 -p m8 -U flash:w:usbtemp.hex

И через другую USBasp:

avrdude -C avrdude.conf -c usbavr -P -p m8 -U flash:w:usbtemp.hex

Фьюзы остаются такие же как были на USBasp:

-U lfuse:w:0xef:m -U hfuse:w:0xc9:m

Не забываем ,что для перепрограммирования USBasp необходимо установить джампер JP2.

Подключаем датчики к переходнику:

На плате бывшего программатора не хватает подтягивающего резистора на 4.7кОм (резистор подбирается в зависимости от количества датчиков и расстояния до них) ,который должен быть подключен к плюсу (Вывод VTG ). Датчики подключаем паралельно согласно даташиту: 1 и 3 вывод замыкаем на минус,2 – к выводу USB переходника DS.По умолчанию максимальное количество датчиков ровно 5.

На фото собрана тестовая схема ,где подключено 3 датчика.Можно так же разглядеть резистор на 4.7кОм,который подключен на плюс.

 Работа с утилитой в Linux и Windows:

 Для работы в Linux драйвера не требуются.В Windows необходимо установить стандартные дрова.

 usbtemp sensors – выдаст адреса подключенных датчиков.Новые датчики появляются только после перезапуска устройства.

usbtemp temp  -чтение текущего датчика.

Бонус команды,управляющие незадействованным светодиодом на плате:

usbtemp ledon – включить светодиод.

usbtemp ledoff – выключить светодиод.

При соотвествующей доработке прошивки можно управлять и свободными выводами (PIO).

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

Материалы и ссылки:
Прошивка и программа USBtemp2.0.zip.
Страничка проекта USBTemp.

Источник: http://homes-smart.ru/index.php?id=38&Itemid=175&option=com_content&view=article

Схема подключения датчика ds18b20 к микроконтроллеру

ПодробностиКатегория: МикроконтроллерыОпубликовано 06.08.2015 13:19Автор: AdminПросмотров: 1908

В данном проекте используется весьма распространенный датчик измерения температуры ds18b20. Измеренная температура при помощи микроконтроллера Atmega8515 выводится на символьный дисплей 16×2.

ATmega8515 выбран потому, что он совместим по выводам с 8051 микроконтроллером. В этом проекте используется тактирование от внутреннего RC генератора, поэтому необходимо выставить фъюз биты для работы с внутренним генератором.

DS1820 Цифровой термометр обеспечивает 9-битные температурные измерения по Цельсию. DS1820 общается по 1-проводной шине, что по определению требует только одну линию данных (и землю) для связи с центральным микропроцессором. 

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

Программа микроконтроллера‘—————————————————————————————– ‘copyright : (c) 2008-2009, AVRprojects.info ‘purpose : DS1820 / DS18S20 Temperature Indicator ‘—————————————————————————————– $regfile = “m8515.dat” ‘ specify the used micro $crystal = 8000000 ‘ used crystal frequency Declare Sub Read1820 Config 1wire = Portd.7 Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = Porta.

2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5 , E = Porta.1 , Rs = Porta.

0 ‘Temp variables Dim Bd1 As Byte Dim Bd2 As Byte Dim Bd7 As Byte Dim Bd8 As Byte Dim I As Byte , Tmp As Byte Dim T As Integer , T1 As Integer Dim Bd(9) As Byte ‘Scratchpad 0-8 72 bits incl CRC, explanations for DS1820 ‘Sc(1) ‘Temperature LSB ‘Sc(2) ‘Temperature MSB ‘Sc(3) ‘TH/user byte 1 also SRAM ‘Sc(4) ‘TL/user byte 2 also SRAM ‘Sc(5) ‘config also SRAM x R1 R0 1 1 1 1 1 – the r1 r0 are config for resolution – write FF to byte for 12 bit – others dont care ‘Sc(6) ‘res ‘Sc(7) ‘res ‘Sc(8) ‘res ‘Sc(9) ‘8 CRC ‘DALLAS DS1820 ROM and scratchpad commands”””””””””””””1wwrite…. ‘&H 33 read rom – single sensor ‘&H CC skip rom ‘&H BE read scratchpad ‘&H 44 convert T ‘ Main loop Cls Cursor Off Do 1wwrite &HCC : 1wwrite &H44 ‘ start measure Waitms 400 ‘ wait for end of conversion Read1820 Wait 1 Loop End ‘end program ‘Read the DS1820 by skipping the ROM checking, since we are using only 1 sensor Sub Read1820 ‘ reads sensor ans calculate ‘ T for 0.1 C 1wreset ‘ reset the bus 1wwrite &HCC ‘ read internal RAM 1wwrite &HBE ‘ read 9 data bytest Bd(1) = 1wread(9) Bd1 = Bd(1) Bd2 = Bd(2) Bd7 = Bd(7) Bd8 = Bd(8) ‘ read bytes in array 1wreset ‘ reset the bus Tmp = Bd1 And 1 If Tmp = 1 Then Decr Bd1 ‘ 0.1C precision T = Bd1 T = T * 50 T = T – 25 T1 = Bd8 – Bd7 T1 = T1 * 100 T1 = T1 / Bd8 T = T + T1 T1 = T / 100 ‘store tens T = T Mod 100 ‘store decimal number Cls Locate 1 , 3 Lcd “Temperature” Locate 2 , 7 Lcd T1 ; “.” ; T End Sub End

Источник: http://www.radio-magic.ru/microcontrollers/269-datchik-ds1820-i-mikrokontroller-avr

Как подключить 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

Ссылка на основную публикацию
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}