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 # Глобальні змінні для підрахунку натискань globals: - id: up_count type: int restore_value: no initial_value: '0' - id: down_count type: int restore_value: no initial_value: '0' - id: left_count type: int restore_value: no initial_value: '0' - id: right_count type: int restore_value: no initial_value: '0' # Кнопки binary_sensor: - platform: gpio pin: number: 38 mode: INPUT_PULLUP inverted: true name: "Button Up" id: button_up filters: - delayed_on: 10ms on_press: then: - logger.log: "UP pressed" - globals.set: id: up_count value: !lambda 'return id(up_count) + 1;' - platform: gpio pin: number: 41 mode: INPUT_PULLUP inverted: true name: "Button Down" id: button_down filters: - delayed_on: 10ms on_press: then: - logger.log: "DOWN pressed" - globals.set: id: down_count value: !lambda 'return id(down_count) + 1;' - platform: gpio pin: number: 39 mode: INPUT_PULLUP inverted: true name: "Button Left" id: button_left filters: - delayed_on: 10ms on_press: then: - logger.log: "LEFT pressed" - globals.set: id: left_count value: !lambda 'return id(left_count) + 1;' - platform: gpio pin: number: 40 mode: INPUT_PULLUP inverted: true name: "Button Right" id: button_right filters: - delayed_on: 10ms on_press: then: - logger.log: "RIGHT pressed" - globals.set: id: right_count value: !lambda 'return id(right_count) + 1;' # Батарея sensor: - platform: adc pin: GPIO3 name: "Battery Voltage" id: battery_voltage update_interval: 10s attenuation: 11db 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 # Шрифти font: - file: "gfonts://Roboto" id: font_small size: 16 - file: "gfonts://Roboto" id: font_large size: 24 # Дисплей (поки БЕЗ LVGL) display: - platform: mipi_spi model: ST7789V dc_pin: 15 cs_pin: 7 update_interval: 100ms rotation: 270 invert_colors: false color_order: RGB pixel_mode: 16bit dimensions: width: 240 height: 280 offset_width: 0 offset_height: 0 lambda: |- // Фон it.fill(Color::BLACK); // Заголовок it.print(120, 20, id(font_large), Color::WHITE, TextAlign::CENTER, "Button Test"); // Лінія it.line(20, 50, 220, 50, Color(50, 50, 50)); // Батарея if (id(battery_level).has_state()) { it.printf(120, 60, id(font_small), Color(0, 255, 0), TextAlign::CENTER, "Battery: %.0f%%", id(battery_level).state); } // Лічильники кнопок int y = 100; // UP it.printf(30, y, id(font_small), id(button_up).state ? Color(0, 255, 0) : Color(100, 100, 100), "UP: %d", id(up_count)); // DOWN it.printf(30, y + 30, id(font_small), id(button_down).state ? Color(0, 255, 0) : Color(100, 100, 100), "DOWN: %d", id(down_count)); // LEFT it.printf(30, y + 60, id(font_small), id(button_left).state ? Color(0, 255, 0) : Color(100, 100, 100), "LEFT: %d", id(left_count)); // RIGHT it.printf(30, y + 90, id(font_small), id(button_right).state ? Color(0, 255, 0) : Color(100, 100, 100), "RIGHT: %d", id(right_count)); // Підказка it.print(120, 240, id(font_small), Color(150, 150, 150), TextAlign::CENTER, "Press any button");