ESP32 VGA-вывод через DAC: подключаем старый монитор к AI-агенту ASI Biont и управляем визуализацией через чат

Введение: зачем AI-агенту VGA-монитор?

Представьте: у вас на столе пылится старый VGA-монитор, а рядом — ESP32 с парой резисторов и ЦАП (DAC). И вот вы в чате с AI-агентом пишете: «Выведи на VGA-экран текущую температуру в цеху и график за последний час». Через 10 секунд на мониторе появляется дашборд. Без единой строки кода, написанного вами.

Это не фантастика. ASI Biont — AI-агент, который подключается к любому устройству, имеющему интерфейс: COM-порт, SSH, MQTT, Modbus/TCP, HTTP API, OPC-UA. А если устройство «не умеет» общаться напрямую — AI сам напишет Python-скрипт под вашу задачу.

ESP32 с VGA-выходом — идеальный кандидат для такой интеграции. Он дешёвый ($3–5), широко распространён, а VGA-интерфейс позволяет подключать мониторы без HDMI. С помощью библиотек FabGL или TinyVGA можно выводить текст, графику и даже видео. Но главное — через AI-агента вы управляете визуализацией голосом или текстом, не программируя вручную.

В этой статье я покажу пошагово, как настроить ESP32 с VGA-выходом через DAC, подключить его к ASI Biont по MQTT и выводить данные на экран по командам из Telegram.

Что за устройство: ESP32 + VGA через DAC

ESP32 — микроконтроллер с двумя 8-битными ЦАП (цифро-аналоговыми преобразователями) на выводах GPIO25 и GPIO26. Для формирования VGA-сигнала нужно три аналоговых канала: красный, зелёный, синий (RGB). Обычно используют резисторный ЦАП (R-2R) на 8–12 пинах для RGB, но для простых текстовых интерфейсов достаточно двух каналов DAC ESP32.

Варианты реализации:
- FabGL — библиотека для ESP32, эмулирующая VGA-контроллер. Поддерживает 640×350, 640×400, 640×480, 800×600. Требует внешний DAC (R-2R) на 8–12 пинах.
- TinyVGA — минималистичная библиотека для вывода текста и простой графики, использует встроенный DAC ESP32 (GPIO25, GPIO26) для монохромного режима.
- ESP32-VGA-Text — проект от bitluni, выводит текст 40×15 символов на чёрно-белом фоне.

Мы будем использовать TinyVGA — он не требует дополнительных деталей, кроме трёх резисторов (270 Ом, 470 Ом, 1 кОм) для формирования уровней синхронизации.

Как ASI Biont подключается к ESP32

ASI Biont не имеет прямого доступа к пинам ESP32 — он работает в облаке. Для связи с устройством нужен «мостик». Самый простой и надёжный способ — MQTT. ESP32 подписывается на топик с командами, а AI-агент публикует в этот топик данные или запросы на отображение.

Альтернативный вариант — Hardware Bridge через COM-порт. Вы запускаете bridge.py на ПК, подключаете ESP32 через USB-UART, и AI отправляет команды через industrial_command. Но MQTT удобнее, если ESP32 находится далеко от ПК (например, в цеху).

Почему MQTT?
1. Асинхронность — ESP32 может «висеть» в ожидании команд без блокировки.
2. Надёжность — MQTT работает через Wi-Fi, не требует прямого подключения к ПК.
3. Масштабируемость — можно добавить десятки ESP32 на один брокер.
4. Простота — библиотека PubSubClient для ESP32 занимает 10 строк кода.

Конкретный сценарий: мониторинг температуры на VGA-экране через Telegram

Представим, что у вас в серверной стоит ESP32 с датчиком температуры DS18B20 (или DHT22) и VGA-выходом. Вы хотите:
- Видеть текущую температуру на старом VGA-мониторе.
- Получать уведомления в Telegram, если температура превышает 40°C.
- Иметь возможность запросить график за последние 6 часов через чат.

Шаг 1. Сборка схемы

Компоненты:
- ESP32 (любая плата, например, ESP32-DevKitC)
- Датчик температуры DS18B20 (OneWire)
- Резисторы: 270 Ом, 470 Ом, 1 кОм
- VGA-разъём (DB15 Female)
- Блок питания 5V для ESP32 (или USB)

Схема подключения VGA:

