Skip to content

Repository files navigation

CYD Display for PureBasic

Русский | English

Русский

CYD Display превращает поддерживаемые платы ESP32-CYD в полноценное периферийное устройство 320x240 для программ на PureBasic.

Текущая версия: 0.27.0.

Поддерживаемые платы

Плата MCU Экран и touch Профиль
FNK0103L ESP32 ST7789, XPT2046 CYD_PROFILE_FNK0103L (CYD_PROFILE_FNK0103L_ROTATED_180 — та же плата, повёрнутая установка)
ESP32-024 ESP32 ST7789, XPT2046 CYD_PROFILE_ESP32_024
ESP32-2432S028 ESP32 ILI9341, XPT2046 CYD_PROFILE_ESP32_2432S028
ES3C28P ESP32-S3 ILI9341, FT6336, ES8311 CYD_PROFILE_ES3C28P
JC3248W535 ESP32-S3 AXS15231B QSPI, AXS15231B touch CYD_PROFILE_JC3248W535

Возможности

  • вывод кадрового буфера RGB565 и capability порядка BGR для аппаратных графических примитивов;
  • буферизованное рисование в разрешении 320x240 или 240x320;
  • передача только изменившегося прямоугольника;
  • прямые примитивы и встроенный текст на ESP32 без передачи кадрового буфера;
  • автономная прокрутка на стороне устройства примерно с 30 FPS;
  • автономные элементы часов, даты и таймера обратного отсчёта;
  • системные шрифты и загрузка изображений на компьютере;
  • создание центрированных QR-кодов, включая текст UTF-8;
  • события XPT2046: нажатие, перемещение и отпускание;
  • управляемая прошивкой четырёхточечная калибровка touch с хранением в NVS;
  • тон, автономные RTTTL-подобные мелодии и моно PCM без знака 8 бит на GPIO26, с управлением штатным усилителем там, где оно предусмотрено профилем;
  • FAT32 SD, загрузка файлов по COM-порту, автономные GIF и MP3 с управлением паузой, продолжением и остановкой;
  • просмотр каталога SD, скачивание и удаление файлов;
  • PWM-управление штатным RGB-светодиодом;
  • сканирование Wi-Fi с SSID, BSSID, RSSI, каналом и типом шифрования;
  • синхронные touch-вопросы с центрированным текстом и 1–6 кнопками;
  • двусторонние пакеты с CRC на скорости 921600 бод.

Старый протокол WeAct не используется.

Структура проекта

  • PROGRAMMER_GUIDE.md — полное руководство по API PureBasic;
  • PROTOCOL.md — описание протокола CYD/1;
  • ../../PUREBASIC_PROJECT_KNOWLEDGE.md — проверенные правила PureBasic;
  • ../../Release — готовые программы и прошивки;
  • ../../GitHub — подготовленная публичная копия;
  • firmware/CYD_Display_Firmware — прошивка Arduino ESP32;
  • purebasic/CYD_Display.pbi — подключаемая библиотека PureBasic;
  • purebasic/CYD_Demo.pb — пример экрана, touch, калибровки и звука;
  • purebasic/CYD_Calibrate.pb — интерактивная калибровка touch;
  • purebasic/CYD_GraphicsDemo.pb — текст, примитивы и виджеты;
  • purebasic/CYD_FastGraphicsDemo.pb — быстрые примитивы и автономный скролл;
  • purebasic/CYD_CLI.pb — консольное управление экраном, графикой и звуком;
  • purebasic/CYD_CLI_readme.md — синтаксис и примеры CLI;
  • purebasic/CYD_AudioTest.pb — проверка тона и PCM на максимальной громкости;
  • CYD_CLI_DogWaltz.cmd — готовая мелодия «Собачий вальс» для CLI;
  • purebasic/CYD_GIFPlayer.pb — загрузка и автономное воспроизведение GIF;
  • purebasic/CYD_MP3Player.pb — загрузка и управление MP3 на SD;
  • purebasic/CYD_SmokeTest.pb — автоматическая проверка экрана и звука;
  • programs/CYD_CPUMonitor/ — автономный Windows-монитор CPU, GPU и сети со всеми исходниками, зависимостями, ресурсами и документацией.

