OLED-дисплей (SSD1306, SH1106) + AI-агент ASI Biont: гайд по интеграции для умного дома и IoT

Введение: зачем подключать OLED-дисплей к AI-агенту?

OLED-дисплеи на контроллерах SSD1306 и SH1106 — одни из самых популярных в DIY-проектах и промышленной автоматизации. Они компактны, экономичны и дают чёткое изображение даже при ярком солнечном свете. Но чаще всего их используют для вывода статической информации: «Привет, мир», температура с датчика, IP-адрес при загрузке. Это скучно и неэффективно.

Подключив такой дисплей к AI-агенту ASI Biont, вы превращаете его в умный информационный хаб, который обновляется в реальном времени: погода, курсы валют, статус сервера, уведомления из Telegram, показания с промышленных датчиков — всё это без написания сложного бэкенда.

В этой статье я, как инженер-разработчик embedded-систем, покажу, как подключить OLED-дисплей (SSD1306, SH1106) к AI-агенту ASI Biont через ESP32 по протоколу MQTT. Вы узнаете, как настроить автообновление данных и какие реальные задачи можно автоматизировать. Всё с примерами кода на MicroPython и C++.

Почему именно MQTT и ESP32?

ASI Biont поддерживает множество протоколов: Modbus/TCP, SSH, COM-порт, OPC-UA, CAN bus и другие. Но для подключения OLED-дисплея через ESP32 оптимальный выбор — MQTT. Почему:
- Простота: MQTT — лёгкий протокол publish/subscribe, идеальный для IoT-устройств с ограниченными ресурсами.
- Надёжность: встроенный QoS (Quality of Service) гарантирует доставку сообщений даже при нестабильной сети.
- Масштабируемость: можно добавить десятки дисплеев, подписав их на разные топики.
- Безопасность: поддержка TLS-шифрования и аутентификации.

ESP32 выбран из-за встроенного Wi-Fi/Bluetooth и двух ядер — идеально для одновременного приёма данных по MQTT и управления дисплеем.

Как AI-агент подключается к устройству?

ASI Biont не требует установки приложений на ПК или сложных настроек. Всё делается через диалог в чате:
1. Вы описываете задачу: «Подключи OLED-дисплей SSD1306 по I2C к ESP32, получай данные по MQTT от брокера test.mosquitto.org, топик /sensor/temperature, выводи температуру на дисплей».
2. AI-агент генерирует Python-скрипт (для execute_python) или MicroPython-код (для прошивки ESP32) и объясняет, как его запустить.
3. Вы запускаете скрипт на ESP32 (через Arduino IDE или Thonny) или на сервере (через execute_python) — и дисплей начинает работать.

Никаких панелей управления и кнопок «добавить устройство» — только диалог.

Сценарий 1: Вывод погоды и курсов валют на OLED-дисплей

Это самый популярный сценарий для умного дома. Дисплей показывает текущую погоду (температура, влажность, давление) и курсы валют (USD, EUR) с обновлением каждые 15 минут.

Аппаратная схема подключения (I2C)

Компонент Пин ESP32 Пин OLED Примечание
VCC 3.3V VCC Питание 3.3 В
GND GND GND Общий провод
SDA GPIO21 SDA Линия данных I2C
SCL GPIO22 SCL Линия тактов I2C

Схема подключения (текстовое описание):
- Подключите OLED к макетной плате.
- Соедините VCC (OLED) с 3.3V (ESP32).
- GND (OLED) с GND (ESP32).
- SDA (OLED) с GPIO21 (ESP32).
- SCL (OLED) с GPIO22 (ESP32).
- При необходимости установите подтягивающие резисторы 4.7 кОм на SDA и SCL (на большинстве модулей SSD1306 они уже встроены).

Код на MicroPython для ESP32

# main.py — прошивка для ESP32 с OLED-дисплеем
# Получает данные по MQTT и выводит на дисплей

import network
import time
import machine
from machine import Pin, I2C
import ssd1306
from umqtt.simple import MQTTClient
import json

# Настройки Wi-Fi
WIFI_SSID = "ваш_SSID"
WIFI_PASS = "ваш_пароль"

# Настройки MQTT
MQTT_BROKER = "test.mosquitto.org"
MQTT_PORT = 1883
TOPIC_WEATHER = "home/weather"
TOPIC_CURRENCY = "home/currency"

# Настройки OLED (I2C)
i2c = I2C(0, scl=Pin(22), sda=Pin(21), freq=400000)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)

