An open API service indexing awesome lists of open source software.

https://github.com/octaprog7/vfd-display-2x20

Lightweight Python 3.10+ library to control 2x20 VFD customer displays using EPSON protocol under Linux (Debian/Ubuntu) with full Cyrillic support.
https://github.com/octaprog7/vfd-display-2x20

debian diy epson esc-pos linux pos-display pyserial vfd vfd-display

Last synced: 7 days ago
JSON representation

Lightweight Python 3.10+ library to control 2x20 VFD customer displays using EPSON protocol under Linux (Debian/Ubuntu) with full Cyrillic support.

Awesome Lists containing this project

README

          

# VFD Customer Display Driver (2x20)

Библиотека на Python 3.10+ для управления вакуумно-флуоресцентными (VFD) текстовыми дисплеями покупателя с сеткой символов 2x20 в операционных системах семейства Linux (Debian, Ubuntu, Mint).

Проект предназначен для вывода любой текстовой информации, системных логов, статусов автоматизации или создания кастомных мониторов ресурсов (CPU/RAM).

## Возможности
* Полная поддержка кириллицы: Автоматическая перекодировка UTF-8 строк в кодовую страницу дисплея (CP866).
* Синхронизированный буфер: Библиотека хранит состояние экрана в памяти для корректного обновления.
* Удобный синтаксис: Поддержка обращения к строкам через индексы (vfd[0] = "Текст").
* Контекстный менеджер: Автоматическое открытие и безопасное закрытие последовательного порта (with).
* Встроенный Meter (Progress Bar): Готовый инструмент для отрисовки горизонтальных графиков (например, уровня загрузки) ровно на 20 символов строки.

## Требования к системе
* ОС: Linux Debian / Ubuntu
* Python: Версия 3.10 или выше
* Зависимости: Модуль pyserial

## Установка и настройка порта

1. Клонируйте репозиторий или скопируйте файлы проекта.
2. Установите зависимость для работы с COM-портом:
```bash
pip install pyserial
```
3. При подключении дисплея к ПК устройство обычно регистрируется как /dev/ttyUSB0 (или /dev/ttyACM0).
4. Важно: По умолчанию доступ к портам tty имеет только root. Чтобы запускать скрипт без sudo, добавьте своего пользователя в группу dialout:
```bash
sudo usermod -a -G dialout $USER
```
*После этого необходимо перезагрузить систему или перезайти в сессию.*

## Пример использования

Создайте файл main.py и используйте следующий код для вывода информации:

```python
import time
from VFDmod import VfdDisplay, SerialConn

# Путь к порту в Debian
PORT = '/dev/ttyUSB0'

try:
# Инициализация транспорта и дисплея через контекстный менеджер
with VfdDisplay(SerialConn(PORT, baud_rate=9600)) as vfd:
vfd.initialize() # Сброс дисплея и принудительное включение кириллицы
vfd.clear() # Очистка экрана

# 1. Запись в строки через индексы (0 - верхняя, 1 - нижняя)
vfd[0] = "Система Debian"
vfd[1] = "Статус: Ок"
time.sleep(3)

# 2. Использование встроенного индикатора выполнения (Progress Bar)
vfd.meter(label="CPU", value=45.5, index=0)
vfd.meter(label="RAM", value=82.0, index=1)

print("Данные успешно отправлены на дисплей. Нажмите Ctrl+C для выхода.")
while True:
time.sleep(1)

except KeyboardInterrupt:
print("\nПрограмма завершена.")
except Exception as e:
print(f"\nОшибка: {e}")
print("Проверьте физическое подключение кабеля и права доступа к порту.")
```

## Структура классов
* SerialConn - отвечает за стабильное соединение с портом, обертку над pyserial и отправку сырых байт.
* POSDisplay - абстрактный класс, задающий логику двустрочного текстового буфера (размер сетки 2x20) и форматирование строк.
* EpsonProtocol - низкоуровневая реализация базовых команд управления курсором и очисткой.
* VfdDisplay - высокоуровневый класс для конечного пользователя (локализация, кодовые таблицы, метод meter).

## Demo

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

![Customer Humor](pics/customer_humor.JPG)

## Почему именно этот проект?

В отличие от громоздких библиотек для кассовых терминалов (например, `python-escpos`), этот проект создан для DIY-разработчиков:

* **Ничего лишнего (Zero-Overhead):** Максимально легкий код без тяжелых зависимостей и функций для печати чеков или генерации штрихкодов.
* **Чистая архитектура:** Логика протокола полностью отделена от транспортного уровня. Это позволит в будущем легко адаптировать либу под новые платформы.
* **Синтаксический сахар:** Обращение через индексы (`vfd[0] = "Текст"`) автоматически берет на себя управление курсором и дополнение строки пробелами.
* **Готовый мониторинг:** Функция `vfd.meter()` позволяет без лишних математических расчетов превратить дисплей в аккуратную панель статуса.

