Подключение семисегментного индикатора (1 разряд) к arduino по spi

Подключение 4-разрядного светодиодного индикатора по SPI интерфейсу

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

По сравнению с ЖК индикаторами, сегменты светодиодного индикатора светятся ярко и различимы на большом расстоянии и при широком угле обзора. Для подключения семисегментного 4-разрядного индикатора к микроконтроллеру потребуется, по крайней мере, 12 линий ввода/вывода.

Поэтому использовать данные индикаторы с микроконтроллерами с малым количеством выводов, например серии PIC12F от  компании Microchip, практически невозможно.

Конечно, можно использовать разные методы мультиплексирования (описание которых можно найти на сайте Радиолоцман в разделе “Схемы”), но и в этом случае имеются определенные ограничения для каждого метода, и зачастую в них используются сложные программные алгоритмы.

Мы рассмотрим метод подключения индикатора по интерфейсу SPI, который потребует всего 3 линии ввода/вывода микроконтроллера. При этом сохранится управление всеми сегментами индикатора.

Для подключения 4-разрядного индикатора к микроконтроллеру по SPI шине используется специализированная микросхема-драйвер MAX7219 производства компании Maxim. Микросхема способна управлять восемью семисегментными индикаторами с общим катодом и имеет в своем составе BCD-декодер, драйверы сегментов, схему мультиплексирования и статическое ОЗУ для хранения значений цифр.

Ток через сегменты индикаторов устанавливается с помощью лишь одного внешнего резистора. Дополнительно микросхема поддерживает управление яркостью индикаторов (16 уровней яркости) посредством встроенного ШИМ.

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

И нас больше интересует не сама схема, а работа с микросхемой по интерфейсу SPI.

Питание модуля +5 В подается на вывод Vcc, сигнальные линии MOSI, CLK и CS предназначены для коммуникации мастер-устройства (микроконтроллер) с ведомым (микросхема MAX7219).

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

Данные передаются в микросхему 16-битными пакетами (по два байта), которые помещаются во встроенный 16-битный регистр сдвига по каждому нарастающему фронту сигнала CLK. 16-битный пакет мы обозначим D0-D15, где биты D0-D7 содержат данные, D8-D11 содержат адрес регистра, биты D12-D15 значения не имеют.

Бит D15 – старший значащий бит и является первым принимаемым битом. Хотя микросхема способна управлять восемью индикаторами, мы рассмотрим работу только с четырьмя.

Управление ими осуществляется на выходах DIG0 – DIG3, расположенных в последовательности справа налево, 4-битные адреса (D8-D11), которые им соответствуют, это 0×01, 0×02, 0×03 и 0×04 (шестнадцатеричный формат).

Регистр цифр реализуется на базе встроенного ОЗУ с организацией 8×8 и адресуются непосредственно, так что каждая отдельная цифра на дисплее может обновляться в любое время. В следующей таблице приведены адресуемые цифры и регистры управления микросхемы MAX7219.

Регистр Адрес HEX-значение
D15-D12 D11 D10 D9 D8
Нет операции Х 0хХ0
Разряд 0 Х 1 0хХ1
Разряд 1 Х 1 0хХ2
Разряд 2 Х 1 1 0хХ3
Разряд 3 Х 1 0хХ4
Разряд 4 Х 1 1 0хХ5
Разряд 5 Х 1 1 0хХ6
Разряд 6 Х 1 1 1 0хХ7
Разряд 7 Х 1 0хХ8
Режим декодирования Х 1 1 0хХ9
Яркость Х 1 1 0хХA
Количество индикаторов Х 1 1 1 0хХB
Выключение Х 1 1 0хХC
Тест индикатора Х 1 1 1 1 0хХF

Регистры управления

Микросхема MAX1792 имеет 5 регистров управления: режим декодирования (Decode-Mode), управление яркостью индикатора (Intensity), регистр количества подключенных индикаторов (Scan Limit), управление включением и выключением (Shutdown), режим тестирования (Display Test).

Включение и выключение микросхемы

При подаче питания на микросхему все регистры сбрасываются, и она переходит в режим Shutdown (выключение). В этом режиме дисплей отключен. Для перехода в нормальный режим работы необходимо установить бит D0 регистра Shutdown (адрес 0Сh).

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

Этот режим может использоваться для экономии энергии или в режиме сигнализации миганием индикатора (последовательная активация и деактивация режима Shutdown).

Перевод микросхемы в режим Shutdown осуществляется последовательной передачей адреса (0Сh) и данных (00h), а передача 0Ch (адрес) и затем 01h (данные) возвращают в нормальный режим работы.

Режим декодирования

C помощью регистра выбора режима декодирования (адрес 09h) можно использовать BCD code B декодирование (отображаемые символы 0-9, E, H, L, P, -) или же без декодирования для каждой цифры.

Каждый бит в регистре соответствует одной цифре, установка логической единицы соответствует включению декодера для данного разряда, установка 0 – декодер исключается.

