Обзор дисплея 128х160 точек с контроллером st7735

1.8″ 128х160 TFT LCD Screen модуль от Itead в Киеве и Украине

TFT LCD экран с диагональю 1.8 дюйма, разрешением 128х160 точек и глубиной цвета 262 тыс. цветов на пиксель. Построен на базе контроллера ST7735. Отличительной чертой модуля является работа через последовательный интерфейс, что существенно экономит задействованные выводы. Размер платы 50 х 37 мм

ВыводТипОписание
VIN P Питание +5В
GND G Земля
RST I Reset,активный низкий – Reset
RS I Переключение данные/команды
SDA I Данные – MOSI
SCL I Синхронизация – SCK
CS I Чипселект (для подключения нескольких модулей параллельно), активный низкий уровень – SS
VDD33 P Питание +3.3В

Ссылки:

Отзывы покупателей о “1.8” 128х160 TFT LCD Screen модуль от Itead”

Александр (18.03.2018)

В примере кода указан выход WR, такого нет в даташите и на самой плате дисплея. И что делать?Ответить

admin (19.03.2018)

Убедитесь, пожалуйста, что пример рассчитан на работу с данным дисплеем. https://www.itead.cc/wiki/ITDB02-1.8SPОтветить

Иваныч (07.11.2017)

Дисплей пока не запускал – только распаковал.Хочу рассказать не об этом. Хочу рассказать про ужас,обуявший меня день назад. Далее – по минутам. 10-20:00. Открыл этот сайт (http://arduino-ua.com) 10-20:30 Страница загрузилась (“Интертелеком”, если вы понимаете, о чем я) 10-25:00 – нашел этот диспей, кликнул “заказать”, оформил заказ. 10-25:01 – страница обновляется….

10-25:20 – обновляется….. (да-да, у меня такой Интернет) 10-25:21 – звонок от менеджера “Ардуино.юа”!!! “здавствуйте, вы оставляли заказ, и так далее, и тому подобное…. отправлять?”. 10-25:40 – страница обновилась, наконец-то. “ваш заказ принят, наш менеджер свяжется с Вами.

Ожидайте”

Верите – вся жизнь перед глазами! Между оформлением заказа на сайте и звонком менеджера прошло меньше минуты…

Ответить

Иваныч (01.07.2018)

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

Алексей (15.06.2017)

работает для esp8266 arduino ide:

#include

Ответить

Галкин Максим (14.03.2016)

Связал дисплей с STM32F103. Все запустилось. Отличный магазин, как всегда радует своими ценами.Ответить

Малашонок Александр Александрович (26.09.2014)

Поднялся, работает! )
Может кому будет полезно – прошивка для ардуино весит около 30кб (чото так получилось, хотя и не оптимизировал сильно). Если использовать полный набор функций, шрифты – то больше.Ответить

Виктор (16.05.2014)

Запустился под Leonardo с UTFT без проблем.Ответить

Есть вопросы по 1.8″ 128х160 TFT LCD Screen модуль от Itead?

Источник: http://arduino.ua/prod466-1-8-128h160-tft-lcd-screen-modyl

Дисплей TFT 1.8 SPI и Arduino – Популярная робототехника

Сегодня я поведаю о том, как подключить к Arduino настоящий TFT дисплей. В качестве последнего будем использовать 1.8-дюймовый TFT с SPI интерфейсом, который был куплен мной на ebay за $5.65.

 

Китайский экранчик имеет разрешение 128х160, и (скорее всего) управляется драйвером ST7735R, который обеспечивает отображение 18-битного цвета (262144 оттенков). На плате устройства также размещается регулятор напряжения 5->3.

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

На плате имеется 16 выводов, три из которых не используются. Выводы 11-14 подключены к разъему SD карты.

 Вывод  Описание
 GND  земля
 VCC  питание +5В
 NC  –
 NC  –
 NC  –
 RESET  сброс
 A0  линия команд
 SDA  линия данных
 SCK  тактовый сигнал
 CS  выбор устройства
 SCK  такт. SD
 MISO  данные вых. SD
 MOSI  данные вх. SD
 CS  выбор устр. SD
 LED+  подсветка +5В
 LED-  подсветка земля

