From bdbbff302d96aa7bb0b99f801969f64bcc71d415 Mon Sep 17 00:00:00 2001 From: Y1hsiaochunnn <66012385+Y1hsiaochunnn@users.noreply.github.com> Date: Tue, 14 Jan 2025 23:49:51 +0800 Subject: [PATCH] Added ESP32-S3-Touch-AMOLED-1.8 support (#63) * Added ESP32-S3-Touch-AMOLED-1.8 support * Add ESP32-S3-Touch-AMOLED-1.8 support README * Change the default image format --------- Co-authored-by: Xiaoxia --- README.md | 4 + README_en.md | 4 + README_ja.md | 4 + docs/waveshare-esp32-s3-touch-amoled-1.8.jpg | Bin 0 -> 47563 bytes main/CMakeLists.txt | 2 + main/Kconfig.projbuild | 2 + .../boards/esp32-s3-touch-amoled-1.8/config.h | 41 ++++ .../esp32-s3-touch-amoled-1.8.cc | 225 ++++++++++++++++++ main/idf_component.yml | 3 + 9 files changed, 285 insertions(+) create mode 100644 docs/waveshare-esp32-s3-touch-amoled-1.8.jpg create mode 100644 main/boards/esp32-s3-touch-amoled-1.8/config.h create mode 100644 main/boards/esp32-s3-touch-amoled-1.8/esp32-s3-touch-amoled-1.8.cc diff --git a/README.md b/README.md index 6a766cd2..c641012d 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,7 @@ - M5Stack CoreS3 - 神奇按钮 2.4 - 虾哥 Mini C3 +- 微雪电子 ESP32-S3-Touch-AMOLED-1.8
@@ -68,6 +69,9 @@ + + +
## 固件部分 diff --git a/README_en.md b/README_en.md index 77939738..7b517702 100644 --- a/README_en.md +++ b/README_en.md @@ -51,6 +51,7 @@ Breadboard setup shown below: - M5Stack CoreS3 - MagiClick 2.4 - Xmini C3 +- Waveshare ESP32-S3-Touch-AMOLED-1.8
@@ -68,6 +69,9 @@ Breadboard setup shown below: + + +
## Firmware Section diff --git a/README_ja.md b/README_ja.md index 8f9d3ceb..5af0945d 100644 --- a/README_ja.md +++ b/README_ja.md @@ -51,6 +51,7 @@ - M5Stack CoreS3 - MagiClick 2.4 - Xmini C3 +- Waveshare ESP32-S3-Touch-AMOLED-1.8
@@ -68,6 +69,9 @@ + + +
## ファームウェアセクション diff --git a/docs/waveshare-esp32-s3-touch-amoled-1.8.jpg b/docs/waveshare-esp32-s3-touch-amoled-1.8.jpg new file mode 100644 index 0000000000000000000000000000000000000000..90f2744745b4136b8fed56ae9ba05020c76820f9 GIT binary patch literal 47563 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.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 literal 0 HcmV?d00001 diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 132a05fe..1f798e24 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -65,6 +65,8 @@ elseif(CONFIG_BOARD_TYPE_XMINI_C3) set(BOARD_TYPE "xmini-c3") elseif(CONFIG_BOARD_TYPE_ESP32S3_KORVO2_V3) set(BOARD_TYPE "esp32s3-korvo2-v3") +elseif(CONFIG_BOARD_TYPE_ESP32S3_Touch_AMOLED_1_8) + set(BOARD_TYPE "esp32-s3-touch-amoled-1.8") endif() file(GLOB BOARD_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/boards/${BOARD_TYPE}/*.cc) list(APPEND SOURCES ${BOARD_SOURCES}) diff --git a/main/Kconfig.projbuild b/main/Kconfig.projbuild index 0c7c09f2..cba88f48 100644 --- a/main/Kconfig.projbuild +++ b/main/Kconfig.projbuild @@ -62,6 +62,8 @@ choice BOARD_TYPE bool "虾哥 Mini C3" config BOARD_TYPE_ESP32S3_KORVO2_V3 bool "ESP32S3_KORVO2_V3开发板" + config BOARD_TYPE_ESP32S3_Touch_AMOLED_1_8 + bool "Waveshare ESP32-S3-Touch-AMOLED-1.8" endchoice endmenu diff --git a/main/boards/esp32-s3-touch-amoled-1.8/config.h b/main/boards/esp32-s3-touch-amoled-1.8/config.h new file mode 100644 index 00000000..8b7522b0 --- /dev/null +++ b/main/boards/esp32-s3-touch-amoled-1.8/config.h @@ -0,0 +1,41 @@ +#ifndef _BOARD_CONFIG_H_ +#define _BOARD_CONFIG_H_ + +#include + +#define AUDIO_INPUT_SAMPLE_RATE 24000 +#define AUDIO_OUTPUT_SAMPLE_RATE 24000 +#define AUDIO_DEFAULT_OUTPUT_VOLUME 90 + +#define AUDIO_I2S_GPIO_MCLK GPIO_NUM_16 +#define AUDIO_I2S_GPIO_WS GPIO_NUM_45 +#define AUDIO_I2S_GPIO_BCLK GPIO_NUM_9 +#define AUDIO_I2S_GPIO_DIN GPIO_NUM_10 +#define AUDIO_I2S_GPIO_DOUT GPIO_NUM_8 + +#define AUDIO_CODEC_PA_PIN GPIO_NUM_46 +#define AUDIO_CODEC_I2C_SDA_PIN GPIO_NUM_15 +#define AUDIO_CODEC_I2C_SCL_PIN GPIO_NUM_14 +#define AUDIO_CODEC_ES8311_ADDR ES8311_CODEC_DEFAULT_ADDR + +#define BOOT_BUTTON_GPIO GPIO_NUM_0 + +#define EXAMPLE_PIN_NUM_LCD_CS GPIO_NUM_12 +#define EXAMPLE_PIN_NUM_LCD_PCLK GPIO_NUM_11 +#define EXAMPLE_PIN_NUM_LCD_DATA0 GPIO_NUM_4 +#define EXAMPLE_PIN_NUM_LCD_DATA1 GPIO_NUM_5 +#define EXAMPLE_PIN_NUM_LCD_DATA2 GPIO_NUM_6 +#define EXAMPLE_PIN_NUM_LCD_DATA3 GPIO_NUM_7 +#define EXAMPLE_PIN_NUM_LCD_RST GPIO_NUM_NC +#define DISPLAY_WIDTH 368 +#define DISPLAY_HEIGHT 448 +#define DISPLAY_MIRROR_X false +#define DISPLAY_MIRROR_Y false +#define DISPLAY_SWAP_XY false + +#define DISPLAY_OFFSET_X 0 +#define DISPLAY_OFFSET_Y 0 + +#define DISPLAY_BACKLIGHT_PIN GPIO_NUM_NC +#define DISPLAY_BACKLIGHT_OUTPUT_INVERT false +#endif // _BOARD_CONFIG_H_ diff --git a/main/boards/esp32-s3-touch-amoled-1.8/esp32-s3-touch-amoled-1.8.cc b/main/boards/esp32-s3-touch-amoled-1.8/esp32-s3-touch-amoled-1.8.cc new file mode 100644 index 00000000..dbcf512c --- /dev/null +++ b/main/boards/esp32-s3-touch-amoled-1.8/esp32-s3-touch-amoled-1.8.cc @@ -0,0 +1,225 @@ +#include "wifi_board.h" +#include "display/lcd_display.h" +#include "esp_lcd_sh8601.h" +#include "font_awesome_symbols.h" + +#include "audio_codecs/es8311_audio_codec.h" +#include "application.h" +#include "button.h" +#include "led/single_led.h" +#include "iot/thing_manager.h" +#include "config.h" +#include + +#include +#include +#include +#include + +#define TAG "waveshare_amoled_1_8" + +LV_FONT_DECLARE(font_puhui_14_1); +LV_FONT_DECLARE(font_awesome_30_1); +LV_FONT_DECLARE(font_awesome_14_1); + +static const sh8601_lcd_init_cmd_t vendor_specific_init[] = { + {0x11, (uint8_t[]){0x00}, 0, 120}, + {0x44, (uint8_t[]){0x01, 0xD1}, 2, 0}, + {0x35, (uint8_t[]){0x00}, 1, 0}, + {0x53, (uint8_t[]){0x20}, 1, 10}, + {0x2A, (uint8_t[]){0x00, 0x00, 0x01, 0x6F}, 4, 0}, + {0x2B, (uint8_t[]){0x00, 0x00, 0x01, 0xBF}, 4, 0}, + {0x51, (uint8_t[]){0x00}, 1, 10}, + {0x29, (uint8_t[]){0x00}, 0, 10}, + {0x51, (uint8_t[]){0xFF}, 1, 0}, +}; + +class SH8601Display : public LcdDisplay { +private: + lv_obj_t *user_messge_label_ = nullptr; + lv_obj_t *ai_messge_label_ = nullptr; +public: + SH8601Display(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_handle_t panel, + gpio_num_t backlight_pin, bool backlight_output_invert, + int width, int height, int offset_x, int offset_y, bool mirror_x, bool mirror_y, bool swap_xy) + : LcdDisplay(panel_io, panel, backlight_pin, backlight_output_invert, width, height, offset_x, offset_y, mirror_x, mirror_y, swap_xy) {} + + void SetChatMessage(const std::string &role, const std::string &content) override { + if (ai_messge_label_== nullptr || user_messge_label_== nullptr) { + return; + } + + DisplayLockGuard lock(this); + ESP_LOGI(TAG, "role:%s", role.c_str()); + if(role == "assistant") { + std::string new_content = "AI: " + content; + lv_label_set_text(ai_messge_label_, new_content.c_str()); + } else if(role == "user") { + std::string new_content = "User: " + content; + lv_label_set_text(user_messge_label_, new_content.c_str()); + } else{ + lv_label_set_text(ai_messge_label_, "AI: "); + lv_label_set_text(user_messge_label_, "User: "); + } + } + + void SetupUI() override { + DisplayLockGuard lock(this); + + lv_obj_del(chat_message_label_); + + lv_obj_set_flex_align(content_, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_SPACE_EVENLY); // 子对象居中对齐,等距分布 + + lv_obj_set_style_text_font(emotion_label_, &font_awesome_30_1, 0); + lv_label_set_text(emotion_label_, FONT_AWESOME_AI_CHIP); + lv_obj_align(emotion_label_, LV_ALIGN_TOP_MID, 0, -10); // 左侧居中,向右偏移10个单位 + + static lv_style_t style_msg; + lv_style_init(&style_msg); + lv_style_set_width(&style_msg, LV_HOR_RES - 25); + + user_messge_label_ = lv_label_create(content_); + lv_obj_set_style_text_font(user_messge_label_, &font_puhui_14_1, 0); + lv_label_set_text(user_messge_label_, "User: "); + lv_obj_add_style(user_messge_label_, &style_msg, 0); + lv_obj_align(user_messge_label_, LV_ALIGN_TOP_LEFT, 2, 25); + + ai_messge_label_ = lv_label_create(content_); + lv_obj_set_style_text_font(ai_messge_label_, &font_puhui_14_1, 0); + lv_label_set_text(ai_messge_label_, "AI: "); + lv_obj_add_style(ai_messge_label_, &style_msg, 0); + lv_obj_align(ai_messge_label_, LV_ALIGN_TOP_LEFT, 2, 77); + } +}; + + + +class waveshare_amoled_1_8 : public WifiBoard { +private: + i2c_master_bus_handle_t codec_i2c_bus_; + Button boot_button_; + SH8601Display* display_; + + void InitializeCodecI2c() { + // Initialize I2C peripheral + i2c_master_bus_config_t i2c_bus_cfg = { + .i2c_port = I2C_NUM_0, + .sda_io_num = AUDIO_CODEC_I2C_SDA_PIN, + .scl_io_num = AUDIO_CODEC_I2C_SCL_PIN, + .clk_source = I2C_CLK_SRC_DEFAULT, + .glitch_ignore_cnt = 7, + .intr_priority = 0, + .trans_queue_depth = 0, + .flags = { + .enable_internal_pullup = 1, + }, + }; + ESP_ERROR_CHECK(i2c_new_master_bus(&i2c_bus_cfg, &codec_i2c_bus_)); + } + + void InitializeSpi() { + spi_bus_config_t buscfg = {}; + buscfg.sclk_io_num = GPIO_NUM_11; + buscfg.data0_io_num = GPIO_NUM_4; + buscfg.data1_io_num = GPIO_NUM_5; + buscfg.data2_io_num = GPIO_NUM_6; + buscfg.data3_io_num = GPIO_NUM_7; + buscfg.max_transfer_sz = DISPLAY_WIDTH * DISPLAY_HEIGHT * sizeof(uint16_t); + buscfg.flags = SPICOMMON_BUSFLAG_QUAD; + ESP_ERROR_CHECK(spi_bus_initialize(SPI2_HOST, &buscfg, SPI_DMA_CH_AUTO)); + } + + void InitializeButtons() { + boot_button_.OnClick([this]() { + auto& app = Application::GetInstance(); + if (app.GetDeviceState() == kDeviceStateStarting && !WifiStation::GetInstance().IsConnected()) { + ResetWifiConfiguration(); + } + app.ToggleChatState(); + }); + boot_button_.OnPressDown([this]() { + Application::GetInstance().StartListening(); + }); + boot_button_.OnPressUp([this]() { + Application::GetInstance().StopListening(); + }); + } + + void InitializeSH8601Display() { + esp_lcd_panel_io_handle_t panel_io = nullptr; + esp_lcd_panel_handle_t panel = nullptr; + + // 液晶屏控制IO初始化 + ESP_LOGD(TAG, "Install panel IO"); + esp_lcd_panel_io_spi_config_t io_config = SH8601_PANEL_IO_QSPI_CONFIG( + EXAMPLE_PIN_NUM_LCD_CS, + nullptr, + nullptr + ); + ESP_ERROR_CHECK(esp_lcd_new_panel_io_spi(SPI2_HOST, &io_config, &panel_io)); + + // 初始化液晶屏驱动芯片 + ESP_LOGD(TAG, "Install LCD driver"); + const sh8601_vendor_config_t vendor_config = { + .init_cmds = &vendor_specific_init[0], + .init_cmds_size = sizeof(vendor_specific_init) / sizeof(sh8601_lcd_init_cmd_t), + .flags ={ + .use_qspi_interface = 1, + } + }; + + esp_lcd_panel_dev_config_t panel_config = {}; + panel_config.reset_gpio_num = GPIO_NUM_NC; + panel_config.flags.reset_active_high = 1, + panel_config.rgb_ele_order = LCD_RGB_ELEMENT_ORDER_RGB; + panel_config.bits_per_pixel = 16; + panel_config.vendor_config = (void *)&vendor_config; + ESP_ERROR_CHECK(esp_lcd_new_panel_sh8601(panel_io, &panel_config, &panel)); + + esp_lcd_panel_reset(panel); + esp_lcd_panel_init(panel); + esp_lcd_panel_invert_color(panel, true); + esp_lcd_panel_swap_xy(panel, DISPLAY_SWAP_XY); + esp_lcd_panel_mirror(panel, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y); + esp_lcd_panel_disp_on_off(panel, true); + display_ = new SH8601Display(panel_io, panel, DISPLAY_BACKLIGHT_PIN, DISPLAY_BACKLIGHT_OUTPUT_INVERT, + DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_OFFSET_X, DISPLAY_OFFSET_Y, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, DISPLAY_SWAP_XY); + if (display_) { + display_->SetupUI(); + } else { + ESP_LOGE(TAG, "Display is not initialized!"); + } + + } + + // 物联网初始化,添加对 AI 可见设备 + void InitializeIot() { + auto& thing_manager = iot::ThingManager::GetInstance(); + thing_manager.AddThing(iot::CreateThing("Speaker")); + } + +public: + waveshare_amoled_1_8() : + boot_button_(BOOT_BUTTON_GPIO) { + InitializeCodecI2c(); + InitializeSpi(); + InitializeSH8601Display(); + InitializeButtons(); + InitializeIot(); + } + + virtual AudioCodec* GetAudioCodec() override { + static Es8311AudioCodec audio_codec(codec_i2c_bus_, I2C_NUM_0, AUDIO_INPUT_SAMPLE_RATE, AUDIO_OUTPUT_SAMPLE_RATE, + AUDIO_I2S_GPIO_MCLK, AUDIO_I2S_GPIO_BCLK, AUDIO_I2S_GPIO_WS, AUDIO_I2S_GPIO_DOUT, AUDIO_I2S_GPIO_DIN, + AUDIO_CODEC_PA_PIN, AUDIO_CODEC_ES8311_ADDR); + + return &audio_codec; + + } + + virtual Display* GetDisplay() override { + return display_; + } +}; + +DECLARE_BOARD(waveshare_amoled_1_8); diff --git a/main/idf_component.yml b/main/idf_component.yml index e81d0bd2..2637619c 100644 --- a/main/idf_component.yml +++ b/main/idf_component.yml @@ -1,5 +1,8 @@ ## IDF Component Manager Manifest File dependencies: + waveshare/esp_lcd_sh8601: + version: "1.0.1" + public: true espressif/esp_lcd_ili9341: "==1.2.0" espressif/esp_lcd_gc9a01: "^2.0.1" 78/esp_lcd_nv3023: "~1.0.0"