Сигнал VGA Пин ESP32 Резистор
Красный GPIO25 (DAC1) 270 Ом к VGA pin 1
Зелёный GPIO26 (DAC2) 470 Ом к VGA pin 2
Синий 3.3V (через резистор) 1 кОм к VGA pin 3
HSync GPIO18 напрямую к VGA pin 13
VSync GPIO19 напрямую к VGA pin 14
GND GND к VGA pin 5, 6, 7, 8, 10

Важно: Для синего канала мы используем постоянный уровень 3.3V через резистор — это даёт синий фон. Если нужен полноцветный режим, потребуется R-2R ЦАП на 3–4 пинах на каждый цвет.

Шаг 2. Прошивка ESP32

Установите библиотеки через Arduino IDE: TinyVGA (автор: bitluni), PubSubClient, OneWire, DallasTemperature.

Пример кода для ESP32 (загружается через USB):

#include <WiFi.h>
#include <PubSubClient.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <TinyVGA.h>

// VGA
TinyVGA vga(640, 480); // разрешение

// WiFi и MQTT
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
const char* mqtt_server = "broker.hivemq.com";
const int mqtt_port = 1883;
const char* topic_data = "esp32/vga/data";
const char* topic_cmd = "esp32/vga/cmd";

WiFiClient espClient;
PubSubClient client(espClient);

// Датчик температуры
#define ONE_WIRE_BUS 4
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }

  client.setServer(mqtt_server, mqtt_port);
  client.setCallback(callback);

  sensors.begin();

  // Инициализация VGA
  vga.begin();
  vga.clearScreen(0x001F); // синий фон
  vga.drawText(10, 10, "ESP32 VGA Monitor", 0xFFFF);
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  // Чтение температуры каждые 10 секунд
  static unsigned long lastTemp = 0;
  if (millis() - lastTemp > 10000) {
    sensors.requestTemperatures();
    float temp = sensors.getTempCByIndex(0);

    // Отправка в MQTT
    char tempStr[8];
    dtostrf(temp, 1, 2, tempStr);
    client.publish(topic_data, tempStr);

    // Вывод на VGA
    vga.clearScreen(0x001F);
    vga.drawText(10, 10, "Temp: ", 0xFFFF);
    vga.drawText(70, 10, tempStr, 0xFFE0); // жёлтый
    vga.drawText(10, 30, "C", 0xFFFF);

    lastTemp = millis();
  }
}

void callback(char* topic, byte* payload, unsigned int length) {
  // Обработка команд от AI
  String msg = "";
  for (int i = 0; i < length; i++) {
    msg += (char)payload[i];
  }

  if (msg == "clear") {
    vga.clearScreen(0x0000);
  } else if (msg.startsWith("text:")) {
    String text = msg.substring(5);
    vga.clearScreen(0x001F);
    vga.drawText(10, 50, text.c_str(), 0xFFFF);
  }
}

void reconnect() {
  while (!client.connected()) {
    if (client.connect("ESP32VGA")) {
      client.subscribe(topic_cmd);
    }
  }
}

Шаг 3. Подключение ASI Biont к ESP32 через MQTT

Теперь самое интересное. Вы открываете чат с ASI Biont на asibiont.com и описываете задачу:

«Подключись к MQTT-брокеру broker.hivemq.com:1883. Подпишись на топик esp32/vga/data с данными температуры. Если температура выше 40°C, отправь мне уведомление в Telegram. Также подпишись на топик esp32/vga/cmd — я буду отправлять команды для вывода текста на VGA-экран.»

AI-агент сам пишет Python-скрипт, который выполняется в его sandbox-окружении (execute_python). Вот реальный код, который генерирует AI:

import paho.mqtt.client as mqtt
import requests
import json

# Конфигурация
BROKER = "broker.hivemq.com"
PORT = 1883
TOPIC_DATA = "esp32/vga/data"
TOPIC_CMD = "esp32/vga/cmd"
TELEGRAM_BOT_TOKEN = "YOUR_BOT_TOKEN"
TELEGRAM_CHAT_ID = "YOUR_CHAT_ID"