Аппаратные профили

Полная конфигурация плат находится в firmware/CYD_Display_Firmware/CYD_HardwareConfig.h. Значение CYD_ACTIVE_PROFILE выбирается из:

  • CYD_PROFILE_FNK0103L — исходный проверенный профиль FNK0103L;
  • CYD_PROFILE_FNK0103L_ROTATED_180 — FNK0103L с начальным поворотом на 180°;
  • CYD_PROFILE_ESP32_024 — ESP32-024 с ST7789 и touch IRQ36;
  • CYD_PROFILE_ES3C28P — ESP32-S3 с ILI9341, ёмкостным FT6336, WS2812 и аудиокодеком ES8311.
  • CYD_PROFILE_JC3248W535 — ESP32-S3 с AXS15231B 320×480 по QSPI и ёмкостным AXS15231B touch по I²C.

Профили ESP32/FNK используют ST7789 240x320 в ориентации 320x240, общую шину HSPI GPIO12/13/14 для TFT и XPT2046, TFT CS15/DC2, touch CS33, отдельную шину VSPI GPIO18/19/23 для SD с CS5, подсветку GPIO27 и аудио DAC GPIO26. Частота и инверсия экрана, пространство калибровки, красный вывод RGB, touch IRQ и управление усилителем задаются профилем.

ES3C28P использует ILI9341 240x320, FT6336 по I²C, WS2812 на GPIO42 и ES8311 по I²S. Ёмкостный touch не требует четырёхточечной калибровки. SDIO монтируется при старте и доступен для файлов и MP3.

JC3248W535 использует AXS15231B 320x480 по QSPI: CS45, CLK47, D0/1/2/3 21/48/40/39, backlight GPIO1. Touch AXS15231B подключён по I²C SDA4/SCL8, адрес 0x3B, и не требует калибровки. Для ESP32-S3 обязательны 16 МБ flash и 8 МБ OPI PSRAM; последовательность инициализации панели — AXS15231B 320×480 type 1.

Для стабильного старта SD не монтируется автоматически; медиа-команды сообщают ERROR_SD_NOT_READY до отдельного подключения SD.

В исходниках активен CYD_PROFILE_ESP32_024. При проверке релиза компилируются все профили.

Типовой порядок работы в PureBasic

  1. Вызвать CYD_Open() для поиска на COM1…COM256 либо CYD_Open("COM5") для конкретного порта.
  2. Рисовать в кадровом буфере функциями CYD_ClearBuffer, CYD_FillRect, CYD_DrawLine, CYD_DrawText, CYD_DrawImage или CYD_DrawQRCode.
  3. Вызвать CYD_Flush() — будет отправлен только изменившийся прямоугольник.
  4. Вызывать CYD_GetEvent() из обычного цикла событий приложения.
  5. При отсутствии калибровки вызвать CYD_StartTouchCalibration() и коснуться четырёх показанных мишеней.
  6. При выходе вызвать CYD_Close().

CYD_PlayPCM() принимает монофонические 8-битные PCM-отсчёты без знака. Функция синхронно регулирует скорость передачи, защищая аудиобуфер ESP32. Для коротких уведомлений используется CYD_Tone().