Если используется BCD декодер, то принимается во внимание только младший полубайт данных в регистрах цифр (D3-D0), биты D4-D6 игнорируются, бит D7 не зависит от BCD декодера и отвечает за включение десятичной точки на индикаторе, если D7=1.

Например, при последовательной посылке байтов 02h и 05h на индикаторе DIG1 (второй разряд справа) будет отображаться цифра 5. Подобным образом, при посылке 01h и 89h на индикаторе DIG0 будет отображаться цифра 9 с включенной десятичной точкой. В таблице ниже приведен полный список символов, отображаемых при использовании BCD декодера микросхемы.

Символ Данные в регистрах Включенные сегменты = 1
D7* D6-D4 D3 D2 D1 D0 DP* A B C D E F G
X 1 1 1 1 1 1
1 X 1 1 1
2 X 1 1 1 1 1 1
3 X 1 1 1 1 1 1 1
4 X 1 1 1 1 1
5 X 1 1 1 1 1 1 1
6 X 1 1 1 1 1 1 1 1
7 X 1 1 1 1 1 1
8 X 1 1 1 1 1 1 1 1
9 X 1 1 1 1 1 1 1 1
X 1 1 1
E X 1 1 1 1 1 1 1 1
H X 1 1 1 1 1 1 1
L X 1 1 1 1 1 1
P X 1 1 1 1 1 1 1 1
Пусто X 1 1 1 1
*Десятичная точка устанавливается битом D7=1

При исключении BCD декодера из работы биты данных D7-D0 соответствуют линиям сегментов (A-G и DP) индикатора.

Управление яркостью индикаторов

Микросхема позволяет программно управлять яркостью индикаторов посредством встроенного ШИМ. Выход ШИМ контролируется младшим полубайтом (D3-D0) регистра Intensity (адрес 0Ah), который позволяет устанавливать один из 16 уровней яркости. При установке всех битов полубайта в 1 выбирается максимальная яркость индикатора.

Количество подключенных индикаторов

В регистре Scan-Limit (адрес 0Bh) устанавливается значение количества разрядов, обслуживаемых микросхемой (1 … 8). Для нашего варианта с 4 разрядами в регистр должно быть записано значение 03h.

Тест индикатора

Регистр, отвечающий за этот режим, находится по адресу 0Fh. Устанавливая бит D0 в регистре, пользователь включает все сегменты индикаторов, при этом содержимое регистров управления и данных не изменяется. Для выключения режима Display-Test бит D0 должен быть равен 0.

Интерфейс с микроконтроллером

Модуль индикатора может быть подключен к любому микроконтроллеру, который имеет три свободные линии ввода/вывода. Если микроконтроллер имеет встроенный аппаратный модуль SPI, то модуль индикатора может подключаться как ведомое устройство на шине.

В этом случае сигнальные линии SPI интерфейса SDO (serial data out), SCLK (serial clock) и SS (slave select) микроконтроллера могут быть непосредственно подключены к выводам MOSI, CLK и CS микросхемы MAX7219 (модуля), сигнал CS имеет активный низкий уровень.

В случае если микроконтроллер не имеет аппаратного SPI, то интерфейс можно организовать программно.

Общение с микросхемой MAX7219 начинается с установки и удержания низкого уровня на линии CS, после чего последовательно посылаются 16 бит данных (старший значимый бит передается первым) по линии MOSI по нарастающему фронту сигнала CLK. По завершению передачи на линии CS опять устанавливается высокий уровень.

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

Используемый микроконтроллер – PIC12F683, интерфейс реализован программно, сигнальные линии CS, MOSI и CLK модуля индикатора подключены к портам GP0, GP1 и GP2, соответственно.

Используется компилятор mikroC для PIC микроконтроллеров (mikroElektronika), однако код может быть модифицирован под другие высокоуровневые компиляторы. Микроконтроллер работает на тактовой частоте 4 МГц от встроенного RC осциллятора, выход MCLR отключен.

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

Загрузки

Исходный код тестовой программы и HEX-файл для прошивки микроконтроллера – скачать

embedded-lab.com

Источник: https://www.rlocman.ru/shem/schematics.html?di=134175

Программирование Arduino урок 12 — семисегментный индикатор часть 1

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

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

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

Еще одно существенное отличие, что выделяет данный индикатор на фоне простых светодиодов. У него общий катод (вернее две равноценные ножки 3 и 8, на который заведен катод). Достаточно всего лишь соединить один из катодов с землей (GND). Аноды у всех элементов индикатора индивидуальные.

Небольшое отступление. Все выше сказанное относится к 7-сегментным индикаторам с общим катодом. Однако существуют индикаторы с общим анодом. Подключение таких индикаторов имеет существенные отличия, поэтому прошу не путать «грешное с праведным». Необходимо четко понимать, какой именно тип семисегментника у вас в руках!

Кроме отличий между простыми светодиодами и 7-сегментными индикаторами, есть и общие черты.

Например: индикаторы, как и светодиоды, можно смонтировать в ряд (последовательность) для отображения двух-, трёх-, четырехзначных чисел (разрядов).

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

Надеюсь, вы не забыли об необходимости использования токоограничивающих резисторов при подключении светодиодов. Это же относится и к индикаторам: на каждый элемент индикатора должен быть подключен свой резистор. 8 элементов ( 7 + 1) – 8 резисторов.

У меня под рукой оказался семисегментник с маркировкой 5161AS (общий катод). Распиновка контактов:

Принципиальная схема

Как говорил ранее, для того, чтобы включить сегмент «А» подключим к любому общему контакту (3 или 8) «землю», а на вывод 7 подадим 5В питания. Если индикатор с общим анодом, то на анод подаём 5В, а на вывод сегмента «землю»!

Соберём тестовый стенд. Соединяем провода по порядку, начиная с первой ножки, которая идёт на 2-й вывод платы Ардуино. Землю подключим к 8 выводу индикатора.

После того, как стенд собран можно приступать к написанию прошивки.

Для проверки индикатора запустим написанную программу. Выберем элемент «А» и помигаем им.


Теперь помигаем цифрой 2. Для этого включим еще несколько элементов.

Чтобы вывести одну цифру, нужно написать n-число строчек кода. Затруднительно, не находите.

Есть другой путь. Для того, чтобы вывести любую цифру на индикаторе, сначала её нужно представить в виде определенной последовательности бит.

Таблица соответствия.

Если у дисплея общий анод, то 1 нужно заменить на 0, а 0 – на 1!

Столбец hex – представление цифры в байтовом виде (более детально поговорим об этом во второй части).

Число в двоичной системе счисления записывается следующим образом: 0b00000000. 0b – двоичная система. Нули означают, что все светодиоды выключены.

При подключении мы задействовали выводы с 2 по 9. Чтобы включить 2 вывод записываем в него единицу = 0b00000001. За точку отвечает четвёртый бит справа. За чёрточку посередине индикатора отвечает самый последний бит.

Давайте напишем пример вывода цифры 0.

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

Примечание: функция bitRead() считывает состояние указанного бита и возвращает значение состояния (0 или 1). bitRead(x, n) где, x — число, бит которого необходимо считать; n — номер бита, состояние которого необходимо считать. Нумерация начинается с младшего значащего бита (крайнего правого) с номером 0.

И в завершении первой части напишем небольшой счетчик.

lesson_14_0

На этом всё! Продолжении следует!

Источник: http://mozgochiny.ru/electronics-2/programmirovanie-arduino-urok-12-semisegmentnyiy-indikator-chast-1/

Модуль многоразрядного 7-ми сегментного индикатора на базе микросхемы MAX72xx, подключение к Arduino и работа с библиотечными функциями

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

Например, на фото ниже, показаны три вида многоразрядных индикаторов, слева направо – 4-х разрядный, 6-ти разрядный, 8-ми разрядный. Причем первый является 4-х разрядным индикатором часового типа.

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

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

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

Кстати, как уже было сказано – LED матрицы 8х8 тоже работают на базе драйвера MAX7219, и кому интересно то добро пожаловать в статьи:

Итак, начнем… Думаю что про многоразрядность было дано хорошее описание, а вот почему семисегментный? Ответ тоже не так уж и сложен – потому что для формирования символа или отображения цифры используется семь светодиодов, проиндексированных буквами A, B, C, D, E, F, G, таблица ниже показывает как это обозначено:

Как видно из таблицы, есть также и восьмой светодиод – DP. Полностью закодировать символ или цифру можно в 1 байте, устанавливая или сбрасывая определенный бит, как это показано с примером кодирования символа J. В примере установлены биты B, C, D, E, что позволяет отобразить заданный символ на семисегментном индикаторе.

От теории к практике – подключим 8-ми разрядный модуль к плате Arduino Uno по указанной ниже схеме:

Для отображения символов используется несколько функций из подключаемой библиотеки LedControl.h. Разберем каждую из этих функций по порядку, начнем с функции setDigit(). 

Прототип объявления функции для отображения числа и передаваемые функции аргументы:

setDigit(int addr, int digit, byte value, boolean dp);

Где – 

        int addr – адрес модуля на шине SPI для которого вызывается функция, если модуль один – то этот параметр равен 0 (по умолчанию адресация устройств на шине SPI начинается с нуля)

        int digit – порядковый номер разряда в модуле индикации, по умолчанию для многоразрядных индикаторов нумерация разрядов начинается с крайнего правого разряда, соответственно номер крайнего правого разряда равен 0, а номер крайнего левого разряда в нашем случае равен 7

        byte value – значение(число от 0 до 9) которое нужно отобразить в разряде номер которого указан в параметре int digit

        boolean dp – этот параметр отвечает за отображение точки у разряда номер которого указан в параметре int digit. Если параметр равен true  то  точка отобразится, если false то точка не отобразится.

