diff --git a/growbox-screen.yaml b/growbox-screen.yaml
index bb6fec4f6a007c54cd79b15e07223953d3066fb6..124850ca4853312025b516208649e8157574cff0 100644
--- a/growbox-screen.yaml
+++ b/growbox-screen.yaml
@@ -4,8 +4,9 @@ substitutions:
 
 packages:
   base:           !include packages/base.yaml
-  esp32:          !include packages/esp32.yaml
+  #board:          !include packages/esp32_2432S028.yaml  # ESP32-2432S028R / CYD2USB, 320x240, 2.8"
+  board:          !include packages/esp32s3_8048S070.yaml # ESP32S3-8048S070, 800x490, 7.0"
   time:           !include packages/time.yaml
   mqtt:           !include packages/mqtt.yaml
-  display:        !include packages/display_cyd2usb.yaml
-  screen:         !include packages/screen.yaml
+  #screen:         !include packages/screen.yaml
+  screen:         !include packages/screen_lvgl.yaml
diff --git a/packages/base.yaml b/packages/base.yaml
index ff4a3ab37af432cd8f29a5058109b17fb2edcc8c..d50848f5b78ca2202002b3f80cd41ce47e466136 100644
--- a/packages/base.yaml
+++ b/packages/base.yaml
@@ -96,7 +96,7 @@ text_sensor:
       uint32_t dur = id(device_uptime_seconds).state;
       int dys = 0;
       int hrs = 0;
-      int mnts = 0;
+      int mns = 0;
       if (dur > 86399) {
         dys = trunc(dur / 86400);
         dur = dur - (dys * 86400);
@@ -106,11 +106,11 @@ text_sensor:
         dur = dur - (hrs * 3600);
       }
       if (dur > 59) {
-        mnts = trunc(dur / 60);
-        dur = dur - (mnts * 60);
+        mns = trunc(dur / 60);
+        dur = dur - (mns * 60);
       }
       char buffer[38];
-      sprintf(buffer, "%ud %02uh %02um %02us", dys, hrs, mnts, dur);
+      sprintf(buffer, "%ud %02uh %02um %02us", (int)dys, (int)hrs, (int)mns, (int)dur);
       return {buffer};
 
 button:
diff --git a/packages/esp32.yaml b/packages/esp32.yaml
index 4f0ac5965480a209dcca33a5db36e1d954fdcd5d..29f786a4cc802d7f4edda6a318e234d2758e1353 100644
--- a/packages/esp32.yaml
+++ b/packages/esp32.yaml
@@ -3,7 +3,7 @@ esp32:
   framework:
     type: arduino
 
-i2c:
-
 wifi:
   power_save_mode: none
+
+i2c:
diff --git a/packages/display_cyd2usb.yaml b/packages/esp32_2432S028.yaml
similarity index 87%
rename from packages/display_cyd2usb.yaml
rename to packages/esp32_2432S028.yaml
index db2e010db9be91d219944b416080a5014f0662db..90f86d1eb0e6e4486b6cf3ca98426d7c5f6d1931 100644
--- a/packages/display_cyd2usb.yaml
+++ b/packages/esp32_2432S028.yaml
@@ -1,3 +1,20 @@
+esp32:
+  board: esp32dev
+  framework:
+    type: arduino
+
+wifi:
+  power_save_mode: none
+
+globals:
+  - id: recent_touch
+    type: bool
+    initial_value: 'true'
+  - id: screen_timeout_short
+    type: bool
+  - id: screen_timeout_long
+    type: bool
+
 i2c:
   sda: 27
   scan: false
@@ -44,8 +61,6 @@ touchscreen:
     y_max: 3860
   transform:
     mirror_x: true
-  # When the display is touched, turn on the backlight,
-  # store that we had a recent touch, and update the UI
   on_touch:
     then:
       - light.turn_on:
@@ -115,7 +130,7 @@ interval:
   - interval: 10s
     then:
       - lambda: |-
-          // dim the display to 50% after 10s, and to 25% after 20s
+          // dim the display to 66% after 10s, and to 33% after 20s
           if (id(recent_touch))
           {
             id(recent_touch) = false;
@@ -126,17 +141,13 @@ interval:
             id(screen_timeout_short) = false;
             id(screen_timeout_long) = true;
             auto call = id(backlight).turn_on();
-            call.set_brightness(0.5);
+            call.set_brightness(0.66);
             call.perform();
           }
           else if (id(screen_timeout_long))
           {
             id(screen_timeout_long) = false;
             auto call = id(backlight).turn_on();
-            call.set_brightness(0.25);
+            call.set_brightness(0.33);
             call.perform();
           }
-
-button:
-  - platform: factory_reset
-    name: Factory Reset
diff --git a/packages/esp32s3.yaml b/packages/esp32s3.yaml
index 724746624bf53f18e2e8ed27fd78e308b226e9b5..1b21b1100a4e308dba42bea938a7b96a65e13c27 100644
--- a/packages/esp32s3.yaml
+++ b/packages/esp32s3.yaml
@@ -1,5 +1,6 @@
 esp32:
   board: esp32-s3-devkitc-1
+  variant: esp32s3
   framework:
     type: arduino
 
@@ -19,10 +20,10 @@ status_led:
     number: GPIO21
     inverted: True
 
+wifi:
+  power_save_mode: none
+
 i2c:
   sda: 5
   scl: 6
   frequency: 100khz
-
-wifi:
-  power_save_mode: none
diff --git a/packages/esp32s3_8048S070.yaml b/packages/esp32s3_8048S070.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..23dc110a3ff8b364e978bd3e2caa96561b3d220c
--- /dev/null
+++ b/packages/esp32s3_8048S070.yaml
@@ -0,0 +1,135 @@
+esp32:
+  board: esp32-s3-devkitc-1
+  variant: esp32s3
+  flash_size: 16MB
+  partitions: "packages/partition_tables/esp32s3_16MB.csv"
+  framework:
+    type: esp-idf
+    # Required to achieve sufficient PSRAM bandwidth
+    sdkconfig_options:
+      CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240: y
+      CONFIG_ESP32S3_DATA_CACHE_64KB: y
+      CONFIG_SPIRAM_FETCH_INSTRUCTIONS: y
+      CONFIG_SPIRAM_RODATA: y
+
+esphome:
+  platformio_options:
+    build_flags: "-D BOARD_HAS_PSRAM"
+    board_build.esp-idf.memory_type: qio_opi
+    board_build.f_flash: 80000000L
+    board_build.flash_mode: qio
+
+external_components:
+  - source: github://pr#6363
+    refresh: 10min
+    components: [lvgl]
+
+psram:
+  mode: octal
+  speed: 80MHz
+
+wifi:
+  power_save_mode: none
+
+globals:
+  - id: recent_touch
+    type: bool
+    initial_value: 'true'
+  - id: screen_timeout
+    type: bool
+
+i2c:
+  sda: 19
+  scl: 20
+
+display:
+  - platform: rpi_dpi_rgb
+    id: esp_display
+    color_order: RGB
+    update_interval: never
+    auto_clear_enabled: false
+    dimensions:
+      width: 800
+      height: 480
+    rotation: 270°
+    de_pin: 41
+    hsync_pin: 39
+    vsync_pin: 40
+    pclk_pin: 42
+    pclk_frequency: 16MHz
+    data_pins:
+      red:
+        - 14  #r1
+        - 21  #r2
+        - 47  #r3
+        - 48  #r4
+        - 45  #r5
+      green:
+        - 9   #g0
+        - 46  #g1
+        - 3   #g2
+        - 8   #g3
+        - 16  #g4
+        - 1   #g5
+      blue:
+        - 15  #b1
+        - 7   #b2
+        - 6   #b3
+        - 5   #b4
+        - 4   #b5
+
+touchscreen:
+  platform: gt911
+  id: esp_touchscreen
+  on_touch:
+    then:
+      - light.turn_on:
+          id: backlight
+          brightness: 100%
+      - lambda: |-
+          id(recent_touch) = true;
+
+output:
+  - platform: ledc
+    pin: 2
+    max_power: 0.6
+    frequency: 1220Hz
+    id: backlight_pwm
+
+light:
+  - platform: monochromatic
+    output: backlight_pwm
+    name: Display Backlight
+    id: backlight
+    restore_mode: ALWAYS_ON
+
+interval:
+  - interval: 10s
+    then:
+      - lambda: |-
+          // dim the display to 80% after 10s
+          if (id(recent_touch))
+          {
+            id(recent_touch) = false;
+            id(screen_timeout) = true;
+          }
+          else if (id(screen_timeout)) 
+          {
+            id(screen_timeout) = false;
+            auto call = id(backlight).turn_on();
+            call.set_brightness(0.8);
+            call.perform();
+          }
+
+number:
+  - platform: template
+    name: LVGL Screen timeout
+    optimistic: true
+    id: display_timeout
+    unit_of_measurement: "s"
+    initial_value: 45
+    restore_value: true
+    min_value: 10
+    max_value: 180
+    step: 5
+    mode: box
diff --git a/packages/partition_tables/esp32s3_16MB.csv b/packages/partition_tables/esp32s3_16MB.csv
new file mode 100644
index 0000000000000000000000000000000000000000..28511d0af9ae96bbe64a0d03dbdb133b6a3b986e
--- /dev/null
+++ b/packages/partition_tables/esp32s3_16MB.csv
@@ -0,0 +1,7 @@
+# Name,   Type, SubType, Offset,  Size, Flags
+nvs,      data, nvs,     0x9000,  0x5000,
+otadata,  data, ota,     0xe000,  0x2000,
+app0,     app,  ota_0,   0x10000, 0x640000,
+app1,     app,  ota_1,   0x650000,0x640000,
+spiffs,   data, spiffs,  0xc90000,0x360000,
+coredump, data, coredump,0xFF0000,0x10000,
\ No newline at end of file
diff --git a/packages/screen.yaml b/packages/screen.yaml
index 5387051203ddad4a955a079079be05c15b17b345..a63666c42dfe1cce144d9976ffda22890f651022 100644
--- a/packages/screen.yaml
+++ b/packages/screen.yaml
@@ -3,13 +3,6 @@ substitutions:
   graph_grid_x: 1min
 
 globals:
-  - id: recent_touch
-    type: bool
-    initial_value: 'true'
-  - id: screen_timeout_short
-    type: bool
-  - id: screen_timeout_long
-    type: bool
   - id: temperature
     type: float
     initial_value: '0.0'
@@ -37,30 +30,30 @@ image:
     id: growsmart
     type: RGB24
 
-binary_sensor:
-  - platform: touchscreen
-    name: "LED Default"
-    x_min: 0
-    x_max: 120
-    y_min: 0
-    y_max: 320
-    on_press:
-      then:
-        - light.turn_on:
-            id: led
-            effect: Default
+# binary_sensor:
+#   - platform: touchscreen
+#     name: "LED Default"
+#     x_min: 0
+#     x_max: 120
+#     y_min: 0
+#     y_max: 320
+#     on_press:
+#       then:
+#         - light.turn_on:
+#             id: led
+#             effect: Default
 
-  - platform: touchscreen
-    name: "LED Alert"
-    x_min: 120
-    x_max: 240
-    y_min: 0
-    y_max: 320
-    on_press:
-      then:
-        - light.turn_on:
-            id: led
-            effect: Alert
+#   - platform: touchscreen
+#     name: "LED Alert"
+#     x_min: 120
+#     x_max: 240
+#     y_min: 0
+#     y_max: 320
+#     on_press:
+#       then:
+#         - light.turn_on:
+#             id: led
+#             effect: Alert
 
 script:
   - id: update_display
@@ -72,13 +65,13 @@ script:
             return;
           }
           esp_display->fill(id(Color::BLACK));
-          esp_display->printf(0,   0, id(font_default), "Temperature: %.2f °C", id(temperature));
+          esp_display->printf(0,   0, id(font_default), "Temperature: %.2f °C (1.0)", id(temperature));
           esp_display->graph(0,   18, id(graph_temperature));
-          esp_display->printf(0,  80, id(font_default), "Humidity: %.2f%%", id(humidity));
+          esp_display->printf(0,  80, id(font_default), "Humidity: %.2f%% (1.0)", id(humidity));
           esp_display->graph(0,   98, id(graph_humidity));
-          esp_display->printf(0, 160, id(font_default), "pH: %.2f", id(ph));
+          esp_display->printf(0, 160, id(font_default), "pH: %.2f (0.1)", id(ph));
           esp_display->graph(0,  178, id(graph_ph));
-          esp_display->printf(0, 240, id(font_default), "EC: %.2f mS", id(ec));
+          esp_display->printf(0, 240, id(font_default), "EC: %.2f mS (0.1)", id(ec));
           esp_display->graph(0,  258, id(graph_ec));
 
 color:
@@ -102,14 +95,13 @@ graph:
     y_grid: 1.0
     width: 240
     height: 60
-    min_value: 18
-    max_value: 32
-    min_range: 2
-    max_range: 2
+    # min_value: 18
+    # max_value: 32
+    # min_range: 2
+    # max_range: 2
     traces:
       - sensor: mqtt_temperature
         continuous: true
-        #line_thickness: 2
         color: color_green
   - id: graph_humidity
     duration: ${graph_duration}
@@ -117,44 +109,41 @@ graph:
     y_grid: 1.0
     width: 240
     height: 60