Совместимая прокрутка с системными шрифтами выполняется повторными вызовами CYD_UpdateScrollText(), CYD_DrawScrollText(#True) и CYD_Flush(). Для быстрой анимации CYD_DeviceStartScrollText() один раз передаёт текст и параметры, после чего ESP32 формирует кадры самостоятельно.

Основной API PureBasic

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

  • CYD_Open(), CYD_Close(), CYD_IsConnected();
  • CYD_SetOrientation(), CYD_SetBrightness();
  • CYD_GetWidth(), CYD_GetHeight(), CYD_GetDeviceName(), CYD_GetPortName().

Буферизованное рисование:

  • CYD_RGB565(), CYD_ClearBuffer();
  • CYD_DrawPixel(), CYD_DrawLine(), CYD_DrawCircle();
  • CYD_DrawRect(), CYD_FillRect(), CYD_DrawTriangle();
  • CYD_DrawText(), CYD_DrawImage(), CYD_DrawQRCode();
  • CYD_DrawWrappedText(), CYD_DrawImageFullScreen();
  • CYD_DrawProgressBar(), CYD_DrawGraph(), CYD_DrawSpinner();
  • CYD_ShowTime(), CYD_ShowDate();
  • CYD_StartScrollText(), CYD_UpdateScrollText(), CYD_Flush().

Быстрая графика на стороне устройства:

  • CYD_HasDeviceGraphics(), CYD_HasDeviceScroll();
  • CYD_HasUTF8DeviceText();
  • CYD_HasDeviceBarChart();
  • CYD_UsesBGRDeviceGraphics();
  • CYD_DeviceDrawPixel(), CYD_DeviceDrawLine();
  • CYD_DeviceDrawRect(), CYD_DeviceFillRect();
  • CYD_DeviceDrawCircle(), CYD_DeviceDrawTriangle();
  • CYD_DeviceDrawText(), CYD_DeviceDrawUTF8TextArea(), CYD_DeviceDrawButton();
  • CYD_DeviceUpdateBarChart();
  • CYD_DeviceStartMatrix(), CYD_DeviceStopMatrix();
  • CYD_DeviceStartScrollText(), CYD_DeviceStopScrollText();
  • CYD_DeviceStartClock(), CYD_DeviceStopClock();
  • CYD_DeviceStartDate(), CYD_DeviceStopDate();
  • CYD_DeviceStartTimer(), CYD_DeviceWaitTimer(), CYD_DeviceStopTimer().

CYD_DeviceDrawText() использует компактный шрифт Adafruit для ASCII. Прошивка 0.11.0 добавляет CYD_DeviceDrawUTF8TextArea(): UTF-8 и кириллица рисуются на ESP32 встроенными шрифтами U8g2 без передачи растровой области. Для системных шрифтов Windows и сглаживания остаются CYD_DrawText() и CYD_Flush().

В версии 0.12.0 CYD_DeviceUpdateBarChart() передаёт массив значений 0…100 и цветов RGB565 одной командой. ESP32 хранит предыдущее измерение, обновляет только изменившиеся области и при необходимости рисует маркеры тенденции.

В версии 0.15.0 CYD_DeviceStartMatrix() запускает автономный Matrix-эффект на ESP32. Скорость, плотность и длина хвоста задаются один раз; после закрытия COM-порта анимация продолжает работать. CYD_DeviceStopMatrix() останавливает её и при необходимости очищает экран.

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

Версия 0.18.0 добавляет CYD_DeviceStartMatrixClock(): цифровые или перекидные часы, дата и день недели обновляются ESP32 поверх автономного Matrix-эффекта. Язык и отображение секунд задаются при запуске; постоянный COM-трафик не нужен.

Версия 0.19.0 добавляет CYD_DeviceStartClockSaver() для таких же автономных цифровых или перекидных часов без Matrix. В обоих часовых режимах секунды показываются только при ShowSeconds = #True.

В версии 0.22.0 GUI CYD_CPUMonitor переразмечен в вертикальные группы: подключение, источники данных, поведение, часы, экран и состояние. Настройки и живая статистика получили единую сетку подписей и более читаемые шрифты. Отсутствие калибровки сенсора больше не блокирует мониторинг: данные продолжают выводиться, а GUI сообщает, что переключение экранов касанием недоступно. Кнопка Калибровка запускает четырёхточечную процедуру непосредственно из монитора и включает касания сразу после успешного завершения.

В версии 0.24.0 прошивка отдельно сообщает, поддерживает ли контроллер четырёхточечную калибровку. Для ёмкостного FT6336 на ES3C28P кнопка Калибровка недоступна, а библиотека предоставляет проверки CYD_HasTouch() и CYD_HasTouchCalibration().

Версия 0.25.0 исправляет объявление порядка цветов ES3C28P: ILI9341 этого профиля принимает обычный RGB565, поэтому хост больше не меняет местами красный и синий каналы аппаратных примитивов и столбчатых графиков.

Версия 0.27.0 унифицирует набор команд прошивки для всех поддерживаемых профилей: GIF/MP3 с SD, состояние медиа, аудиокоманды, RGB и touch-калибровка остаются частью общего протокола, а профиль ограничивает только недоступное конкретной плате оборудование. ESP32-024 использует аудиовыход GPIO26 и не затрагивает GPIO4, занятый красным каналом RGB.

Clock и Date — независимо расположенные постоянные элементы ESP32. Компьютер передаёт им локальное время при запуске, после чего ESP32 самостоятельно обновляет HH:MM:SS и YYYY-MM-DD. Timer отсчитывает время локально и посылает событие завершения, которого ожидает CYD_DeviceWaitTimer().

Touch:

  • CYD_EnableTouch(), CYD_GetEvent();
  • CYD_StartTouchCalibration(), CYD_CancelTouchCalibration();
  • CYD_ResetTouchCalibration().

Вопросы:

  • CYD_Question() показывает центрированный текст и ожидает одну из 1–6 кнопок;
  • стандартные схемы: #CYD_QUESTION_OK, #CYD_QUESTION_YES_NO и #CYD_QUESTION_YES_NO_IGNORE;
  • #CYD_QUESTION_CUSTOM принимает собственные подписи;
  • доступны короткие псевдонимы #OK, #YesNo, #YesNoIgnore и #custom, если такие константы ещё не определены.

При выводе вопроса экран очищается, а объёмные кнопки рисуются непосредственно ESP32. С компьютера передаются только сглаженный текст вопроса и небольшие области подписей. Нажатие инвертирует фаску без новой передачи изображения. Стандартные подписи — OK, YES, NO и IGNORE; пользовательский текст и системные шрифты полностью поддерживают кириллицу.

Аудио:

  • CYD_Tone();
  • CYD_PlayMelody(), CYD_WaitMelody();
  • CYD_PlayPCM(), CYD_StopAudio().

SD и автономные медиа:

  • CYD_GetSDInfo(), CYD_UploadFileToSD();
  • CYD_ListSDFiles(), CYD_DownloadFileFromSD(), CYD_DeleteSDFile();
  • CYD_PlayGIFFromSD(), CYD_PauseGIF(), CYD_ResumeGIF(), CYD_StopGIF();
  • CYD_PlayMP3FromSD(), CYD_PauseMP3(), CYD_ResumeMP3(), CYD_StopMP3();
  • CYD_GetMediaStatus(), CYD_SetRGB().

Wi-Fi:

  • CYD_HasWiFiScan();
  • CYD_ScanWiFi(), результаты находятся в CYD_WiFiNetworks().

GIF и MP3 передаются только при загрузке файла. Дальнейшее декодирование идёт на ESP32 с FAT32, без постоянного потока кадров или звука с компьютера.

MP3-декодер принимает CBR и VBR. Гарантированно проверенный вариант — CBR не выше 256 кбит/с. В VBR каждый кадр также должен быть не выше 256 кбит/с. Проверенный файл создаётся командой ffmpeg -i input.mp3 -codec:a libmp3lame -b:a 256k output.mp3.

Для GIF по умолчанию используется #CYD_GIF_COVER; #CYD_GIF_CONTAIN сохраняет весь кадр с возможными полями, а #CYD_GIF_STRETCH растягивает его до 320x240. Локальная копия AnimatedGIF 2.2.0 позволяет потоково показывать пример 500x346 без выделения большого кадрового буфера.

Библиотека использует стандартные библиотеки PureBasic SerialPort, Memory, Image, 2DDrawing, Font, List и функции времени. WinAPI не используется.

Для переноса кода WeActDisplay доступны псевдонимы CYD_DrawPixelBuffer, CYD_DrawRectangleBuffer, CYD_DrawLineBuffer, CYD_DrawCircleBuffer, CYD_DrawTextSystemFont, CYD_LoadImageToBuffer и CYD_UpdateDisplay.

Лицензия

Copyright (C) CheshirCa 2026 — https://t.me/cheshircanest

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

Исходники AnimatedGIF 2.2.0 сохраняют отдельную лицензию Apache-2.0. QR-кодер адаптирован из Project Nayuki QR Code generator; уведомление MIT сохранено в purebasic/CYD_Display.pbi.

English

CYD Display turns supported ESP32-CYD boards into a native 320x240 peripheral for PureBasic programs.

Current version: 0.27.0.

Supported boards

Board MCU Display and touch Profile
FNK0103L ESP32 ST7789, XPT2046 CYD_PROFILE_FNK0103L (CYD_PROFILE_FNK0103L_ROTATED_180 is the same board installed upside down)
ESP32-024 ESP32 ST7789, XPT2046 CYD_PROFILE_ESP32_024
ESP32-2432S028 ESP32 ILI9341, XPT2046 CYD_PROFILE_ESP32_2432S028
ES3C28P ESP32-S3 ILI9341, FT6336, ES8311 CYD_PROFILE_ES3C28P
JC3248W535 ESP32-S3 AXS15231B QSPI, AXS15231B touch CYD_PROFILE_JC3248W535

Features

  • RGB565 framebuffer output and an advertised BGR-order capability for device-side graphics primitives;
  • buffered drawing at 320x240 or 240x320;
  • dirty-rectangle transfers;
  • direct ESP32-side primitives and built-in text without framebuffer traffic;
  • autonomous device-side scrolling at approximately 30 FPS;
  • autonomous clock, date, and countdown timer elements;
  • system-font text and image loading on the host;
  • centered QR Code generation in the host framebuffer, including UTF-8 text;
  • XPT2046 down/move/up events;
  • firmware-guided four-point touch calibration stored in ESP32 NVS;
  • tone, autonomous RTTTL-like melodies, and unsigned 8-bit mono PCM output on GPIO26, with onboard-amplifier control where the hardware profile provides it;
  • FAT32 SD access, serial file upload, autonomous GIF decoding, and MP3 playback with pause/resume/stop control;
  • SD directory listing, file download and deletion;
  • PWM control of the onboard RGB LED;
  • Wi-Fi network scanning with SSID, BSSID, RSSI, channel, and encryption;
  • synchronous touch questions with centered auto-sized text and 1–6 rounded ESP32-rendered buttons;
  • CRC-protected bidirectional packets at 921600 baud.

The old WeAct protocol is not used.

Layout

  • PROGRAMMER_GUIDE.md — complete PureBasic API and usage guide;
  • PROTOCOL.md — CYD/1 wire protocol;
  • ../../PUREBASIC_PROJECT_KNOWLEDGE.md — verified PureBasic-specific project rules;
  • ../../Release — ready-to-use programs and firmware;
  • ../../GitHub — generated publishable source tree;
  • firmware/CYD_Display_Firmware — Arduino ESP32 firmware;
  • purebasic/CYD_Display.pbi — PureBasic include library;
  • purebasic/CYD_Demo.pb — display, touch, calibration, and tone example.
  • purebasic/CYD_Calibrate.pb — interactive touch calibration utility.
  • purebasic/CYD_GraphicsDemo.pb — native text, primitives, and widgets.
  • purebasic/CYD_FastGraphicsDemo.pb — ESP32-side primitives and autonomous scrolling without repeated bitmap transfers.
  • purebasic/CYD_CLI.pb — command-line display, graphics, scroll, touch, and audio control utility.
  • purebasic/CYD_CLI_readme.md — CLI syntax and examples.
  • purebasic/CYD_AudioTest.pb — maximum-volume tone and PCM audio test.
  • CYD_CLI_DogWaltz.cmd — ready-to-run monophonic “Dog Waltz” score for CYD_CLI melody.
  • purebasic/CYD_GIFPlayer.pb — uploads a GIF once and plays it locally.
  • purebasic/CYD_MP3Player.pb — uploads and controls an MP3 on the SD card.
  • purebasic/CYD_SmokeTest.pb — non-interactive connection/display/audio test.
  • programs/CYD_CPUMonitor/ — standalone Windows GUI/tray hardware monitor with source, local library dependencies, assets, executable, build script, documentation and license.

Hardware profiles

firmware/CYD_Display_Firmware/CYD_HardwareConfig.h contains the complete board configuration. Select one value of CYD_ACTIVE_PROFILE:

  • CYD_PROFILE_FNK0103L — the original verified FNK0103L profile;
  • CYD_PROFILE_FNK0103L_ROTATED_180 — FNK0103L with a 180-degree rotated startup orientation;
  • CYD_PROFILE_ESP32_024 — ST7789 ESP32-024 with touch IRQ36.
  • CYD_PROFILE_ES3C28P — ESP32-S3 with ILI9341, capacitive FT6336, WS2812, and an ES8311 audio codec.
  • CYD_PROFILE_JC3248W535 — ESP32-S3 with an AXS15231B 320×480 QSPI display and capacitive AXS15231B touch over I2C.

The ESP32/FNK profiles use an ST7789 240x320 display in 320x240 orientation, TFT and XPT2046 on shared HSPI GPIO12/13/14 with TFT CS15/DC2 and touch CS33, a separate SD VSPI bus GPIO18/19/23 with CS5, backlight GPIO27, and audio DAC GPIO26. Board-specific values include display frequency/inversion, calibration namespace, RGB red pin, touch IRQ, and amplifier-enable handling.

ES3C28P uses a 240x320 ILI9341, FT6336 over I2C, WS2812 on GPIO42, and ES8311 over I2S. Capacitive touch does not need four-point calibration. SDIO mounts at startup and is available for files and MP3.

JC3248W535 uses an AXS15231B 320×480 QSPI display: CS45, CLK47, D0/1/2/3 21/48/40/39, with backlight GPIO1. Its AXS15231B touch uses I2C SDA4/SCL8 at address 0x3B and needs no calibration. The ESP32-S3 build requires 16 MB flash and 8 MB OPI PSRAM, with the AXS15231B 320×480 type-1 panel initialization sequence. SD is not mounted automatically during startup; media commands return ERROR_SD_NOT_READY until SD is explicitly connected.

The active source profile is CYD_PROFILE_ESP32_024. All profiles are compiled during release verification.

Typical PureBasic flow

  1. CYD_Open() to search COM1 through COM256, or CYD_Open("COM5") to select a port explicitly.
  2. Draw into the host framebuffer using CYD_ClearBuffer, CYD_FillRect, CYD_DrawLine, CYD_DrawText, CYD_DrawImage, or CYD_DrawQRCode.
  3. Call CYD_Flush(). Only the accumulated dirty rectangle is sent.
  4. Repeatedly call CYD_GetEvent() from the application's normal event loop.
  5. If touch is not calibrated, call CYD_StartTouchCalibration() and touch the four displayed targets.
  6. Call CYD_Close() on exit.

CYD_PlayPCM() accepts unsigned 8-bit mono samples. It is synchronous and paces the serial producer to protect the ESP32 audio ring buffer. Use CYD_Tone() for short notifications.

Scrolling is animated by repeatedly calling CYD_UpdateScrollText(), CYD_DrawScrollText(#True), and CYD_Flush() in the application loop. That compatibility path preserves system fonts. For fast animation, CYD_DeviceStartScrollText() sends the text and parameters once and the ESP32 performs all subsequent frames locally.

Main PureBasic API

Connection and device control:

  • CYD_Open(), CYD_Close(), CYD_IsConnected();
  • CYD_SetOrientation(), CYD_SetBrightness();
  • CYD_GetWidth(), CYD_GetHeight(), CYD_GetDeviceName(), CYD_GetPortName().

Buffered drawing:

  • CYD_RGB565(), CYD_ClearBuffer();
  • CYD_DrawPixel(), CYD_DrawLine(), CYD_DrawCircle();
  • CYD_DrawRect(), CYD_FillRect(), CYD_DrawTriangle();
  • CYD_DrawText(), CYD_DrawImage(), CYD_DrawQRCode();
  • CYD_DrawWrappedText(), CYD_DrawImageFullScreen();
  • CYD_DrawProgressBar(), CYD_DrawGraph(), CYD_DrawSpinner();
  • CYD_ShowTime(), CYD_ShowDate();
  • CYD_StartScrollText(), CYD_UpdateScrollText();
  • CYD_Flush().

Fast device-side drawing:

  • CYD_HasDeviceGraphics(), CYD_HasDeviceScroll();
  • CYD_HasUTF8DeviceText();
  • CYD_HasDeviceBarChart();
  • CYD_UsesBGRDeviceGraphics();
  • CYD_DeviceDrawPixel(), CYD_DeviceDrawLine();
  • CYD_DeviceDrawRect(), CYD_DeviceFillRect();
  • CYD_DeviceDrawCircle(), CYD_DeviceDrawTriangle();
  • CYD_DeviceDrawText(), CYD_DeviceDrawUTF8TextArea(), CYD_DeviceDrawButton();
  • CYD_DeviceUpdateBarChart();
  • CYD_DeviceStartMatrix(), CYD_DeviceStopMatrix();
  • CYD_DeviceStartScrollText(), CYD_DeviceStopScrollText().
  • CYD_DeviceStartClock(), CYD_DeviceStopClock();
  • CYD_DeviceStartDate(), CYD_DeviceStopDate();
  • CYD_DeviceStartTimer(), CYD_DeviceWaitTimer(), CYD_DeviceStopTimer().

CYD_DeviceDrawText() uses the compact built-in Adafruit font for ASCII. Firmware 0.11.0 adds CYD_DeviceDrawUTF8TextArea(), which renders UTF-8 and Cyrillic on the ESP32 with bundled U8g2 fonts and transfers no bitmap region. Keep CYD_DrawText() plus CYD_Flush() for Windows system fonts and antialiasing.

Version 0.12.0 adds CYD_DeviceUpdateBarChart(), which transfers arrays of 0..100 values and RGB565 colors in one command. The ESP32 retains the previous sample, updates only changed regions, and optionally draws trend markers.

Version 0.15.0 adds CYD_DeviceStartMatrix(), an autonomous ESP32-rendered Matrix effect. Speed, density, and tail length are sent once and animation continues after the COM port closes. CYD_DeviceStopMatrix() stops it and can optionally clear the display.

Version 0.17.0 periodically returns inactive Matrix columns to the animation, so the configured density remains stable instead of fading to black over time. While audio is idle, GPIO26 is held LOW after the DAC is disabled to reduce display and serial coupling into the speaker input.

Version 0.18.0 adds CYD_DeviceStartMatrixClock(): the ESP32 autonomously updates a digital or flip clock, date, and weekday over the Matrix effect. Language and seconds are selected at startup; no continuous COM traffic is required.

Version 0.19.0 adds CYD_DeviceStartClockSaver() for the same autonomous digital or flip clocks without Matrix. In both clock-saver modes, seconds are shown only when ShowSeconds = #True.

Version 0.22.0 reorganizes the CYD_CPUMonitor GUI into vertical Connection, Data sources, Behavior, Clock, Display, and Status groups. Settings and live statistics now use one aligned label grid and more readable fonts. Missing touch calibration no longer blocks monitoring: data remains visible and the GUI reports that touch-based screen switching is unavailable. The Calibration button starts the four-point procedure directly from the monitor and enables touch immediately after successful completion.

Version 0.24.0 lets firmware advertise four-point calibration separately from touch input. The Calibration button is disabled for the capacitive FT6336 on ES3C28P, while the library exposes CYD_HasTouch() and CYD_HasTouchCalibration() capability checks.

Version 0.25.0 corrects the advertised ES3C28P color order. This profile's ILI9341 accepts conventional RGB565, so the host no longer exchanges red and blue in device-side primitives and bar charts.

Version 0.27.0 standardizes the firmware command set across all supported profiles: SD GIF/MP3, media status, audio commands, RGB, and touch calibration remain in the common protocol, while each profile only restricts unavailable hardware. ESP32-024 uses GPIO26 for audio and leaves GPIO4 untouched because it drives the red RGB channel.

Clock and Date are independently positioned persistent ESP32 elements. The host seeds them with its local calendar when they start; the ESP32 then maintains and redraws HH:MM:SS and YYYY-MM-DD without host traffic. Timer counts down locally and emits a completion event that CYD_DeviceWaitTimer() waits for.

Touch:

  • CYD_EnableTouch(), CYD_GetEvent();
  • CYD_StartTouchCalibration();
  • CYD_CancelTouchCalibration();
  • CYD_ResetTouchCalibration().

Questions:

  • CYD_Question() displays centered, automatically wrapped text and waits for one of 1–6 buttons;
  • standard layouts use #CYD_QUESTION_OK, #CYD_QUESTION_YES_NO, and #CYD_QUESTION_YES_NO_IGNORE;
  • #CYD_QUESTION_CUSTOM accepts custom button captions;
  • short aliases #OK, #YesNo, #YesNoIgnore, and #custom are available when those constants have not already been defined.

Question rendering clears the display and draws the rounded raised button faces directly on the ESP32. Only the antialiased system-font question and small label rectangles are transferred from the host. Touch-down inverts the device-side bevel without another bitmap transfer. Built-in question types use international OK, YES, NO, and IGNORE labels. Questions, custom answer labels, and host-rendered system-font text retain full Cyrillic support.

Audio:

  • CYD_Tone();
  • CYD_PlayMelody() and CYD_WaitMelody();
  • CYD_PlayPCM();
  • CYD_StopAudio().

SD and autonomous media:

  • CYD_GetSDInfo(), CYD_UploadFileToSD();
  • CYD_ListSDFiles(), CYD_DownloadFileFromSD(), CYD_DeleteSDFile();
  • CYD_PlayGIFFromSD(), CYD_PauseGIF(), CYD_ResumeGIF(), CYD_StopGIF();
  • CYD_PlayMP3FromSD(), CYD_PauseMP3(), CYD_ResumeMP3(), CYD_StopMP3();
  • CYD_GetMediaStatus().
  • CYD_SetRGB().

Wi-Fi:

  • CYD_HasWiFiScan();
  • CYD_ScanWiFi(), with results in CYD_WiFiNetworks().

GIF and MP3 bytes are sent only during upload. Rendering and decoding then run on the ESP32 from FAT32 storage, so animation and sound do not depend on continuous frame/audio traffic from the PC.

The MP3 decoder accepts CBR and VBR. The validated guaranteed profile is CBR at no more than 256 kbps. VBR is suitable only when every frame stays at or below 256 kbps; a 256 kbps average may still contain unsupported 320 kbps frames. To create the validated format, use ffmpeg -i input.mp3 -codec:a libmp3lame -b:a 256k output.mp3.

GIF defaults to #CYD_GIF_COVER, which fills the display and crops excess edges. #CYD_GIF_CONTAIN preserves the whole frame with possible borders; #CYD_GIF_STRETCH fills 320x240 without preserving aspect ratio. A local Apache-2.0 AnimatedGIF 2.2.0 source copy raises the input-width limit and allows the supplied 500x346 animation.gif to stream without a large canvas allocation.

The library uses only PureBasic's standard SerialPort, memory, image, 2DDrawing, font, list, and timing functions. No WinAPI calls are used.

Drawing code migrated from WeActDisplay can use the compatibility-style aliases CYD_DrawPixelBuffer, CYD_DrawRectangleBuffer, CYD_DrawLineBuffer, CYD_DrawCircleBuffer, CYD_DrawTextSystemFont, CYD_LoadImageToBuffer, and CYD_UpdateDisplay.

License

Copyright (C) CheshirCa 2026 — https://t.me/cheshircanest

This project is distributed under the supplied non-commercial license. Commercial use, sale, paid distribution, and inclusion in commercial products or services require explicit written permission from the author. Attribution must be preserved in redistributed or modified copies. See the workspace LICENSE file for the complete terms and warranty disclaimer.

The vendored AnimatedGIF 2.2.0 sources retain their separate Apache-2.0 license and copyright notices.

The QR encoder is adapted from the Project Nayuki QR Code generator. Its MIT license notice is retained in purebasic/CYD_Display.pbi.

About

PureBasic library, CLI, and ESP32 firmware for controlling CYD displays with graphics, touch, audio, SD media, and Wi-Fi scanning.

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages