From 3069ca173e0c64e1f7ecd973173dc31cf751da5d Mon Sep 17 00:00:00 2001 From: Jan Grewe <jan@faked.org> Date: Sat, 27 Jul 2024 17:21:49 +0200 Subject: [PATCH] add 8048S070 --- growbox-screen.yaml | 7 +- packages/base.yaml | 8 +- packages/esp32.yaml | 4 +- ...splay_cyd2usb.yaml => esp32_2432S028.yaml} | 29 +- packages/esp32s3.yaml | 7 +- packages/esp32s3_8048S070.yaml | 135 +++++++++ packages/partition_tables/esp32s3_16MB.csv | 7 + packages/screen.yaml | 101 +++---- packages/screen_lvgl.yaml | 265 ++++++++++++++++++ packages/water_ads1115.yaml | 1 + 10 files changed, 487 insertions(+), 77 deletions(-) rename packages/{display_cyd2usb.yaml => esp32_2432S028.yaml} (87%) create mode 100644 packages/esp32s3_8048S070.yaml create mode 100644 packages/partition_tables/esp32s3_16MB.csv create mode 100644 packages/screen_lvgl.yaml diff --git a/growbox-screen.yaml b/growbox-screen.yaml index bb6fec4..124850c 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 ff4a3ab..d50848f 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 4f0ac59..29f786a 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 db2e010..90f86d1 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 7247466..1b21b11 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 0000000..23dc110 --- /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 0000000..28511d0 --- /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 5387051..a63666c 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 0000000..536c14a --- /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 00ffeef..8f47596 100644 --- a/packages/water_ads1115.yaml +++ b/packages/water_ads1115.yaml @@ -1,3 +1,4 @@ ads1115: - address: 0x48 id: ads1115_phec + continuous_mode: true -- GitLab