# Переменные для хранения данных
weather_data = {}
currency_data = {}

def connect_wifi():
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    if not wlan.isconnected():
        print('Подключение к Wi-Fi...')
        wlan.connect(WIFI_SSID, WIFI_PASS)
        while not wlan.isconnected():
            time.sleep(1)
    print('Wi-Fi подключён:', wlan.ifconfig())

def mqtt_callback(topic, msg):
    global weather_data, currency_data
    topic_str = topic.decode('utf-8')
    try:
        data = json.loads(msg.decode('utf-8'))
        if topic_str == TOPIC_WEATHER:
            weather_data = data
        elif topic_str == TOPIC_CURRENCY:
            currency_data = data
        update_display()
    except Exception as e:
        print('Ошибка парсинга:', e)

def update_display():
    oled.fill(0)
    # Вывод погоды
    if weather_data:
        oled.text('Погода:', 0, 0)
        oled.text(f"{weather_data.get('temp', 'N/A')}°C", 0, 10)
        oled.text(f"{weather_data.get('humidity', 'N/A')}%", 0, 20)
    # Вывод курсов валют
    if currency_data:
        oled.text('Курсы:', 0, 35)
        oled.text(f"USD: {currency_data.get('usd', 'N/A')}", 0, 45)
        oled.text(f"EUR: {currency_data.get('eur', 'N/A')}", 0, 55)
    oled.show()

# Основная программа
def main():
    connect_wifi()
    client = MQTTClient("esp32_oled", MQTT_BROKER, port=MQTT_PORT)
    client.set_callback(mqtt_callback)
    client.connect()
    client.subscribe(TOPIC_WEATHER)
    client.subscribe(TOPIC_CURRENCY)
    print('Подключён к MQTT, ожидание данных...')

    while True:
        try:
            client.check_msg()
            time.sleep(0.1)
        except OSError as e:
            print('Ошибка MQTT:', e)
            time.sleep(5)
            client.connect()

if __name__ == '__main__':
    main()

Как это работает с ASI Biont?

AI-агент ASI Biont подключается к MQTT-брокеру через execute_python (с библиотекой paho-mqtt). Он генерирует скрипт, который:
- Получает данные о погоде через OpenWeatherMap API или другой источник.
- Парсит курсы валют (например, через API Центробанка).
- Публикует их в топики home/weather и home/currency.

Пример команды AI-агенту: «Опубликуй в MQTT-брокер test.mosquitto.org данные о погоде в Москве каждые 15 минут в топик home/weather». AI пишет и запускает скрипт.

Сценарий 2: Мониторинг состояния сервера с уведомлениями

OLED-дисплей может показывать статус сервера (CPU, RAM, диск) и отправлять уведомления в Telegram при критических значениях.

Код на MicroPython для ESP32 (фрагмент)

# ... (подключение Wi-Fi и MQTT как выше)

TOPIC_SERVER_STATUS = "server/status"

def update_display_server(status):
    oled.fill(0)
    oled.text('Сервер:', 0, 0)
    oled.text(f"CPU: {status.get('cpu', 'N/A')}%", 0, 10)
    oled.text(f"RAM: {status.get('ram', 'N/A')}%", 0, 20)
    oled.text(f"Disk: {status.get('disk', 'N/A')}%", 0, 30)
    oled.text(f"Uptime: {status.get('uptime', 'N/A')}h", 0, 40)
    oled.show()

Скрипт для AI-агента (выполняется на сервере ASI Biont)

# Этот скрипт генерирует AI и запускает через execute_python
import paho.mqtt.client as mqtt
import psutil
import json
import time

BROKER = "test.mosquitto.org"
TOPIC = "server/status"

def get_status():
    return {
        "cpu": psutil.cpu_percent(interval=1),
        "ram": psutil.virtual_memory().percent,
        "disk": psutil.disk_usage('/').percent,
        "uptime": int(time.time() - psutil.boot_time()) // 3600
    }

def on_connect(client, userdata, flags, rc):
    print("Подключён к брокеру")

def main():
    client = mqtt.Client()
    client.on_connect = on_connect
    client.connect(BROKER, 1883, 60)
    client.loop_start()

    while True:
        status = get_status()
        client.publish(TOPIC, json.dumps(status))
        print(f"Опубликовано: {status}")
        time.sleep(30)  # Обновление каждые 30 секунд

if __name__ == "__main__":
    main()