Прототип объявления функции для отображения символа и передаваемые функции аргументы:

setChar(int addr, int digit, char value, boolean dp);

        int addr –  адрес модуля на шине SPI  для которого вызывается функция, если модуль один – то этот параметр равен 0  (по умолчанию адресация устройств на шине SPI   начинается с нуля)

        int digit –  порядковый номер разряда в модуле индикации, по умолчанию для многоразрядных индикаторов нумерация разрядов начинается с крайнего правого разряда, соответственно номер крайнего правого разряда равен  0,  а номер крайнего левого разряда в нашем случае равен  7

        char value – символ, который должен отобразиться в разряде номер которого задан параметром int digit

        boolean dp –  этот параметр отвечает за отображение точки у разряда номер которого указан в параметре  int digit.  Если параметр равен  true   то  точка отобразится, если  false  то точка не отобразится.

Отдельным моментом стоит упомянуть, что функция setChar() может отобразить только ограниченный набор символов, таких как:

  • 0 1 2 3 4 5 6 7 8 9 цифра отображается как символ
  • A a символ отобразится в верхнем регистре  
  • B b символ отобразится в нижнем регистре
  • С с символ отобразится в нижнем регистре
  • D d символ отобразится в нижнем регистре
  • E e символ отобразится в верхнем регистре
  • F f символ отобразится в верхнем регистре
  • H h символ отобразится в нижнем регистре
  • L l символ отобразится в верхнем регистре
  • P p символ отобразится в верхнем регистре
  • – знак “минус”
  • . , отображение точки
  • символ подчеркивания
  • установить символ пробела

В тестовом скетче можно поставить задачу такого плана:

  1.  Отобразить поочередно цифры от 1 до 8 без точки
  2.  Заполнить цифрами от 1 до 8 все разряды модуля индикации, плюс отобразить все точки указаных разрядов
  3.  Отрисовать поразрядно массив с заранее закодированными в двоичном коде символами, в результате должно получиться “Arduino rules!!!” 

Из-за ограниченного набора символов функция setChar() не подходит для тестового скетча, так как она не сможет нормально отрисовать фразу указанную в пункте 3. Вместо этой функции мы будем использовать функцию setRow(). Итак…  функция setRow() уже была нами испытана в в статьях про изучение Led матриц 8х8, давайте вновь опишем прототип вызова и параметры данной функции.

Прототип объявления функции setRow() и передаваемые функции аргументы:

setRow(int addr, int row, byte value);

Где – 

        int addr –  адрес модуля на шине SPI  для которого вызывается функция, если модуль один – то этот параметр равен 0  (по умолчанию адресация устройств на шине SPI   начинается с нуля)

        int row – порядковый номер разряда в модуле индикации, по умолчанию для многоразрядных индикаторов нумерация разрядов начинается с крайнего правого разряда, соответственно номер крайнего правого разряда равен  0,  а номер крайнего левого разряда в нашем случае равен  7

        byte value – значение в двоичном формате(пример B00000000, также возможна альтернатива в десятичном и шестнадцатиричном), которым закодирован необходимый символ. Таблица кодирования символов поможет правильно закодировать нужный символ.          

Ну и в завершение статьи тестовый скетч и видео, как это работает:

#include “LedControl.h” /*  * Подключаем библиотеку LedControl.h  * и создаём объект класса LedControl  * при этом, 7-ми сегметный дисплей с драйвером MAX72xx  * должен быть подключен к плате Arduino следующим образом:  * Arduino[Pin 5V] -> Display Module MAX72xx[VCC]  * Arduino[PinGND] -> Display Module MAX72xx[GND]  * Arduino[Pin 12] -> Display Module MAX72xx[DIN]  * Arduino[Pin 11] -> Display Module MAX72xx[CLK]  * Arduino[Pin 10] -> Display Module MAX72xx[LOAD/CS]  *  */ LedControl lc = LedControl(12, 11, 10, 1); //Массив с закодированными символами, //Фраза “Arduino ruLES!!!” byte ar[15] =               {                 B01110111,    //A                 B00000101,    //r                 B00111101,    //d                 B00011100,    //u                 B00010000,    //i                 B00010101,    //n                 B00011101,    //o                 B00000101,    //r                 B00011100,    //u                 B00001100,    //l                 B01001111,    //E                 B01011011,    //S                 B10110000,    //!                 B10110000,    //!                 B10110000     //!               }; void setup() {   //Устройство(7-ми сегментный дисплей) выводим из спящего режима   lc.shutdown(0, false);   //Установить яркость дисплея на 8   //Всего возможных режимов яркости от 0 до 15   lc.setIntensity(0,8);   //Очистить дисплей   lc.clearDisplay(0); } void loop() {   //Простейший перебор чисел от 1 до 8 по разрядам   for(int i = 0, j = 7; i < 8, j >= 0; i++, j–)   {     lc.setDigit(0, j, byte(i + 1), false);     delay(400);     lc.clearDisplay(0);   }   //Перебор чисел без очистки экрана   for(int i = 0, j = 7; i < 8, j >= 0; i++, j–)   {     lc.setDigit(0, j, byte(i + 1), true);     delay(400);   }   lc.clearDisplay(0);   //Отрисовка фразы “Arduino ruLES!!!”   int n = 0;   for(int i = 0; i < 2; i ++)   {     for(int j = 7; j >= 0; j –)     {       if(n > 6 && !(i % 2))       {         continue;       }       else       {         lc.setRow(0, j, ar[n]);         delay(400);         n ++;       }         }     lc.clearDisplay(0);   }   delay(400);   lc.clearDisplay(0); }