Существует два основных варианта подключения Arduino и дисплея через SPI. В первом случае, можно использовать любые из GPIO выводов Arduino, но при этом будет использован медленный программный SPI драйвер. Пример такой схемы подключения представлен ниже.

 TFT  Arduino
 GND  GND
 VCC  +5В
 RESET  8
 A0  7
 SDA  5
 SCK  4
 CS  6

Как известно, Arduino имеет встроенный аппаратный SPI. На Arduino Nano для этого используются выводы с 10 по 13. 

 TFT  Arduino
 GND  GND
 VCC  +5В
 RESET  8
 A0  9
 SDA  11
 SCK  13
 CS  10

Как я уже написал, на плате дисплея есть слот для SD карт. Чтобы была возможность выводить с карты битмапы, слот, также как и сам дисплей, необходимо подключить к SPI шине.

 TFT  Arduino
 GND  GND
 VCC  +5В
 RESET  8
 A0  9
 SDA  11
 SCK  13
 CS  10
 SCK  13
 MISO  12
 MOSI  11
 CS  4

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

Для установки этих библиотек, потребуется скачать соответствующие архивы о указанным ссылкам, распаковать их в папку с установленным Arduino IDE: …/arduino/libraries. И не забыть переименовать их, убрав из названия символ “-” (иначе либы не подключатся).

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

Скетч “graphicstest” использует первый вариант подключения – программный SPI. Второй скетч “graphicstest_highspeed” использует аппаратный SPI и выполняется гораздо быстрее первого варианта.

Наконец, третья программа “spitftbitmap” выводит на дисплей картинку, заранее сохраненную на SD карточку. Картинка должна быть битмапом (.bmp) с глубиной цвета 24бит и с разрешением, ясен пень, 128х160 пикселей.

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

Источник: http://www.poprobot.ru/home/Arduino-TFT-SPI

Цветной дисплейный модуль 128×128

Данный проект является результатом эволюции дисплейного модуля на LCD Nokia 5110 и МК ATMega8. Экран 5110 вполне себе удобен и его возможностей более чем достаточно для многих конструкций.

Но после того, как мною было собрано некоторое количество тестеров микросхем и ZX-магнитофонов, обнаружилась одна неприятная проблема – качество дисплеев Nokia5110, продаваемых на ebay и aliexpress. А точнее, полное отсутствие этого качества.

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

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

В качестве альтернативы 5110 в китайских интернет-магазинах часто предлагается цветной экран с диагональю 1.44″ и разрешением 128х128 под управлением контроллера ST7735. Вот такой:

По размеру экрана он получается чуть меньше, чем 5110, но зато пикселей имеет в четыре раза больше. И, к тому же, он цветной и умеет отображать 64К цветов. Т.е., для хранения информации об одном пикселе вместо одного бита требуется 16 бит.

Следовательно, содержимое экрана будет занимать 32 Кб (128*128*2), что существенно больше, чем 504 байта (84*48/8) для монохромного 5110. Это приводит к принципиальному отличию в работе с дисплеем – теперь не получится завести экранный буфер в котором будет формироваться картинка, а потом разом показываться чтобы избежать мерцания.

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

Т.к. объёмы обрабатываемых данных с цветным дисплеем будут в десятки раз больше, то вместо ATMega8 на 16МГц имеет смысл использовать более быстрый и ёмкий микроконтроллер.

Из бюджетных AVR-ок это может быть ATMega328 на 20МГц.

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

Цветной экран может питаться от напряжения 5В (т.к. содержит на плате собственный стабилизатор 3.3В) и толерантен к 5В сигналам, что сильно упрощает схему модуля, убирая из неё стабилизатор и перобразователь уровня на полевом транзисторе.

Кроме дисплея и микроконтроллера с обвязкой в схеме осталось 5 кнопок, пищалка и пара транзисторных ключей для управления биппером и светодиодной подсветкой (кстати, в отличии от 5110, если подсветка выключена, то разглядеть что-то на экране не получится).

Печатная плата модуля:

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

И, наконец, сам модуль в сборе:

Пару слов по монтажу печатной платы: ATMega328 на 20МГц оказалась гораздо более чувствительной к несмытому флюсу, чем ATMega8 на 16МГц (я использовал флюс ФТС). Экспериментируя с собранной но ещё не промытой платой заметил, что биппер иногда начинает периодически самопроизвольно пищать.

