Files
esphome-configs/mcu-lvgl-trainer.yaml

289 lines
6.3 KiB
YAML

substitutions:
device: lvgl-trainer
name: Trainer Display
area: Basement
comment: "${area} | Pain Cave"
esphome:
name: mcu-${device}
friendly_name: ${name}
area: ${area}
comment: ${comment}
esp32:
variant: esp32s3
flash_size: 16MB
framework:
type: esp-idf
packages:
common: !include common/common.yaml
i2c:
- id: touchscreen_bus
sda: 4
scl: 8
psram:
mode: octal
speed: 80MHz
spi:
id: display_qspi
type: quad
clk_pin: 47
data_pins: [21, 48, 40, 39]
color:
- id: my_red
red: 100%
green: 0%
blue: 0%
- id: my_orange
red: 100%
green: 50%
blue: 0%
- id: my_yellow
red: 100%
green: 100%
blue: 0%
- id: my_green
red: 0%
green: 100%
blue: 0%
- id: my_blue
red: 0%
green: 0%
blue: 100%
- id: my_teal
red: 0%
green: 100%
blue: 100%
- id: my_gray
red: 70%
green: 70%
blue: 70%
- id: my_white
red: 100%
green: 100%
blue: 100%
font:
- file: "gfonts://Roboto"
id: Roboto_48
size: 48
- file: "gfonts://Roboto"
id: Roboto_36
size: 36
- file: "gfonts://Roboto"
id: Roboto_24
size: 24
- file: "gfonts://Roboto"
id: Roboto_12
size: 12
- file: "gfonts://Roboto"
id: font_std
size: 40
glyphs: "!\"%()+=,-_.:°0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz/\\[]|&@#'"
- file: "gfonts://Roboto@700"
id: font_title
size: 40
glyphs: "!\"%()+=,-_.:°0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz/\\[]|&@#'"
globals:
- id: bgcolor
type: Color
initial_value: "Color::random_color()"
# power_supply:
# id: main_backlight
# pin: 1
# enable_on_boot: true
output:
- platform: ledc
id: gpio_backlight_pwm
pin: 1
light:
- id: display_backlight
name: Backlight
platform: monochromatic
output: gpio_backlight_pwm
restore_mode: ALWAYS_ON
default_transition_length: 500ms
display:
- platform: qspi_dbi
model: axs15231
data_rate: 40MHz #20mhz is default
#spi_mode: MODE2
id: main_display
spi_id: display_qspi
dimensions:
height: 480
width: 320
cs_pin: 45
brightness: 50
rotation: 90
auto_clear_enabled: false
# show_test_card: true
# lambda: |-
# it.fill(id(bgcolor));
# it.print(it.get_width()/2, it.get_height()/2-20, id(font_title), TextAlign::CENTER, "ESPHome");
# it.print(it.get_width()/2, it.get_height()/2+20, id(font_std), TextAlign::CENTER, "@UTBDK");
touchscreen:
- platform: axs15231
id: main_touch
display: main_display
i2c_id: touchscreen_bus
update_interval: 100ms
# interrupt_pin:
# number: 3
# ignore_strapping_warning: true
calibration:
x_min: 0
x_max: 479
y_min: 0
y_max: 319
transform:
swap_xy: true
mirror_x: false
mirror_y: true
# on_touch:
# - lambda: |-
# Color newColor;
# do { newColor = Color::random_color(); } while (newColor == id(bgcolor));
# id(bgcolor) = newColor;
# ESP_LOGI("cal", "x=%d, y=%d, x_raw=%d, y_raw=%0d",
# touch.x,
# touch.y,
# touch.x_raw,
# touch.y_raw
# );
on_release:
- if:
condition: lvgl.is_paused
then:
- lvgl.resume:
- lvgl.widget.redraw:
- light.turn_on:
id: display_backlight
transition_length: 300ms
uart:
- id: ext_uart
tx_pin: 43
rx_pin: 44
baud_rate: 115200
stop_bits: 1
parity: NONE
binary_sensor:
- platform: homeassistant
id: exercise_room_light
entity_id: light.exercise_room
publish_initial_state: true
on_state:
then:
lvgl.widget.update:
id: exercise_room_light_btn
state:
checked: !lambda return x;
- platform: homeassistant
id: exercise_room_fan
entity_id: light.mcu_dimmer_exercise_room_fan
publish_initial_state: true
on_state:
then:
lvgl.widget.update:
id: exercise_room_fan_btn
state:
checked: !lambda return x;
lvgl:
buffer_size: 100%
log_level: WARN
color_depth: 16
default_font: montserrat_18
# on_idle:
# - timeout: !lambda "return (id(display_timeout).state * 1000);"
# then:
# - logger.log: "LVGL is idle"
# - light.turn_off:
# id: display_backlight
# transition_length: 2500ms
# - lvgl.pause:
top_layer:
widgets:
- buttonmatrix:
align: bottom_mid
# styles: header_footer
pad_all: 0
outline_width: 0
id: top_layer
# items:
# styles: header_footer
rows:
- buttons:
- id: page_prev
text: "\uF053"
on_press:
then:
lvgl.page.previous:
- id: page_home
text: "\uF015"
on_press:
then:
lvgl.page.show: main_page
- id: page_next
text: "\uF054"
on_press:
then:
lvgl.page.next:
pages:
- id: main_page
widgets:
- label:
text: "ESPHome LVGL Display"
align: CENTER
text_align: CENTER
text_color: 0xFFFFFF
- id: excercise_page
widgets:
- label:
align: CENTER
text: 'Hello World!'
- button:
id: exercise_room_light_btn
align: TOP_LEFT
width: 100
height: 70
checkable: true
widgets:
- label:
align: CENTER
text: 'Light'
on_click:
- homeassistant.action:
action: light.toggle
data:
entity_id: light.exercise_room
- button:
id: exercise_room_fan_btn
align: TOP_RIGHT
width: 100
height: 70
checkable: true
widgets:
- label:
align: CENTER
text: 'Fan'
on_click:
- homeassistant.action:
action: light.toggle
data:
entity_id: light.mcu_dimmer_exercise_room_fan