CCCPaste

lilka lvgl

esphome:
  name: lilka
  friendly_name: lilka
  on_boot:
    priority: 600
    then:
      - output.turn_on: display_power
      - delay: 100ms

esp32:
  board: esp32-s3-devkitc-1
  framework:
    type: esp-idf

logger:

api:
  encryption:
    key: "Yw3yq8lxsaze+jdggjAwxKpV4GD6gNZptvw4d6OPfOc="

ota:
  - platform: esphome
    password: "bb198feb99159fdaefc8092f10039acd"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  ap:
    ssid: "Lilka Fallback Hotspot"
    password: "hnYImYM4O6I0"

captive_portal:

# Веб-сервер
web_server:
  port: 80

# Увімкнення живлення дисплея
output:
  - platform: gpio
    pin: 46
    id: display_power
    inverted: false

# Сенсор батареї
sensor:
  - platform: adc
    pin: GPIO3
    name: "Battery Voltage"
    id: battery_voltage
    update_interval: 10s
    attenuation: 12db
    filters:
      - multiply: 1.33
    
  - platform: template
    name: "Battery Level"
    id: battery_level
    unit_of_measurement: "%"
    accuracy_decimals: 0
    update_interval: 10s
    lambda: |-
      float voltage = id(battery_voltage).state;
      float percent = (voltage - 3.0) / (4.2 - 3.0) * 100.0;
      if (percent > 100) percent = 100;
      if (percent < 0) percent = 0;
      return percent;

# SPI шина
spi:
  clk_pin: 18
  mosi_pin: 17

# Дисплей ST7789V
display:
  - platform: mipi_spi
    model: ST7789V
    id: my_display
    dc_pin: 15
    cs_pin: 7
    rotation: 270
    invert_colors: false
    color_order: RGB
    pixel_mode: 16bit
    dimensions:
      width: 240
      height: 280
      offset_width: 0
      offset_height: 0
    auto_clear_enabled: false

# LVGL - мінімальний варіант
lvgl:
  log_level: INFO
  
  pages:
    - id: main_page
      widgets:
        # Заголовок
        - label:
            text: "Lilka LVGL"
            align: TOP_MID
            y: 20
        
        # Батарея
        - label:
            id: battery_label
            text: "Battery: --"
            align: TOP_MID
            y: 50
        
        # Текст по центру
        - label:
            text: "LVGL Works!"
            align: CENTER

# Кнопки керування - БЕЗ lvgl дій поки що
binary_sensor:
  - platform: gpio
    pin:
      number: 38
      mode: INPUT_PULLUP
      inverted: true
    name: "Button Up"
    id: button_up
    filters:
      - delayed_on_off: 50ms
    
  - platform: gpio
    pin:
      number: 41
      mode: INPUT_PULLUP
      inverted: true
    name: "Button Down"
    id: button_down
    filters:
      - delayed_on_off: 50ms
    
  - platform: gpio
    pin:
      number: 39
      mode: INPUT_PULLUP
      inverted: true
    name: "Button Left"
    id: button_left
    filters:
      - delayed_on_off: 50ms
    
  - platform: gpio
    pin:
      number: 40
      mode: INPUT_PULLUP
      inverted: true
    name: "Button Right"
    id: button_right
    filters:
      - delayed_on_off: 50ms
  
  - platform: gpio
    pin:
      number: 5
      mode: INPUT_PULLUP
      inverted: true
    name: "Button A"
    id: button_a
    filters:
      - delayed_on_off: 50ms
    
  - platform: gpio
    pin:
      number: 6
      mode: INPUT_PULLUP
      inverted: true
    name: "Button B"
    id: button_b
    filters:
      - delayed_on_off: 50ms
  
  - platform: gpio
    pin:
      number: 10
      mode: INPUT_PULLUP
      inverted: true
    name: "Button C"
    id: button_c
    filters:
      - delayed_on_off: 50ms
  
  - platform: gpio
    pin:
      number: 9
      mode: INPUT_PULLUP
      inverted: true
    name: "Button D"
    id: button_d
    filters:
      - delayed_on_off: 50ms
  
  - platform: gpio
    pin:
      number: 4
      mode: INPUT_PULLUP
      inverted: true
    name: "Button Start"
    id: button_start
    filters:
      - delayed_on_off: 50ms
  
  - platform: gpio
    pin:
      number: 0
      mode: INPUT_PULLUP
      inverted: true
    name: "Button Select"
    id: button_select
    filters:
      - delayed_on_off: 50ms

# Оновлення батареї
interval:
  - interval: 5s
    then:
      - lvgl.label.update:
          id: battery_label
          text: !lambda |-
            return std::string("Battery: ") + to_string((int)id(battery_level).state) + "%";