Причиной, как выяснилось, является то, что из-за несмытого флюса пины микроконтроллера, подключенные к клавиатуре, и подтянутые к +5В (установкой соответствующих бит в PORTC) эту подтяжку “теряют” (из-за токов утечки по остаткам флюса на “землю”), что в результате воспринимается как нажатие на кнопки клавиатуры с последующей подачей звукового сигнала.

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

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

Исходники прошивки живут на гитхабе

После заказа нескольких партий дисплеев разных версий и у разных продавцов было замечено, что они не совсем одинаковы – у некоторых система координат получается как бы смещённой – пиксел, выведенный в позицию (0, 0) отображается не в верхнем левом углу экрана, а чуть правее и/или ниже. При этом после вызова метода очистки экрана на нём остаются строки и/или столбцы заполненные случайным “мусором”. Ничего страшного в этом нет, просто перед компиляцией прошивки надо открыть файл конфигурации config.h и прописать в нём смещения

#define LCD_DELTA_X 2
#define LCD_DELTA_Y 1

Если есть “мусорные” столбцы, то надо подсчитать их количество и указать его в LCD_DELTA_X. Количество “мусорных” строк, соответственно, задаётся в LCD_DELTA_Y. После того, как эти смещения будут правильно настроены, картинка встанет на своё место.

Также в файле config.h можно настроить скорость UART (UART_BAUD_RATE), яркость посдсветки дисплея, чувствительность клавиатуры, громкость биппера и время автовыключения подсветки дисплея. Но можно оставить всё как есть, т.к. все эти параметры можно будет изменить потом, вызывая соответствующие методы модуля.

Для компиляции прошивки я, как обычно, использовую свою утилиту. А для заливки прошивки – связку usbasp + avrdude. Фьюзы и прошивка записываются командой:

avrdude -P usb -c usbasp -b 57600 -p ATmega328P -qq -U lfuse:w:0xff:m -U efuse:w:0xfc:m -U hfuse:w:0xd3:m

Для того, чтобы поиграться с модулем, проще всего подключить его к компьютеру через переходник usb-to-uart и использовать библиотеку на питоне. Для этого понадобится интерпретатор питона (версии 2.7) и библиотека работы с последовательным потртом pyserial. Установить последнюю можно командой

python -m pip install pyserial

Модуль работает по интерфейсу UART используя простой двоичный протокол обмена – управляющая программа сначала передаёт однобайтовый код команды, затем, её аргументы. На некоторые команды модуль посылает свой ответ (например на запрос состояния клавиатуры read_keyboard()или команду sync()). Протокол обмена реализован в классе Dislplay.

Примеры работы с дисплеем можно посмотреть тут. Сначала создаётся объект Display:

dev = Display('/dev/tty.wchusbserial14230', 57600)

где конструктор получает имя последовательного порта и скорость обмена (должна совпадать со скоростью, указанной в config.h). Узнать список доступных в системе последовательных портов, можно запустив скрипт serial_list.py.

Функции работы с дисплеем можно разделить на следующие группы:

Настройка параметров модуля

set_backlight_time(val16) set_backlight_level_high(level) set_backlight_level_low(level) set_keyboard_beep(enable) set_beeper_volume(volume)

Эти методы служат для изменения различных параметров модуля (значения по умолчанию которых заданы в config.h)

Управление биппером

beep(freq, duration)

На момент написания этой статьи тут только один метод – воспроизведение звука частотой freq (задаваемой в Герцах, uint16) длительностью duration (задаваемой в сотых долях секунды, uint8). В будущем сюда просится второй метод – play_melody для воспроизведения последовательности звуков (пока не реализовано).

Рисование

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

set_string_interval_x(interval) set_string_interval_y(interval) set_color(color) set_background(background) set_font(font)

Значения цветов – 16-битные, в формате RGB565, тут есть утилитка для работы с ними.

Рисовать можно от графических примитивов, до готовых элементов управления. Некоторые методы рисования примитивов существуют в двух экземплярах – с использованием цветов по умолчанию и с их явным указанием. Для рисования символов и строк есть группа методов draw_ и группа методов fill_.

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

Если рисуется какой-то объект, то лучше сделать это в один проход, вместо того, чтобы сначала очищать фон, а потом отдельно выполнять рисование.

fill_screen(color) fill_rect_by(x, y, w, h, color) fill_rect(x, y, w, h) draw_pixel(x, y) draw_line_by(x0, y0, x1, y1, color) draw_line(x0, y0, x1, y1) draw_line_to(x, y) draw_rect_by(x, y, w, h, color) draw_rect(x, y, w, h) draw_rect_thick_by(x, y, w, h, tx, ty, color) draw_rect_thick(x, y, w, h, tx, ty) draw_circle_by(x, y, r, color) draw_circle(x, y, r) fill_circle_by(x, y, r, color) fill_circle(x, y, r) draw_char(ch) draw_char_xy(x, y, ch) draw_string(s) draw_string_xy(x, y, s, anchor) fill_char(ch) fill_char_xy(x, y, ch) fill_string(s): fill_string_xy(x, y, s, anchor) draw_progress_bar(x, y, w, h, progress) draw_vertical_scrollbar(x, y, width, height, item_index, number_of_items, interval)

Прочие методы

sync(val) read_keyboard() get_version() start_bootloader()

Из оставшихся методов следует особо выделить метод sync(uint8). Он передаёт в порт один байт, затем дожидается ответа и возвращает его. В ответ модуль возвращает прочитанный байт, т.е., метод sync(val) должен вернуть значение val.

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

, при получении он сначала помещает их в буфер (размер которго, кстати, определяется макросом UART_RX_BUFFER_SIZE), затем, по мере появления свободного времени, выполняет. Т.е., например, после завершения вызова метода fill_circle_by(…) на экране ещё совсем не не обязательно, появится круг, но запрос на его отрисовку будет поставлен в очередь задач.

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

Метод read_keyboard() читает состояние клавиатуры. Если нажатых клавиш нет, он вернёт None. Иначе – массив из пяти элементов с длительностями удержания клавиш нажатыми.

Метод start_bootloader() передаёт управление загрузчику микроконтроллера. Нужен для обновления прошивки модуля без программатора (если в микроконтроллере этот загрузчик есть).

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

Фьюзы:

Источник: http://trolsoft.ru/ru/sch/avr-lcd-module-128×128

Обзор дисплея 128х160 точек с контроллером ST7735

Обнаружен блокировщик рекламы. Сайт Паяльник существует только за счет рекламы, поэтому мы были бы Вам благодарны если Вы внесете сайт в список исключений. Как это сделать? x ГлавнаяМикроконтроллеры Призовой фонд
на сентябрь 2018 г. 1. 1000 руб. Neru5 2. Регулируемый паяльник 60 Вт Паяльник 3. 200 руб. От пользователей присоединиться

Мультиметр DT9205A Купить 10 $Набор начинающего радиолюбителя Купить 12 $Набор 4WD Kit Bluetooth Купить 100 $

Всем привет. Сегодня речь пойдет о дисплейном модуле  который можно приобрести на просторах китайских (и не только) магазинов примерно за 200-300р. Выглядит он вот так:

Ну ничего особенного: плата, дисплей, разъем для SD карточки. Пройдемся по ТТХ данного модуля:

  • Разрешение: 128х160;
  • Количество цветов: 262000;
  • Режимы цветового пространства: RGB444, RGB565, RGB888;
  • Напряжение питания: 5В (можно подавать и 3,3В, если запаять перемычку возле стабилизатора на плате);
  • Интерфейс подключения: SPI + служебные входы;
  • Управляющий контроллер: ST7735;
  • Размер модуля: 58х34,5 мм;
  • Размер активной области дисплея: 35х28 мм;

Настало время попытаться что-нибудь вывести на экран. Подключать мы его будем к STM32F103. Для подключения требуется 5 выводов (вообще-то у ST7735 есть и параллельный интерфейс, но тут выведен лишь SPI): SDA (MOSI), SCK, CS, A0 (RS), RESET. Ну и питание с подсветкой. Я сразу закатал дисплей в то устройство, где он будет использоваться. Уж очень хотелось проверить, как он туда становится.

С управлением все просто. Все отправляемые на дисплей данные делятся на два типа: команды и данные. Выбор осуществляется при помощи вывода A0 (RS). Когда вывод в высоком уровне дисплей воспринимает получаемую информацию, как данные. В противном случае – как команды. Т.е.

управление предельно простое, главное не забывать вовремя дергать выводы RS и CS. А прочтение даташита на управляющий контроллер показало, что система команд до безобразия простая. Серьезно. Из всех цветных дисплеев, прошедших через мои руки, у данного экземпляра самая простая инициализация.

Требуется всего 6 команд:

Send_CMD(0x01); _delay_ms(12); Send_CMD(0x11); _delay_ms(12); Send_CMD(0x3A); Send_DAT(0x05); Send_CMD(0x36); Send_DAT(0xA0); Send_CMD(0xB1); Send_DAT16(0x000F); Send_DAT16(0x000F); Send_DAT16(0x000F); Send_CMD(0x29);

Рассмотрим каждую из них подробнее:

  • 0x01 Программный сброс. При наличии аппаратного сброса команда необязательна;
  • 0x11 Выход из режима сна;
  • 0x3A Формат цифрового пространства. После команды передается 1 байт данных, в котором 3 первых бита используются для задания формата (011 – RGB444, 101 – RGB565, 110 – RGB666);
  • 0x36 Режим отрисовки данных из памяти дисплея. Проще говоря – ориентация. Работает аналогично предыдущей команде. Передается команда, а следом 1 байт данных, отвечающих за настройку.
  • 0xB1 Частота обновления дисплея. В принципе тоже необязательная команда, но без нее дисплей работает на минимальной частоте и видно мерцание. Здесь для настройки параметров используется целых 3 байта данных.
  • 0x29 Собственно, включение дисплея. Сразу после получения этой команды, дисплей должен залиться цветным шумом.

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

Send_CMD(0x2C);

После этого, все отправленные по SPI данные будут интерпретироваться как графические и выводиться на экран. Действие команды прекращается после перевода линии CS в высокий уровень. При записи в память адрес автоматически инкрементируется.

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

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

С адресацией дисплей разберется сам. Для установки окна есть 2 команды:

Send_CMD(0x2A); Send_DAT(0x00); Send_DAT(startX); Send_DAT(0x00); Send_DAT(stopX); Send_CMD(0x2B); Send_DAT(0x00); Send_DAT(startY); Send_DAT(0x00); Send_DAT(stopY);

Каждая координата имеет размерность 16 бит, но разрешение дисплея всего 160х128, поэтому старшую половину можно смело записывать нулями. Теперь у нас есть все, что требуется для вывода любого изображения.

Осталось написать функции для отрисовки графических примитивов и шрифтов. Функция вывода текста оптимизирована для работы со шрифтами с сайта http://www.rinkydinkelectronics.com/r_fonts.

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

Для вывода текста служит функция:

LCD_PutString_(uint8_t x, uint8_t y, char *c, uint16_t T_color, uint16_t B_color, uint8_t space, uint8_t *font)

Тут все просто, указываем координаты начала строки, сам выводимый текст, цвет текста, цвет фона, размер пробела между символами и название шрифта. Получаем что-то вроде этого (тут у меня уже готовый интерфейс отрисован):

Яркости хватает с запасом.

Углы обзора у дисплея довольно неплохие, но, увы, только с двух сторон. Поэтому при установке дисплея в устройство необходимо продумать, как на него будут смотреть:

Можно вывести и картинку, для этого есть функция :

LCD_Image(uint8_t x, uint8_t y, int const *img, uint16_t w, uint16_t h);

Указываем координаты начала вывода, ссылку на массив с изображением, ширину и высоту картинки. И вуаля:

Теперь о скорости работы. У STM32F103 SPI тактируется от 32 МГц максимум, что дает скорость передачи данных 16 МБит (в случае непрерывного потока). Т.е. 2 мегабайта в секунду, что позволяет очень быстро заполнить память дисплея (40Кб для RGB 565) В результате заливка происходит практически незаметно для глаза, а вывод текста и примитивов вообще шикарно.

Если же подключить дисплей к тому же AVR МК, то все будет гораздо медленнее. Тактирование 8МГц при максимальной частоте ядра в 16МГц, что дает всего 4Мбит, а значит 500Кб в секудну. В реальности скорость будет еще ниже, т.к. непрерывно лить данные AVR не умеет. Т.е. заливка будет длиться что-то около 100мс.

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

На этом, пожалуй, все. Дисплей понравился, неплохая яркость и цветопередача, простая настройка и подключение с использованием малого количества выводов МК. Самое то для всевозможных самоделок.

Библиотеку для работы с дисплеем прикладываю. Передача данных не имеет привязки к конкретному МК. Для применения библиотеки с другим типом МК достаточно заменить наполнение функций Send_DAT, Send_DAT16, Send_CMD.

Ну и небольшое видео напоследок.

Прикрепленные файлы:

Источник: https://readtiger.com/cxem.net/mc/mc449.php

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