Источник: http://arduino.on.kg/modul-mnogorazryadnogo-7-mi-segmentnogo-indikatora-na-baze-mikroshemy-MAX72xx-rassmatrivaem-podklyuchenie-k-Arduino

Как подключить семисегментный индикатор к Arduino

Семисегментный индикатор

Семисегментный индикатор — это набор светодиодов, собранных в едином корпусе. Светодиоды образуют сегменты-палочки, путём подсвечивания которых можно формировать цифры. Индикатор можно напрямую подключать к Ардуино (см.

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

Для решения этой проблемы мы предлагаем использовать специальную микросхему, называемую 7-ми сегментным драйвером (CD4026). В статье рассмотрено подключение драйвера к arduino.

Суть работы микросхемы проста: на вход микросхемы clock (1) подаются импульсы HIGH, каждый импульс соответствует увеличению внутреннего счетчика на единицу. Значение этого счетчика и будет отображаться на индикаторе.

Вывод clock (1) рекомендуется снабдить стягивающим резистором для избежания ложных срабатываний. Для сброса счетчика подается импульс на вход reset clock (15). На пины enable display (3) должен подаваться сигнал HIGH, иначе все выводы окажутся выключенными.

Если вы не собираетесь включать и выключать отображение цифр на индикаторе — просто подключите этот вывод к рельсе питания. К пину 16 следует подключить питание. Пины disable clock (2) и 0V (8) подключаются к земле.

У драйвера 7 выходов (a, b, c, d, e, f, g) для подключения к соответствующим ножкам индикатора через токоограничительные резисторы. Особого внимания заслуживает выход ÷10 output (5).

 При переполнении внутреннего счетчика (в момент подачи сигнала HIGH на clock (1)  при текущем значении счетчика 9) на него подается сигнал HIGH до момента следующего увеличения счётчика. Это позволяет подключить этот выход ко входу clock (1) следующего драйвера, и получить возможность выводить почти неограниченное количество разрядов за счет всего 3-х выходов Arduino.

Микросхема работает на частоте 16 МГц, за счет чего изменение напряжения на выходах, а, соответственно, и изображения на индикаторе происходит очень быстро, и его нельзя заметить невооруженным глазом.

Распиновка микросхемы CD4026

Схема подключения семисегментного индикатора LD-5161AG

Установите микросхему на макетную плату и подключите выводы микросхемы к выводам контроллера следующим образом:

  • 1 «clock» ко 2 выводу ардуино. Дополнительно, через резистор 10 кОм к земле. Резистор исключит влияние помех на отображение числа.
  • 2 «disable clock» к рельсе земли.
  • 3 «enable display» к рельсе питания.
  • 5 «÷10» можно оставить неподключённым. При увеличении числа драйверов, к этому выводу следует подключить вывод 1 «clock» второго драйвера.
  • 8 «0V» — к рельсе земли.
  • 15 «reset» к 3 выводу ардуино. Дополнительно, через резистор 10 кОм к земле. Резистор исключит возможный сброс значения из-за помех.
  • 16 вывод микросхемы к рельсе питания.

Выводы микросхемы 6,7 и с 9 по 13 соединить с выводами семисегментного индикатора, ориентируясь на буквенный обозначения на схемах выше. Средние выводы индикатора — это общие катоды, их нужно подключить к рельсе земли.
Вот так это должно выглядеть:

Семисегментный драйвер CD4026 установлен на макетную плату

Семисегментный драйвер CD4026 с подключённым к нему семисегментным индикатором

Теперь загрузите в плату Arduino следующий код:

// Обнуляет текущее значение// Просто последовательно выдаём HIGH и LOW на вывод resetdigitalWrite(RESET_PIN, HIGH);digitalWrite(RESET_PIN, LOW);//Выводит на индикаторе переданное в параметрах число// Обнуляем текущее значение// "Помигаем" выводом счётчика до нужного значенияfor (byte i=0; i

Этот код отображает количество целых секунд, прошедших с момента запуска платы. То есть, отображает числа от 0 до 60. При одном подключённом индикаторе, вы увидите, что индикатор отображает только цифры от 0 до 9.

Семисегментный драйвер CD4026 отображает числа от 0 до 9

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

Вывод 1 «clock» не нужно подключать к контроллеру Arduino, просто подключите его к выводу 5 «÷10» первого драйвера. Этого достаточно, чтобы второй драйвер начал отображать десятки на подключённом к нему индикаторе.

Выводы 15 «reset» обоих драйверов должны быть соединены между собой.

Семисегментный драйвер CD4026 с двумя подключёнными к нему семисегментными индикатороми

Теперь наш счётчик показывает 2 разряда,а вы восхитительны!

P.S. На видео есть небольшая странность. Первый, кто в комментариях предложит правильную причину, почему это произошло, получит бесплатно набор из 2х индикаторов и 2х микросхем CD4026. Подсказка: это не монтаж. Именно так всё и отображалось в реальности. В плату был залит именно тот скетч, что предлагается выше.
В комментариях уже есть правильный ответ.

Таким образом можно множить цепочку индикаторов до бесконечности. Управлять всем этим по прежнему будут всего 2 вывода контроллера.

Источник: https://uscr.ru/kak-podklyuchit-semisegmentnyj-indikator-k-arduino/

Подключение 7-сегментного индикатора к Ардуино

Семисегментный индикатор, как говорит его название, состоит из семи элементов индикации (сегментов), включающихся и выключающихся по отдельности. Включая их в разных комбинациях, из них можно составить упрощённые изображения арабских цифр. Часто семисегментные индикаторы делают в курсивном начертании, что повышает читаемость. Цифры, 6, 7 и 9 имеют по два разных представления на семисегментном индикаторе. В ранних калькуляторах Casio и Электроника цифра 0 отображалась в нижней половине индикатора.Сегменты обозначаются буквами от A до G; восьмой сегмент — десятичная запятая, предназначенная для отображения дробных чисел.Изредка на семисегментном индикаторе отображают буквы.Светодиодные индикаторы имеют предельно простую форму, так как в них применяются светодиоды, отлитые в форме сегментов, и чем меньше разных типов светодиодов, тем дешевле устройство.

Выбор индикатора

С выбором я немного поторопился, и вместо того чтобы почитать теорию, пошёл в магазин радиодеталей и просто выбрал те индикаторы, которые мне больше приглянулись.

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

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

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

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

Подключение

Перерыв интернет, и не найдя описания подключения конкретно этого индикатора, решил определить всё сам:

Сам процесс оказался интересным и совсем не сложным.

Так, из 14 ножек, мне понадобилось только 9 (7 на сегменты, 1 на запятую и 1 на общее питание +3.3v). Проверял, подключая сегменты на землю (в ардуине это будет отсутствие сигнала на ноге).

Чтобы выводить цифры, надо комбинировать включение-выключение сегментов.

Так, например, для цифры семь, надо включить сегменты AB и C.

Или, с Ардуины подать на их выводы LOW, а на остальные HIGH (для общего катода – наоборот, а сам катод нужно подключить на землю).

Вот, собственно табличка, соответствий для цифер от 0 до 9:

ЦифраСегменты
ABCDEF
1 BC
2 ABDEG
3 ABCDG
4 BCFG
5 ACDFG
6 ACDEFG
7 ABC
8 ABCDEFG
9 ABCDFG

int pins[7]={2,3,4,5,6,7,8};

byte numbers[10] = { B11111100, B01100000, B11011010, B11110010, B01100110,

B10110110, B10111110, B11100000, B11111110, B11100110};

int number=0;

void setup()
{

for(int i=0;i

Источник: http://electronica52.in.ua/proekty-arduino/podkluchenie-7segmentnogo-indikatora-k-arduino–

Делаем цифровую шкалу — Сообщество «Электронные Поделки» на DRIVE2

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

Соответственно по их подключению написано масса статей, но попробую все таки написать свою :)Итак: что же такое 7-сегментный индикатор?Обратимся к Википедии: “Семисегме́нтный индика́тор — устройство отображения цифровой информации. Это — наиболее простая реализация индикатора, который может отображать арабские цифры.

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

Сегменты обозначаются буквами от A до G; восьмой сегмент — десятичная точка (decimal point, DP), предназначенная для отображения дробных чисел.По сути говоря данный индикатор — это 8 светодиодов расположенных на панели определенным образом.

Соответственно самая простая схема включения — подсоединить все 8 ножек на выводы микроконтроллера (микросхемы — дешифратора) через балластные резисторы, а на общий провод подавать либо “+” (для индикаторов с общим анодом) либо “-” (для индикаторов с общим катодом).

Пример подключения индикатора с общим анодом для схемы индикации включенной передачи АКПП Лансера приведен нижеА как быть, если нужно выводить не 1 цифру, а 2,3,4 и более?И вот тут на помощь приходит человеческая психика.

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

Тогда чтобы вывести первый разряд (опять же для схемы с общим анодом) нужно подать “+” только на общий провод первого разряда и “-” на нужные провода сегментов. Задержать изображение на 2-3 милисекунды, переключится на второй разряд и проделать то же самое с ним, поле чего перейти на третий (четвертый и т.д.) или вернутся к первому.

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

Кстати, транзисторы в этой схеме необязательны — можно подключить выводы индикатора непосредственно к выводам микроконтроллера и затем не подавать на них напряжение (выводы 8-10 данной схемы), а наоборот “притягивать к земле” выводя на них “низкое” напряжение или попросту говоря 0. А “высокое” напряжение (или 1) подается на общие выводы разрядов, которые не должны в данный момент гореть.

Более подробно о таком способе подключения написано здесь — arduino-kit.com.ua/instru…-indikator-i-arduino.html

В чем же “бяка” данной схемы? А в том, что для вывода например трехразрядного числа нужно задействовать 11 ножек микроконтроллера, причем 7 из них, чтобы не раздувать программу, должны относится к одному порту.Все это хорошо, но, например, у Attiny2313 такой только порт В на котором “висят” и оба входа аналогового компаратора.И вот тут на помощь приходят специальные драйверы.

Чаще всего применяют драйвера MAX7219 и MAX7221, управляемые по SPI. Материал по работе с этими драйверами разместил недавно serdgos тут — www.drive2.ru/c/2812487/. Поэтому повторятся не буду — желающие могут почитать.

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

А есть ли более “хардкорные” решения? Оказывается есть — драйвер CD4026.

Описание ДрайвераЧип CD4026 предназначен для управления 7-сегментными индикаторами и представляет собой счётчик до десятка с встроенным сдвиговым регистром.

Счётчик увеличивается на единицу всякий раз, когда контакт «clock» становится HIGH (на восходящем фронте). Выходы a-g становятся HIGH в соответствии со значением счётчика, и отражают его значение арабской цифрой при подключении 7-сегментного индикатора с общим катодом.

Контакт «reset» должен быть притянут к земле в общем случае. Когда он становится HIGH, счётчик сбрасывается в ноль.Контакт «disable clock» также должен быть притянут к земле в общем случае. На время пока он HIGH сигналы на контакт «clock» игнорируются.

Контакт «enable display» должен снабжаться напряжением питания. Иначе выходы a-g будут выставлены в LOW. Контакт «enable out» возвращает его значение с небольшой задержкой.Контакт «÷10» (обозначен как h в таблице) принимает HIGH для значений 0-4 и LOW для 5-9.

Его выход может быть отправлен на вход «clock» следующего 7-сегментного драйвера, чтобы организовать счётчик числа с несколькими разрядами.Контакт «not 2» принимает значениние LOW тогда и только тогда, когда значение счётчика — 2. В остальных случаях он HIGH.

Рабочее напряжение питания: 3—15 В.

ПодключениеС этим все просто: смотрим даташит на индикатор. Я использовал 3х- разрядный, но принципиально разницы с четырехразрядным нет, — для подключения четвертого разряда нужно будет еще задействовать вывод 6 индикатора (сейчас он “пустой”).

Сопоставив даташиты у меня получилась такая схема подключенияи после распайки

В качестве источника сигнала выступал Arduino Pro Micro c задействованными выводамиPin2 Выход на счетчикPin3 Сброс счетчикаPin4 Подключение разряда 1Pin6 Подключение разряда 2Pin9 Подключение разряда 3

Точку не подключал, ибо сейчас ненужно, а принцип подключения тот же.

ПрограммаТак как задействовано Arduino. то и язык соответствующий — модифицированный С.

Прога секундомера, считающего секунды с момента включения, “накидана по быстрячку” чтобы проверить работоспособность, поэтому слегка корява — уж извините.

#define CLOCK_PIN 2#define RESET_PIN 3#define DIGIT_1PIN 4#define DIGIT_2PIN 6

#define DIGIT_3PIN 9

void resetNumber(){// Для сброса на мгновение ставим контакт// reset в HIGH и возвращаем обратно в LOWdigitalWrite(RESET_PIN, HIGH);digitalWrite(RESET_PIN, LOW);digitalWrite(DIGIT_1PIN, HIGH);digitalWrite(DIGIT_2PIN, HIGH);digitalWrite(DIGIT_3PIN, HIGH);}void showNumber(float t){ int n;// Первым делом обнуляем текущее значениеresetNumber();// Выводим первый разрядdigitalWrite(DIGIT_1PIN, LOW);n=int(t-int(t/10)*10);// Далее быстро «прокликиваем» счётчик до нужного// значенияwhile (n–) {digitalWrite(CLOCK_PIN, HIGH);digitalWrite(CLOCK_PIN, LOW);}delay(2);// Обнуляем счетчикresetNumber();// Выводим второй разрядdigitalWrite(DIGIT_2PIN, LOW);n=int(t/10-int(t/100)*10);// Далее быстро «прокликиваем» счётчик до нужного// значенияwhile (n–) {digitalWrite(CLOCK_PIN, HIGH);digitalWrite(CLOCK_PIN, LOW);}delay(2);// Обнуляем счетчикresetNumber();// Выводим третий разрядdigitalWrite(DIGIT_3PIN, LOW);n=int(t/100);// Далее быстро «прокликиваем» счётчик до нужного// значенияwhile (n–) {digitalWrite(CLOCK_PIN, HIGH);digitalWrite(CLOCK_PIN, LOW);}

delay(2);

}void setup() {pinMode(RESET_PIN, OUTPUT);pinMode(CLOCK_PIN, OUTPUT);pinMode(DIGIT_1PIN, OUTPUT);pinMode(DIGIT_2PIN, OUTPUT);

pinMode(DIGIT_3PIN, OUTPUT);

// Обнуляем счётчик при старте, чтобы он не оказался// в случайном состоянииresetNumber();

}

// Основной циклvoid loop(){showNumber((millis() / 1000));}

Ну и результат

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

Источник: https://www.drive2.ru/c/2827146/

Взаимодействие Arduino с семисегментным индикатором

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

Если вашему приложению на Arduino необходимо отображать только цифры, подумайте об использовании семисегментного индикатора. Семисегментный индикатор имеет семь светодиодов, расположенных в форме восьмерки. Он прост в использовании и экономичен в плане стоимости. На рисунке ниже показан типовой семисегментный индикатор.

Семисегментный индикатор

Семисегментные индикаторы бывают двух типов: с общим анодом и общим катодом. Внутренняя структура обоих типов почти одинакова. Разница заключается в полярности светодиодов и общем выводе.

В семисегментном индикаторе с общим катодом (такой мы использовали в экспериментах) катоды всех семи светодиодов и светодиода точки подключены к выводам 3 и 8.

Чтобы использовать такой индикатор, нам необходимо подключить корпус к выводам 3 и 8 и подать +5В на другие выводы, чтобы отдельные светодиоды загорелись. Следующей схеме показана внутренняя структура семисегментного индикатора с общим катодом:

Семисегментный индикатор с общим катодом

Индикатор с общим анодом является полной противоположностью.

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

На следующей диаграмме показана внутренняя структура семисегментного индикатора с общим анодом:

Семисегментный индикатор с общим анодом

Сем сегментов обозначены как a-g, а точка как “dp”, как показано на рисунке ниже:

Структура семисегментного индикатора

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

Включение сегментов индикатора для отображения цифрЦифраgfedcbaabcdefgabcdefg
0x3F 0x7E вкл вкл вкл вкл вкл вкл выкл
1 0x06 0x30 выкл вкл вкл выкл выкл выкл выкл
2 0x5B 0x6D вкл вкл выкл вкл вкл выкл вкл
3 0x4F 0x79 вкл вкл вкл вкл выкл выкл вкл
4 0x66 0x33 выкл вкл вкл выкл выкл вкл вкл
5 0x6D 0x5B вкл выкл вкл вкл выкл вкл вкл
6 0x7D 0x5F вкл выкл вкл вкл вкл вкл вкл
7 0x07 0x70 вкл вкл вкл выкл выкл выкл выкл
8 0x7F 0x7F вкл вкл вкл вкл вкл вкл вкл
9 0x6F 0x7B вкл вкл вкл вкл выкл вкл вкл
A 0x77 0x77 вкл вкл вкл выкл вкл вкл вкл
B 0x7C 0x1F выкл выкл вкл вкл вкл вкл вкл
C 0x39 0x4E вкл выкл выкл вкл вкл вкл выкл
D 0x5E 0x3D выкл вкл вкл вкл вкл выкл вкл
E 0x79 0x4F вкл выкл выкл вкл вкл вкл вкл
F 0x71 0x47 вкл выкл выкл выкл вкл вкл вкл

Эксперимент 1

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

Необходимые комплектующие

  • 1 x семисегментный индикатор (общий катод);
  • 1 x Arduino MEGA 2560
  • 1 x макетная плата;
  • перемычки.

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

В этой схеме выводы семисегментного индикатора подключены к контактам 2-9 платы Arduino, как показано в таблице ниже. Общие выводы (3 и 8) подключены к GND, а dp остается неподключенным, так как точка не используется в этом эксперименте.

Выводы семисегментного индикатораВыводы ArduinoЦвет провода
1(e) 6 оранжевый
2(d) 5 белый
3,8(COM) GND
c 4 желтый
5(dp)
6(b) 3 красный
7(a) 2 синий
9(f) 7 зеленовато-голубой
10(g) 8 зеленый

Схема подключения семисегментного индикатора к Arduino

Код

void setup() { // определить режимы работы выводов pinMode(2,OUTPUT); pinMode(3,OUTPUT); pinMode(4,OUTPUT); pinMode(5,OUTPUT); pinMode(6,OUTPUT); pinMode(7,OUTPUT); pinMode(8,OUTPUT); } void loop() { // цикл для включения светодиодов сегментов индикатора for(int i=2; i

Источник: https://radioprog.ru/post/223

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