-    min_value: 40
-    max_value: 90
-    min_range: 2
-    max_range: 2
+    # min_value: 40
+    # max_value: 90
+    # min_range: 2
+    # max_range: 2
     traces:
       - sensor: mqtt_humidity
         continuous: true
-        #line_thickness: 2
         color: color_green
   - id: graph_ph
     duration: ${graph_duration}
     x_grid: ${graph_grid_x}
-    y_grid: 1.0
+    y_grid: 0.1
     width: 240
     height: 60
-    min_value: 4
-    max_value: 8
-    min_range: 2
-    max_range: 2
+    # min_value: 4
+    # max_value: 8
+    # min_range: 2
+    # max_range: 2
     traces:
       - sensor: mqtt_ph
         continuous: true
-        #line_thickness: 2
         color: color_green
   - id: graph_ec
     duration: ${graph_duration}
     x_grid: ${graph_grid_x}
-    y_grid: 1.0
+    y_grid: 0.1
     width: 240
     height: 60
-    min_value: 0
-    max_value: 3
-    min_range: 2
-    max_range: 2
+    # min_value: 0
+    # max_value: 3
+    # min_range: 2
+    # max_range: 2
     traces:
       - sensor: mqtt_ec
         continuous: true
-        #line_thickness: 2
         color: color_green
 
 sensor:
diff --git a/packages/screen_lvgl.yaml b/packages/screen_lvgl.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..536c14ae94e0f0ef26216d608b4bd2f537c8ad4b
--- /dev/null
+++ b/packages/screen_lvgl.yaml
@@ -0,0 +1,265 @@
+esphome:
+  on_boot:
+    - delay: 3s
+    - lvgl.widget.hide: boot_screen
+
+sensor:
+  - platform: mqtt_subscribe
+    id: mqtt_temperature
+    name: "Temperature"
+    topic: growsmart/growbox/sensor/air__temperature/state
+    on_value:
+      - lvgl.indicator.update:
+          id: guage_temp
+          value: !lambda return x;
+      - lvgl.label.update:
+          id: text_temp
+          text:
+            format: "%.0f"
+            args: ["x"]
+  - platform: mqtt_subscribe
+    id: mqtt_humidity
+    name: "Humidity"
+    topic: growsmart/growbox/sensor/air__humidity/state
+  - platform: mqtt_subscribe
+    id: mqtt_ec
+    name: "EC"
+    topic: growsmart/growbox/sensor/ec/state
+  - platform: mqtt_subscribe
+    id: mqtt_ph
+    name: "pH"
+    topic: growsmart/growbox/sensor/ph/state
+
+image:
+  - file: "img/screen_growsmart.png"
+    id: boot_logo
+    resize: 240x320
+    type: RGB565
+    #use_transparency: true
+
+font:
+  - file:
+      type: gfonts
+      family: Roboto
+      weight: 700
+    id: font_default
+    size: 16
+
+lvgl:
+  displays:
+    - esp_display
+  touchscreens:
+    - esp_touchscreen
+  theme:
+    label:
+      text_font: font_default # set all your labels to use your custom defined font
+    btn:
+      bg_color: 0x2F8CD8
+      bg_grad_color: 0x005782
+      bg_grad_dir: VER
+      bg_opa: COVER
+      border_color: 0x0077b3
+      border_width: 1
+      text_color: 0xFFFFFF
+      pressed: # set some btn colors to be different in pressed state
+        bg_color: 0x006699
+        bg_grad_color: 0x00334d
+      checked: # set some btn colors to be different in checked state
+        bg_color: 0x1d5f96
+        bg_grad_color: 0x03324A
+        text_color: 0xfff300
+    btnmatrix:
+      bg_opa: TRANSP
+      border_color: 0x0077b3
+      border_width: 0
+      text_color: 0xFFFFFF
+      pad_all: 0
+      items: # set all your btnmatrix buttons to use your custom defined styles and font
+        bg_color: 0x2F8CD8
+        bg_grad_color: 0x005782
+        bg_grad_dir: VER
+        bg_opa: COVER
+        border_color: 0x0077b3
+        border_width: 1
+        text_color: 0xFFFFFF
+        text_font: montserrat_14
+        pressed:
+          bg_color: 0x006699
+          bg_grad_color: 0x00334d
+        checked:
+          bg_color: 0x1d5f96
+          bg_grad_color: 0x03324A
+          text_color: 0x005580
+    switch:
+      bg_color: 0xC0C0C0
+      bg_grad_color: 0xb0b0b0
+      bg_grad_dir: VER
+      bg_opa: COVER
+      checked:
+        bg_color: 0x1d5f96
+        bg_grad_color: 0x03324A
+        bg_grad_dir: VER
+        bg_opa: COVER
+      knob:
+        bg_color: 0xFFFFFF
+        bg_grad_color: 0xC0C0C0
+        bg_grad_dir: VER
+        bg_opa: COVER
+    slider:
+      border_width: 1
+      border_opa: 15%
+      bg_color: 0xcccaca
+      bg_opa: 15%
+      indicator:
+        bg_color: 0x1d5f96
+        bg_grad_color: 0x03324A
+        bg_grad_dir: VER
+        bg_opa: COVER
+      knob:
+        bg_color: 0x2F8CD8
+        bg_grad_color: 0x005782
+        bg_grad_dir: VER
+        bg_opa: COVER
+        border_color: 0x0077b3
+        border_width: 1
+        text_color: 0xFFFFFF
+  style_definitions:
+    - id: header_footer
+      bg_color: 0x2F8CD8
+      bg_grad_color: 0x005782
+      bg_grad_dir: VER
+      bg_opa: COVER
+      border_width: 0
+      radius: 0
+      pad_all: 0
+      pad_row: 0
+      pad_column: 0
+      border_color: 0x0077b3
+      text_color: 0xFFFFFF
+      width: 100%
+      height: 30
+      text_font: montserrat_14
+  top_layer:
+    widgets:
+      - btnmatrix:
+          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:
+      # make sure it's the last one in this list:
+      - obj:
+          id: boot_screen
+          x: 0
+          y: 0
+          width: 100%
+          height: 100%
+          bg_color: 0x000000
+          bg_opa: COVER
+          radius: 0
+          pad_all: 0
+          border_width: 0
+          widgets:
+            - img:
+                align: CENTER
+                src: boot_logo
+                y: -40
+            - spinner:
+                align: CENTER
+                y: 95
+                height: 50
+                width: 50
+                spin_time: 1s
+                arc_length: 60deg
+                arc_width: 8
+                indicator:
+                  arc_color: 0x35B56A
+                  arc_width: 8
+          on_press:
+            - lvgl.widget.hide: boot_screen
+  pages:
+    - id: main_page
+      widgets:
+        - obj:
+            height: 240
+            width: 240
+            align: CENTER
+            bg_color: 0x000000
+            border_width: 0
+            pad_all: 4
+            widgets:
+              - meter:
+                  height: 100%
+                  width: 100%
+                  border_width: 0
+                  bg_opa: TRANSP
+                  align: CENTER
+                  scales:
+                    - range_from: 14
+                      range_to: 29
+                      angle_range: 180 # sets the total angle to 180 = starts mid left and ends mid right
+                      ticks:
+                        count: 0
+                      indicators:
+                        - line:
+                            id: guage_temp
+                            width: 8
+                            r_mod: 12 # sets line length by this much difference from the scale default radius
+                            value: -2
+                        - arc: # first half of the scale background
+                            color: 0xFF0000
+                            r_mod: 10 # radius difference from the scale default radius
+                            width: 31
+                            start_value: 14
+                            end_value: 15
+                        - arc: # second half of the scale background
+                            color: 0x00FF00
+                            r_mod: 10
+                            width: 31
+                            start_value: 15
+                            end_value: 18
+              - obj: # to cover the middle part of meter indicator line
+                  height: 146
+                  width: 146
+                  radius: 73
+                  align: CENTER
+                  border_width: 0
+                  bg_color: 0x000000
+                  pad_all: 0
+              - label: # gauge numeric indicator
+                  id: text_temp
+                  text_font: montserrat_48
+                  align: CENTER
+                  y: -5
+                  text: "0"
+              - label: # lower range indicator
+                  text_font: montserrat_18
+                  align: CENTER
+                  y: 8
+                  x: -90
+                  text: "14"
+              - label: # higher range indicator
+                  text_font: montserrat_18
+                  align: CENTER
+                  y: 8
+                  x: 90
+                  text: "29"
diff --git a/packages/water_ads1115.yaml b/packages/water_ads1115.yaml
index 00ffeef48ac8b4367a1c54bd5e882bb4a42cd89e..8f4759621440bf5bb3ca761f6c8b0b41a3d075ea 100644
--- a/packages/water_ads1115.yaml
+++ b/packages/water_ads1115.yaml
@@ -1,3 +1,4 @@
 ads1115:
   - address: 0x48
     id: ads1115_phec
+    continuous_mode: true