Важно: execute_python имеет таймаут 30 секунд, поэтому бесконечный цикл while True приведёт к остановке. Для долгосрочных задач AI может предложить запустить скрипт на отдельном сервере или использовать планировщик (например, cron).

Сценарий 3: Уведомления из Telegram на OLED-дисплей

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

Как это настроить?

  1. Создайте Telegram-бота через @BotFather, получите токен.
  2. В чате с ASI Biont напишите: «Подпишись на Telegram-бота с токеном XXX, получай сообщения и публикуй их в MQTT-топик home/telegram».
  3. AI-агент генерирует скрипт, который использует requests.get для long polling и публикует текст в MQTT.

Код на MicroPython для вывода уведомлений

# Фрагмент обработки MQTT-сообщений
TOPIC_TELEGRAM = "home/telegram"

def mqtt_callback(topic, msg):
    if topic.decode() == TOPIC_TELEGRAM:
        text = msg.decode('utf-8')
        # Очистка дисплея и вывод уведомления
        oled.fill(0)
        oled.text('Уведомление:', 0, 0)
        # Разбиваем длинный текст на строки
        lines = [text[i:i+16] for i in range(0, len(text), 16)]
        for i, line in enumerate(lines[:4]):  # максимум 4 строки
            oled.text(line, 0, 10 + i*12)
        oled.show()
        time.sleep(10)  # Показываем 10 секунд
        update_display()  # Возвращаем предыдущий экран

Сценарий 4: Промышленный мониторинг через Modbus/TCP

OLED-дисплей может отображать показания с промышленных контроллеров (PLC) через Modbus TCP. AI-агент подключается к PLC, читает регистры и публикует данные в MQTT.

Команда AI-агенту

«Подключись к PLC Siemens S7-1200 по IP 192.168.1.100, прочитай регистры температуры (адрес 40001) и давления (адрес 40002), опубликуй в MQTT-топик factory/sensors каждые 5 секунд».

Пример кода (выполняется через industrial_command)

# AI генерирует этот код для execute_python
from pymodbus.client import ModbusTcpClient
import paho.mqtt.client as mqtt
import json
import time

PLC_IP = "192.168.1.100"
PLC_PORT = 502
MQTT_BROKER = "test.mosquitto.org"
TOPIC = "factory/sensors"

def read_plc():
    client = ModbusTcpClient(PLC_IP, port=PLC_PORT)
    client.connect()
    rr = client.read_holding_registers(0, 2, unit=1)  # Регистры 40001-40002
    client.close()
    return {"temperature": rr.registers[0] / 10.0, "pressure": rr.registers[1] / 100.0}

def main():
    mqtt_client = mqtt.Client()
    mqtt_client.connect(MQTT_BROKER, 1883, 60)
    while True:
        data = read_plc()
        mqtt_client.publish(TOPIC, json.dumps(data))
        print(f"Отправлено: {data}")
        time.sleep(5)

if __name__ == "__main__":
    main()

Сценарий 5: Автоматизация умного дома через AI-агента

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

Пример команды

«Создай скрипт, который показывает на OLED-дисплее состояние лампы (вкл/выкл) и температуру в комнате. При нажатии кнопки на GPIO34 отправляй команду на включение/выключение лампы через MQTT».

Код для ESP32

# Фрагмент обработки кнопки
from machine import Pin

button = Pin(34, Pin.IN, Pin.PULL_UP)

def toggle_light():
    # Публикация команды в MQTT
    client.publish("home/light/command", "toggle")

# В основном цикле
if not button.value():  # Кнопка нажата
    time.sleep(0.05)  # Антидребезг
    if not button.value():
        toggle_light()
        time.sleep(0.3)

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

  • Не нужно писать код вручную: AI делает всю интеграцию за секунды. Вы описываете задачу на естественном языке — и получаете готовый скрипт.
  • Гибкость: можно подключать любые устройства, даже те, которые официально не поддерживаются — через execute_python.
  • Экономия времени: вместо часов настройки — 5 минут диалога с AI.
  • Масштабируемость: добавив ещё один дисплей, просто меняете MQTT-топик в чате.

Заключение

OLED-дисплей SSD1306 или SH1106, подключённый к AI-агенту ASI Biont, перестаёт быть просто «красивой картинкой» и превращается в мощный инструмент визуализации данных. Погода, курсы валют, статус сервера, уведомления из Telegram, промышленные показатели — всё это обновляется в реальном времени без участия разработчика.

Попробуйте сами: откройте asibiont.com, создайте агента, опишите задачу — и ваш дисплей оживёт.

← Все статьи

Комментарии