## Особенности аппаратной поддержки и интерфейсы

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

* **Интерфейс подключения:** Проект ориентирован на работу через **USB (в режиме эмуляции Virtual COM-порта)** или физический интерфейс **UART (RS-232)** с использованием библиотеки `pyserial`.
* **Аппаратное мигание и яркость:** Функции аппаратного изменения яркости, мигания экрана и заводского самотестирования (`self_test`) могут не работать! Многие дисплеи на рынке имеют урезанную поддержку протокола EPSON и игнорируют данные ESC-последовательности, либо требуют переключения физических DIP-переключателей на плате под другие протоколы (например, CD5220).

## Где взять такой дисплей?

Проект идеально подходит для вторичного использования оборудования.
Из-за массового переоснащения торговых организаций новыми кассовыми системами, старые и надежные вакуумно-флуоресцентные дисплеи покупателя массово списываются.
Их можно за бесценок найти на площадках вторичного рынка (Авито, Юла) или на радиорынках. Это отличный способ подарить вторую жизнь качественному промышленному железу, превратив его в кастомный монитор для домашнего сервера или умного дома.

**Предупреждение:** Пожалуйста, не ломитесь все сразу на А...о и не скупайте, с горящими глазами, VFD пачками! Давайте держать баланс спроса, чтобы продавцы/перекупщики не взвинтили цены до небес. Оставьте пару штук другим DIY-мэнам.

*Примечание об оптическом эффекте:* В реальности дисплей светится зелено-бирюзовым цветом. Эффект неоново-синего свечения на фотографии — это результат особенности цветопередачи матрицы камеры смартфона при съемке VFD-люминофора.

## Порт подключения
1. Дисплей покупателя (ДП) ОТКЛЮЧЕН от ПК.
2. В консоли вводите команду: ls /dev/tty*
3. Результат выполнения команды:
```console
/dev/tty /dev/tty19 /dev/tty3 /dev/tty40 /dev/tty51 /dev/tty62
/dev/tty0 /dev/tty2 /dev/tty30 /dev/tty41 /dev/tty52 /dev/tty63
/dev/tty1 /dev/tty20 /dev/tty31 /dev/tty42 /dev/tty53 /dev/tty7
/dev/tty10 /dev/tty21 /dev/tty32 /dev/tty43 /dev/tty54 /dev/tty8
/dev/tty11 /dev/tty22 /dev/tty33 /dev/tty44 /dev/tty55 /dev/tty9
/dev/tty12 /dev/tty23 /dev/tty34 /dev/tty45 /dev/tty56 /dev/ttyS0
/dev/tty13 /dev/tty24 /dev/tty35 /dev/tty46 /dev/tty57 /dev/ttyS1
/dev/tty14 /dev/tty25 /dev/tty36 /dev/tty47 /dev/tty58 /dev/ttyS2
/dev/tty15 /dev/tty26 /dev/tty37 /dev/tty48 /dev/tty59 /dev/ttyS3
/dev/tty16 /dev/tty27 /dev/tty38 /dev/tty49 /dev/tty6
/dev/tty17 /dev/tty28 /dev/tty39 /dev/tty5 /dev/tty60
/dev/tty18 /dev/tty29 /dev/tty4 /dev/tty50 /dev/tty61
```
4. Подключаете ДП в разъем USB ПК.
5. В консоли вводите команду: ls /dev/tty*
6. Результат выполнения команды:
```console
/dev/tty /dev/tty19 /dev/tty3 /dev/tty40 /dev/tty51 /dev/tty62
/dev/tty0 /dev/tty2 /dev/tty30 /dev/tty41 /dev/tty52 /dev/tty63
/dev/tty1 /dev/tty20 /dev/tty31 /dev/tty42 /dev/tty53 /dev/tty7
/dev/tty10 /dev/tty21 /dev/tty32 /dev/tty43 /dev/tty54 /dev/tty8
/dev/tty11 /dev/tty22 /dev/tty33 /dev/tty44 /dev/tty55 /dev/tty9
/dev/tty12 /dev/tty23 /dev/tty34 /dev/tty45 /dev/tty56 /dev/ttyS0
/dev/tty13 /dev/tty24 /dev/tty35 /dev/tty46 /dev/tty57 /dev/ttyS1
/dev/tty14 /dev/tty25 /dev/tty36 /dev/tty47 /dev/tty58 /dev/ttyS2
/dev/tty15 /dev/tty26 /dev/tty37 /dev/tty48 /dev/tty59 /dev/ttyS3
/dev/tty16 /dev/tty27 /dev/tty38 /dev/tty49 /dev/tty6 /dev/ttyUSB0
/dev/tty17 /dev/tty28 /dev/tty39 /dev/tty5 /dev/tty60
/dev/tty18 /dev/tty29 /dev/tty4 /dev/tty50 /dev/tty61
```

Видите разницу!? Это и есть имя порта ДП, подключенного к ПК.