def on_message(client, userdata, msg):
    payload = msg.payload.decode()
    print(f"Получены данные: {payload}")

    try:
        temp = float(payload)
        if temp > 40.0:
            # Отправка уведомления в Telegram
            url = f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/sendMessage"
            data = {
                "chat_id": TELEGRAM_CHAT_ID,
                "text": f"⚠️ ВНИМАНИЕ! Температура {temp:.1f}°C превышает 40°C!",
                "parse_mode": "HTML"
            }
            requests.post(url, json=data)

            # Отправка команды на VGA-экран
            cmd_client.publish(TOPIC_CMD, f"ALERT: {temp:.1f}C")
    except ValueError:
        pass

client = mqtt.Client()
client.on_message = on_message
client.connect(BROKER, PORT, 60)
client.subscribe(TOPIC_DATA)

# Отдельный клиент для отправки команд
cmd_client = mqtt.Client()
cmd_client.connect(BROKER, PORT, 60)

# Запуск в бесконечном цикле (в sandbox таймаут 30 сек, поэтому используем loop_start)
client.loop_start()
# Ждём 20 секунд для демонстрации
import time
time.sleep(20)

Обратите внимание: execute_python в ASI Biont выполняется в sandbox-окружении с таймаутом 30 секунд. Поэтому мы используем loop_start() (неблокирующий цикл) и time.sleep(20) — этого достаточно для демонстрации. В реальном сценарии AI может запустить долгоживущий процесс через отдельный сервис или Hardware Bridge.

Шаг 4. Управление визуализацией через чат

Теперь вы можете управлять VGA-экраном прямо из Telegram:

  • «Выведи на экран текст: Привет, мир!» — AI публикует в топик esp32/vga/cmd сообщение text:Привет, мир!. ESP32 получает его и рисует текст на VGA.
  • «Очисти экран» — AI отправляет команду clear.
  • «Покажи график температуры за последний час» — AI собирает данные из MQTT-истории (если настроено логирование), строит график с помощью matplotlib, конвертирует в PNG, отправляет вам в Telegram. Для вывода на VGA можно отправить команду с текстовым представлением.

Шаг 5. Расширение: дашборд на VGA без кода

Вы можете попросить AI создать полноценный дашборд, который ESP32 будет отображать по расписанию:

«Настрой ESP32 так, чтобы каждые 5 минут выводился экран с тремя строками: текущая температура, статус сервера (по пингу), и случайная цитата из файла. Данные бери из MQTT-топиков.»

AI сгенерирует обновлённую прошивку для ESP32 (или отправит команды через MQTT на уже работающую) и настроит логику опроса. Всё в диалоге.

Почему это выгодно?

  1. Ноль ручного кодирования. Вам не нужно писать ни одной строки Python или C++ — AI делает это за вас. Вы только описываете цель.
  2. Универсальность. ASI Biont подключается к любому устройству: ESP32, Raspberry Pi, Arduino, PLC, GPS-трекер. Через execute_python AI использует любые библиотеки из списка (pyserial, paramiko, paho-mqtt, pymodbus, aiohttp, opcua-asyncio).
  3. Экономия времени. Интеграция, которая заняла бы день, делается за 5 минут.
  4. Гибкость. Вы можете менять логику на лету — просто напишите новую команду в чат. Не нужно перепрошивать ESP32.

Подводные камни и советы

  • Таймаут execute_python (30 секунд). Если ваш скрипт должен работать дольше, используйте Hardware Bridge или разверните долгоживущий процесс на своём сервере, а AI будет отправлять ему команды через MQTT.
  • VGA-разрешение. TinyVGA поддерживает только 640×480. Для более высокого разрешения используйте FabGL с внешним R-2R ЦАП.
  • Питание. ESP32 потребляет ~200 мА при выводе VGA. Используйте качественный блок питания на 5V/1A.
  • Безопасность. MQTT-брокер без пароля — плохая идея для прода. Используйте HiveMQ Cloud или Mosquitto с TLS.

Заключение

ESP32 с VGA-выходом — отличный способ «оживить» старый монитор и превратить его в информационное табло. А с ASI Biont вы получаете AI-агента, который сам настраивает устройство, управляет визуализацией и уведомляет вас о событиях. Всё через чат — без сложных IDE, без ручного написания кода.

Попробуйте сами: asibiont.com — создайте учётную запись, откройте чат и напишите: «Подключи мою ESP32 с VGA-экраном к MQTT и выведи на экран температуру». AI сделает остальное.

Полезные ссылки:
- Библиотека TinyVGA
- Библиотека FabGL
- PubSubClient для ESP32
- Документация ASI Biont

← Все статьи

Комментарии