{"id":51152340,"url":"https://github.com/octaprog7/vfd-display-2x20","last_synced_at":"2026-06-26T07:02:36.610Z","repository":{"id":358512635,"uuid":"1240929030","full_name":"octaprog7/vfd-display-2x20","owner":"octaprog7","description":"Lightweight Python 3.10+ library to control 2x20 VFD customer displays using EPSON protocol under Linux (Debian/Ubuntu) with full Cyrillic support.","archived":false,"fork":false,"pushed_at":"2026-05-17T17:48:35.000Z","size":2145,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-05-17T19:49:39.633Z","etag":null,"topics":["debian","diy","epson","esc-pos","linux","pos-display","pyserial","vfd","vfd-display"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/octaprog7.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-16T18:44:10.000Z","updated_at":"2026-05-17T17:48:38.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/octaprog7/vfd-display-2x20","commit_stats":null,"previous_names":["octaprog7/vfd-display-2x20"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/octaprog7/vfd-display-2x20","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/octaprog7%2Fvfd-display-2x20","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/octaprog7%2Fvfd-display-2x20/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/octaprog7%2Fvfd-display-2x20/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/octaprog7%2Fvfd-display-2x20/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/octaprog7","download_url":"https://codeload.github.com/octaprog7/vfd-display-2x20/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/octaprog7%2Fvfd-display-2x20/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34806448,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-26T02:00:06.560Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["debian","diy","epson","esc-pos","linux","pos-display","pyserial","vfd","vfd-display"],"created_at":"2026-06-26T07:02:35.850Z","updated_at":"2026-06-26T07:02:36.596Z","avatar_url":"https://github.com/octaprog7.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# VFD Customer Display Driver (2x20)\n\nБиблиотека на Python 3.10+ для управления вакуумно-флуоресцентными (VFD) текстовыми дисплеями покупателя с сеткой символов 2x20 в операционных системах семейства Linux (Debian, Ubuntu, Mint).\n\nПроект предназначен для вывода любой текстовой информации, системных логов, статусов автоматизации или создания кастомных мониторов ресурсов (CPU/RAM).\n\n## Возможности\n* Полная поддержка кириллицы: Автоматическая перекодировка UTF-8 строк в кодовую страницу дисплея (CP866).\n* Синхронизированный буфер: Библиотека хранит состояние экрана в памяти для корректного обновления.\n* Удобный синтаксис: Поддержка обращения к строкам через индексы (vfd[0] = \"Текст\").\n* Контекстный менеджер: Автоматическое открытие и безопасное закрытие последовательного порта (with).\n* Встроенный Meter (Progress Bar): Готовый инструмент для отрисовки горизонтальных графиков (например, уровня загрузки) ровно на 20 символов строки.\n\n## Требования к системе\n* ОС: Linux Debian / Ubuntu\n* Python: Версия 3.10 или выше\n* Зависимости: Модуль pyserial\n\n## Установка и настройка порта\n\n1. Клонируйте репозиторий или скопируйте файлы проекта.\n2. Установите зависимость для работы с COM-портом:\n   ```bash\n   pip install pyserial\n   ```\n3. При подключении дисплея к ПК устройство обычно регистрируется как /dev/ttyUSB0 (или /dev/ttyACM0). \n4. Важно: По умолчанию доступ к портам tty имеет только root. Чтобы запускать скрипт без sudo, добавьте своего пользователя в группу dialout:\n   ```bash\n   sudo usermod -a -G dialout $USER\n   ```\n   *После этого необходимо перезагрузить систему или перезайти в сессию.*\n\n## Пример использования\n\nСоздайте файл main.py и используйте следующий код для вывода информации:\n\n```python\nimport time\nfrom VFDmod import VfdDisplay, SerialConn\n\n# Путь к порту в Debian\nPORT = '/dev/ttyUSB0'\n\ntry:\n    # Инициализация транспорта и дисплея через контекстный менеджер\n    with VfdDisplay(SerialConn(PORT, baud_rate=9600)) as vfd:\n        vfd.initialize()  # Сброс дисплея и принудительное включение кириллицы\n        vfd.clear()       # Очистка экрана\n\n        # 1. Запись в строки через индексы (0 - верхняя, 1 - нижняя)\n        vfd[0] = \"Система Debian\"\n        vfd[1] = \"Статус: Ок\"\n        time.sleep(3)\n\n        # 2. Использование встроенного индикатора выполнения (Progress Bar)\n        vfd.meter(label=\"CPU\", value=45.5, index=0)\n        vfd.meter(label=\"RAM\", value=82.0, index=1)\n        \n        print(\"Данные успешно отправлены на дисплей. Нажмите Ctrl+C для выхода.\")\n        while True:\n            time.sleep(1)\n\nexcept KeyboardInterrupt:\n    print(\"\\nПрограмма завершена.\")\nexcept Exception as e:\n    print(f\"\\nОшибка: {e}\")\n    print(\"Проверьте физическое подключение кабеля и права доступа к порту.\")\n```\n\n## Структура классов\n* SerialConn - отвечает за стабильное соединение с портом, обертку над pyserial и отправку сырых байт.\n* POSDisplay - абстрактный класс, задающий логику двустрочного текстового буфера (размер сетки 2x20) и форматирование строк.\n* EpsonProtocol - низкоуровневая реализация базовых команд управления курсором и очисткой.\n* VfdDisplay - высокоуровневый класс для конечного пользователя (локализация, кодовые таблицы, метод meter).\n\n## Demo\n\nВот небольшая шутка, отображаемая на экране для проверки работы и поддержки кириллической кодировки:\n\n![Customer Humor](pics/customer_humor.JPG)\n\n## Почему именно этот проект?\n\nВ отличие от громоздких библиотек для кассовых терминалов (например, `python-escpos`), этот проект создан для DIY-разработчиков:\n\n* **Ничего лишнего (Zero-Overhead):** Максимально легкий код без тяжелых зависимостей и функций для печати чеков или генерации штрихкодов.\n* **Чистая архитектура:** Логика протокола полностью отделена от транспортного уровня. Это позволит в будущем легко адаптировать либу под новые платформы.\n* **Синтаксический сахар:** Обращение через индексы (`vfd[0] = \"Текст\"`) автоматически берет на себя управление курсором и дополнение строки пробелами.\n* **Готовый мониторинг:** Функция `vfd.meter()` позволяет без лишних математических расчетов превратить дисплей в аккуратную панель статуса.\n\n## Особенности аппаратной поддержки и интерфейсы\n\nПри работе с различными моделями дисплеев покупателя (включая популярные китайские VFD) важно учитывать специфику их микропрограмм (прошивок):\n\n* **Интерфейс подключения:** Проект ориентирован на работу через **USB (в режиме эмуляции Virtual COM-порта)** или физический интерфейс **UART (RS-232)** с использованием библиотеки `pyserial`.\n* **Аппаратное мигание и яркость:** Функции аппаратного изменения яркости, мигания экрана и заводского самотестирования (`self_test`) могут не работать! Многие дисплеи на рынке имеют урезанную поддержку протокола EPSON и игнорируют данные ESC-последовательности, либо требуют переключения физических DIP-переключателей на плате под другие протоколы (например, CD5220).\n\n## Где взять такой дисплей?\n\nПроект идеально подходит для вторичного использования оборудования. \nИз-за массового переоснащения торговых организаций новыми кассовыми системами, старые и надежные вакуумно-флуоресцентные дисплеи покупателя массово списываются. \nИх можно за бесценок найти на площадках вторичного рынка (Авито, Юла) или на радиорынках. Это отличный способ подарить вторую жизнь качественному промышленному железу, превратив его в кастомный монитор для домашнего сервера или умного дома.\n\n**Предупреждение:** Пожалуйста, не ломитесь все сразу на А...о и не скупайте, с горящими глазами, VFD пачками! Давайте держать баланс спроса, чтобы продавцы/перекупщики не взвинтили цены до небес. Оставьте пару штук другим DIY-мэнам.\n\n*Примечание об оптическом эффекте:* В реальности дисплей светится зелено-бирюзовым цветом. Эффект неоново-синего свечения на фотографии — это результат особенности цветопередачи матрицы камеры смартфона при съемке VFD-люминофора.\n\n## Порт подключения\n1. Дисплей покупателя (ДП) ОТКЛЮЧЕН от ПК.\n2. В консоли вводите команду: ls /dev/tty*\n3. Результат выполнения команды: \n```console\n/dev/tty    /dev/tty19  /dev/tty3   /dev/tty40  /dev/tty51  /dev/tty62\n/dev/tty0   /dev/tty2   /dev/tty30  /dev/tty41  /dev/tty52  /dev/tty63\n/dev/tty1   /dev/tty20  /dev/tty31  /dev/tty42  /dev/tty53  /dev/tty7\n/dev/tty10  /dev/tty21  /dev/tty32  /dev/tty43  /dev/tty54  /dev/tty8\n/dev/tty11  /dev/tty22  /dev/tty33  /dev/tty44  /dev/tty55  /dev/tty9\n/dev/tty12  /dev/tty23  /dev/tty34  /dev/tty45  /dev/tty56  /dev/ttyS0\n/dev/tty13  /dev/tty24  /dev/tty35  /dev/tty46  /dev/tty57  /dev/ttyS1\n/dev/tty14  /dev/tty25  /dev/tty36  /dev/tty47  /dev/tty58  /dev/ttyS2\n/dev/tty15  /dev/tty26  /dev/tty37  /dev/tty48  /dev/tty59  /dev/ttyS3\n/dev/tty16  /dev/tty27  /dev/tty38  /dev/tty49  /dev/tty6\n/dev/tty17  /dev/tty28  /dev/tty39  /dev/tty5   /dev/tty60\n/dev/tty18  /dev/tty29  /dev/tty4   /dev/tty50  /dev/tty61\n```\n4. Подключаете ДП в разъем USB ПК.\n5. В консоли вводите команду: ls /dev/tty*\n6. Результат выполнения команды: \n```console\n/dev/tty    /dev/tty19  /dev/tty3   /dev/tty40  /dev/tty51  /dev/tty62\n/dev/tty0   /dev/tty2   /dev/tty30  /dev/tty41  /dev/tty52  /dev/tty63\n/dev/tty1   /dev/tty20  /dev/tty31  /dev/tty42  /dev/tty53  /dev/tty7\n/dev/tty10  /dev/tty21  /dev/tty32  /dev/tty43  /dev/tty54  /dev/tty8\n/dev/tty11  /dev/tty22  /dev/tty33  /dev/tty44  /dev/tty55  /dev/tty9\n/dev/tty12  /dev/tty23  /dev/tty34  /dev/tty45  /dev/tty56  /dev/ttyS0\n/dev/tty13  /dev/tty24  /dev/tty35  /dev/tty46  /dev/tty57  /dev/ttyS1\n/dev/tty14  /dev/tty25  /dev/tty36  /dev/tty47  /dev/tty58  /dev/ttyS2\n/dev/tty15  /dev/tty26  /dev/tty37  /dev/tty48  /dev/tty59  /dev/ttyS3\n/dev/tty16  /dev/tty27  /dev/tty38  /dev/tty49  /dev/tty6   /dev/ttyUSB0\n/dev/tty17  /dev/tty28  /dev/tty39  /dev/tty5   /dev/tty60\n/dev/tty18  /dev/tty29  /dev/tty4   /dev/tty50  /dev/tty61\n```\n\nВидите разницу!? Это и есть имя порта ДП, подключенного к ПК.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foctaprog7%2Fvfd-display-2x20","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foctaprog7%2Fvfd-display-2x20","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foctaprog7%2Fvfd-display-2x20/lists"}