From dc118d2f24a634023c3626fa7935a62bf0f9f8c4 Mon Sep 17 00:00:00 2001 From: WMnologo <47595794+WMnologo@users.noreply.github.com> Date: Sat, 22 Feb 2025 02:55:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9C=A8README.md=E4=B8=AD=E5=8A=A0=E5=85=A5?= =?UTF-8?q?=E4=BA=86=E6=98=9F=E6=99=BA=E5=BC=80=E5=8F=91=E6=9D=BF=E3=80=82?= =?UTF-8?q?=20=20=E4=BF=AE=E6=94=B9=E4=BA=86=E6=98=9F=E6=99=BA=E5=BC=80?= =?UTF-8?q?=E5=8F=91=E6=9D=BF=E7=9A=84=E5=88=86=E6=94=AF=EF=BC=8C=E5=AF=B9?= =?UTF-8?q?0.96oled=E3=80=811.54tft=E5=B1=8F=E5=B9=95=E7=BB=86=E5=88=86?= =?UTF-8?q?=E4=BA=86wifi=E5=92=8C4g=E4=B8=A4=E4=B8=AA=E7=89=88=E6=9C=AC=20?= =?UTF-8?q?(#210)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update README.md * Add files via upload * Update README.md * Update README.md * Update README.md * 修改了星智的版级配置,对0.96oled、1.54tft屏幕细分了wifi和4g两个版本 * 修改了星知开发板支持,对0.96oled、1.54tft屏幕都细分了4g和wifi两个版本 --------- Co-authored-by: WMnologo <200~limaohui2016@icloud.com> --- README.md | 9 +- docs/v1/wmnologo_xingzhi_0.96.jpg | Bin 0 -> 24754 bytes docs/v1/wmnologo_xingzhi_1.54.jpg | Bin 0 -> 52550 bytes main/CMakeLists.txt | 12 +- main/Kconfig.projbuild | 12 +- .../xingzhi-cube-0.96oled-ml307/config.h | 30 ++++ .../xingzhi-cube-0.96oled-ml307/config.json | 9 ++ .../xingzhi-cube-0.96oled-ml307.cc | 112 ++++++++++++++ .../config.h | 1 - .../config.json | 2 +- .../xingzhi-cube-0.96oled-wifi.cc} | 10 +- .../config.h | 24 +-- .../xingzhi-cube-1.54tft-ml307/config.json | 9 ++ .../xingzhi-cube-1.54tft-ml307.cc | 140 ++++++++++++++++++ .../boards/xingzhi-cube-1.54tft-wifi/config.h | 36 +++++ .../config.json | 2 +- .../xingzhi-cube-1.54tft-wifi.cc} | 109 +++++++------- 17 files changed, 428 insertions(+), 89 deletions(-) create mode 100644 docs/v1/wmnologo_xingzhi_0.96.jpg create mode 100644 docs/v1/wmnologo_xingzhi_1.54.jpg create mode 100644 main/boards/xingzhi-cube-0.96oled-ml307/config.h create mode 100644 main/boards/xingzhi-cube-0.96oled-ml307/config.json create mode 100644 main/boards/xingzhi-cube-0.96oled-ml307/xingzhi-cube-0.96oled-ml307.cc rename main/boards/{xingzhi-cube-oled => xingzhi-cube-0.96oled-wifi}/config.h (99%) rename main/boards/{xingzhi-cube-oled => xingzhi-cube-0.96oled-wifi}/config.json (67%) rename main/boards/{xingzhi-cube-oled/xingzhi-cube-oled.cc => xingzhi-cube-0.96oled-wifi/xingzhi-cube-0.96oled-wifi.cc} (93%) rename main/boards/{xingzhi-cube-tft => xingzhi-cube-1.54tft-ml307}/config.h (66%) create mode 100644 main/boards/xingzhi-cube-1.54tft-ml307/config.json create mode 100644 main/boards/xingzhi-cube-1.54tft-ml307/xingzhi-cube-1.54tft-ml307.cc create mode 100644 main/boards/xingzhi-cube-1.54tft-wifi/config.h rename main/boards/{xingzhi-cube-tft => xingzhi-cube-1.54tft-wifi}/config.json (68%) rename main/boards/{xingzhi-cube-tft/xingzhi-cube-tft.cc => xingzhi-cube-1.54tft-wifi/xingzhi-cube-1.54tft-wifi.cc} (68%) diff --git a/README.md b/README.md index dc0173a5..c5c8f410 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,8 @@ - LILYGO T-Circle-S3 - 虾哥 Mini C3 - Moji 小智AI衍生版 - +- 无名科技Nologo-星智-1.54TFT +- 无名科技Nologo-星智-0.96TFT
@@ -89,6 +90,12 @@ + + + + + +
## 固件部分 diff --git a/docs/v1/wmnologo_xingzhi_0.96.jpg b/docs/v1/wmnologo_xingzhi_0.96.jpg new file mode 100644 index 0000000000000000000000000000000000000000..24369ccfc38a28cab922257071622991b3986015 GIT binary patch literal 24754 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 literal 0 HcmV?d00001 diff --git a/docs/v1/wmnologo_xingzhi_1.54.jpg b/docs/v1/wmnologo_xingzhi_1.54.jpg new file mode 100644 index 0000000000000000000000000000000000000000..74564772ac80916353ae2508f1085b3e4a26a926 GIT binary patch literal 52550 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Ƀsc<9=(ccspr#?(yXm-=2eRX7 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

t2=`+fTjhg?4w9{S$s&0y;4L zJ+Kq}3G9Ol<@~!$WDmdXwQYXe%l}IqNE8B{^KEf^WuNRbi}D#4_~k25yn>@ys@f;>tv#?`0K`&!FD{gGT>cux_fU!h=#8FiP`0_^&T$EN3b@aa z%&*mpdkWt9XY{YEyK(sj|4t$MjNi$wUpp@Ujo$>c>+wD1{-WQDo4#&UcKcNYTvsuF Tt+Mm0`L{v&PsTl`{{Kw?AfkdU literal 0 HcmV?d00001 diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 8042af34..4134feb2 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -97,10 +97,14 @@ elseif(CONFIG_BOARD_TYPE_DU_CHATX) set(BOARD_TYPE "du-chatx") elseif(CONFIG_BOARD_TYPE_ESP32S3_Taiji_Pi) set(BOARD_TYPE "taiji-pi-s3") -elseif(CONFIG_BOARD_TYPE_XINGZHI_Cube_OLED) - set(BOARD_TYPE "xingzhi-cube-oled") -elseif(CONFIG_BOARD_TYPE_XINGZHI_Cube_TFT) - set(BOARD_TYPE "xingzhi-cube-tft") +elseif(CONFIG_BOARD_TYPE_XINGZHI_Cube_0_96OLED_WIFI) + set(BOARD_TYPE "xingzhi-cube-0.96oled-wifi") +elseif(CONFIG_BOARD_TYPE_XINGZHI_Cube_0_96OLED_ML307) + set(BOARD_TYPE "xingzhi-cube-0.96oled-ml307") +elseif(CONFIG_BOARD_TYPE_XINGZHI_Cube_1_54TFT_WIFI) + set(BOARD_TYPE "xingzhi-cube-1.54tft-wifi") +elseif(CONFIG_BOARD_TYPE_XINGZHI_Cube_1_54TFT_ML307) + set(BOARD_TYPE "xingzhi-cube-1.54tft-ml307") 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 ffb923cd..f25a1f41 100644 --- a/main/Kconfig.projbuild +++ b/main/Kconfig.projbuild @@ -112,10 +112,14 @@ choice BOARD_TYPE bool "嘟嘟开发板CHATX(wifi)" config BOARD_TYPE_ESP32S3_Taiji_Pi bool "太极小派esp32s3" - config BOARD_TYPE_XINGZHI_Cube_OLED - bool "无名科技星智0.96" - config BOARD_TYPE_XINGZHI_Cube_TFT - bool "无名科技星智1.54" + config BOARD_TYPE_XINGZHI_Cube_0_96OLED_WIFI + bool "无名科技星智0.96(WIFI)" + config BOARD_TYPE_XINGZHI_Cube_0_96OLED_ML307 + bool "无名科技星智0.96(ML307)" + config BOARD_TYPE_XINGZHI_Cube_1_54TFT_WIFI + bool "无名科技星智1.54(WIFI)" + config BOARD_TYPE_XINGZHI_Cube_1_54TFT_ML307 + bool "无名科技星智1.54(ML307)" endchoice choice DISPLAY_OLED_TYPE diff --git a/main/boards/xingzhi-cube-0.96oled-ml307/config.h b/main/boards/xingzhi-cube-0.96oled-ml307/config.h new file mode 100644 index 00000000..0f3f8ce1 --- /dev/null +++ b/main/boards/xingzhi-cube-0.96oled-ml307/config.h @@ -0,0 +1,30 @@ +#ifndef _BOARD_CONFIG_H_ +#define _BOARD_CONFIG_H_ + +#include + +#define AUDIO_INPUT_SAMPLE_RATE 16000 +#define AUDIO_OUTPUT_SAMPLE_RATE 24000 +#define AUDIO_I2S_MIC_GPIO_WS GPIO_NUM_4 +#define AUDIO_I2S_MIC_GPIO_SCK GPIO_NUM_5 +#define AUDIO_I2S_MIC_GPIO_DIN GPIO_NUM_6 +#define AUDIO_I2S_SPK_GPIO_DOUT GPIO_NUM_7 +#define AUDIO_I2S_SPK_GPIO_BCLK GPIO_NUM_15 +#define AUDIO_I2S_SPK_GPIO_LRCK GPIO_NUM_16 + +#define BUILTIN_LED_GPIO GPIO_NUM_48 +#define BOOT_BUTTON_GPIO GPIO_NUM_0 +#define VOLUME_UP_BUTTON_GPIO GPIO_NUM_40 +#define VOLUME_DOWN_BUTTON_GPIO GPIO_NUM_39 + +#define DISPLAY_SDA_PIN GPIO_NUM_41 +#define DISPLAY_SCL_PIN GPIO_NUM_42 +#define DISPLAY_WIDTH 128 +#define DISPLAY_HEIGHT 64 +#define DISPLAY_MIRROR_X true +#define DISPLAY_MIRROR_Y true + +#define ML307_RX_PIN GPIO_NUM_11 +#define ML307_TX_PIN GPIO_NUM_12 + +#endif // _BOARD_CONFIG_H_ diff --git a/main/boards/xingzhi-cube-0.96oled-ml307/config.json b/main/boards/xingzhi-cube-0.96oled-ml307/config.json new file mode 100644 index 00000000..be5919c0 --- /dev/null +++ b/main/boards/xingzhi-cube-0.96oled-ml307/config.json @@ -0,0 +1,9 @@ +{ + "target": "esp32s3", + "builds": [ + { + "name": "xingzhi-cube-0.96oled-ml307", + "sdkconfig_append": [] + } + ] +} \ No newline at end of file diff --git a/main/boards/xingzhi-cube-0.96oled-ml307/xingzhi-cube-0.96oled-ml307.cc b/main/boards/xingzhi-cube-0.96oled-ml307/xingzhi-cube-0.96oled-ml307.cc new file mode 100644 index 00000000..95935bc2 --- /dev/null +++ b/main/boards/xingzhi-cube-0.96oled-ml307/xingzhi-cube-0.96oled-ml307.cc @@ -0,0 +1,112 @@ +#include "ml307_board.h" +#include "audio_codecs/no_audio_codec.h" +#include "ssd1306_display.h" +#include "system_reset.h" +#include "application.h" +#include "button.h" +#include "config.h" +#include "iot/thing_manager.h" +#include "led/single_led.h" + +#include +#include + +#define TAG "XINGZHI_CUBE_0_96OLED_ML307" + +LV_FONT_DECLARE(font_puhui_14_1); +LV_FONT_DECLARE(font_awesome_14_1); + +class XINGZHI_CUBE_0_96OLED_ML307 : public Ml307Board { +private: + i2c_master_bus_handle_t display_i2c_bus_; + Button boot_button_; + Button volume_up_button_; + Button volume_down_button_; + + void InitializeDisplayI2c() { + i2c_master_bus_config_t bus_config = { + .i2c_port = (i2c_port_t)0, + .sda_io_num = DISPLAY_SDA_PIN, + .scl_io_num = DISPLAY_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(&bus_config, &display_i2c_bus_)); + } + + void InitializeButtons() { + boot_button_.OnClick([this]() { + auto& app = Application::GetInstance(); + app.ToggleChatState(); + }); + + volume_up_button_.OnClick([this]() { + auto codec = GetAudioCodec(); + auto volume = codec->output_volume() + 10; + if (volume > 100) { + volume = 100; + } + codec->SetOutputVolume(volume); + GetDisplay()->ShowNotification("音量 " + std::to_string(volume)); + }); + + volume_up_button_.OnLongPress([this]() { + GetAudioCodec()->SetOutputVolume(100); + GetDisplay()->ShowNotification("最大音量"); + }); + + volume_down_button_.OnClick([this]() { + auto codec = GetAudioCodec(); + auto volume = codec->output_volume() - 10; + if (volume < 0) { + volume = 0; + } + codec->SetOutputVolume(volume); + GetDisplay()->ShowNotification("音量 " + std::to_string(volume)); + }); + + volume_down_button_.OnLongPress([this]() { + GetAudioCodec()->SetOutputVolume(0); + GetDisplay()->ShowNotification("已静音"); + }); + } + + void InitializeIot() { + auto& thing_manager = iot::ThingManager::GetInstance(); + thing_manager.AddThing(iot::CreateThing("Speaker")); + } + +public: + XINGZHI_CUBE_0_96OLED_ML307() : Ml307Board(ML307_TX_PIN, ML307_RX_PIN, 4096), + boot_button_(BOOT_BUTTON_GPIO), + volume_up_button_(VOLUME_UP_BUTTON_GPIO), + volume_down_button_(VOLUME_DOWN_BUTTON_GPIO) { + InitializeDisplayI2c(); + InitializeButtons(); + InitializeIot(); + } + + virtual Led* GetLed() override { + static SingleLed led(BUILTIN_LED_GPIO); + return &led; + } + + virtual AudioCodec* GetAudioCodec() override { + static NoAudioCodecSimplex audio_codec(AUDIO_INPUT_SAMPLE_RATE, AUDIO_OUTPUT_SAMPLE_RATE, + AUDIO_I2S_SPK_GPIO_BCLK, AUDIO_I2S_SPK_GPIO_LRCK, AUDIO_I2S_SPK_GPIO_DOUT, AUDIO_I2S_MIC_GPIO_SCK, AUDIO_I2S_MIC_GPIO_WS, AUDIO_I2S_MIC_GPIO_DIN); + return &audio_codec; + } + + virtual Display* GetDisplay() override { + static Ssd1306Display display(display_i2c_bus_, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, + &font_puhui_14_1, &font_awesome_14_1); + return &display; + } +}; + +DECLARE_BOARD(XINGZHI_CUBE_0_96OLED_ML307); diff --git a/main/boards/xingzhi-cube-oled/config.h b/main/boards/xingzhi-cube-0.96oled-wifi/config.h similarity index 99% rename from main/boards/xingzhi-cube-oled/config.h rename to main/boards/xingzhi-cube-0.96oled-wifi/config.h index ae6cacfa..b353890b 100644 --- a/main/boards/xingzhi-cube-oled/config.h +++ b/main/boards/xingzhi-cube-0.96oled-wifi/config.h @@ -5,7 +5,6 @@ #define AUDIO_INPUT_SAMPLE_RATE 16000 #define AUDIO_OUTPUT_SAMPLE_RATE 24000 - #define AUDIO_I2S_MIC_GPIO_WS GPIO_NUM_4 #define AUDIO_I2S_MIC_GPIO_SCK GPIO_NUM_5 #define AUDIO_I2S_MIC_GPIO_DIN GPIO_NUM_6 diff --git a/main/boards/xingzhi-cube-oled/config.json b/main/boards/xingzhi-cube-0.96oled-wifi/config.json similarity index 67% rename from main/boards/xingzhi-cube-oled/config.json rename to main/boards/xingzhi-cube-0.96oled-wifi/config.json index 93a28ecb..2cba4c6b 100644 --- a/main/boards/xingzhi-cube-oled/config.json +++ b/main/boards/xingzhi-cube-0.96oled-wifi/config.json @@ -2,7 +2,7 @@ "target": "esp32s3", "builds": [ { - "name": "xingzhi-cube-oled", + "name": "xingzhi-cube-0.96oled-wifi", "sdkconfig_append": [] } ] diff --git a/main/boards/xingzhi-cube-oled/xingzhi-cube-oled.cc b/main/boards/xingzhi-cube-0.96oled-wifi/xingzhi-cube-0.96oled-wifi.cc similarity index 93% rename from main/boards/xingzhi-cube-oled/xingzhi-cube-oled.cc rename to main/boards/xingzhi-cube-0.96oled-wifi/xingzhi-cube-0.96oled-wifi.cc index 8fde396c..8cf164fa 100644 --- a/main/boards/xingzhi-cube-oled/xingzhi-cube-oled.cc +++ b/main/boards/xingzhi-cube-0.96oled-wifi/xingzhi-cube-0.96oled-wifi.cc @@ -12,12 +12,12 @@ #include #include -#define TAG "xingzhicubeoled" +#define TAG "XINGZHI_CUBE_0_96OLED_WIFI" LV_FONT_DECLARE(font_puhui_14_1); LV_FONT_DECLARE(font_awesome_14_1); -class xingzhicubeoled : public WifiBoard { +class XINGZHI_CUBE_0_96OLED_WIFI : public WifiBoard { private: i2c_master_bus_handle_t display_i2c_bus_; Button boot_button_; @@ -80,15 +80,13 @@ private: }); } - // 物联网初始化,添加对 AI 可见设备 void InitializeIot() { auto& thing_manager = iot::ThingManager::GetInstance(); thing_manager.AddThing(iot::CreateThing("Speaker")); - thing_manager.AddThing(iot::CreateThing("Lamp")); } public: - xingzhicubeoled() : + XINGZHI_CUBE_0_96OLED_WIFI() : boot_button_(BOOT_BUTTON_GPIO), volume_up_button_(VOLUME_UP_BUTTON_GPIO), volume_down_button_(VOLUME_DOWN_BUTTON_GPIO) { @@ -115,4 +113,4 @@ public: } }; -DECLARE_BOARD(xingzhicubeoled); +DECLARE_BOARD(XINGZHI_CUBE_0_96OLED_WIFI); diff --git a/main/boards/xingzhi-cube-tft/config.h b/main/boards/xingzhi-cube-1.54tft-ml307/config.h similarity index 66% rename from main/boards/xingzhi-cube-tft/config.h rename to main/boards/xingzhi-cube-1.54tft-ml307/config.h index 3b8e0ce7..9167578a 100644 --- a/main/boards/xingzhi-cube-tft/config.h +++ b/main/boards/xingzhi-cube-1.54tft-ml307/config.h @@ -1,3 +1,4 @@ + #ifndef _BOARD_CONFIG_H_ #define _BOARD_CONFIG_H_ @@ -13,28 +14,27 @@ #define AUDIO_I2S_SPK_GPIO_BCLK GPIO_NUM_15 #define AUDIO_I2S_SPK_GPIO_LRCK GPIO_NUM_16 -#define BUILTIN_LED_GPIO GPIO_NUM_48 #define BOOT_BUTTON_GPIO GPIO_NUM_0 -#define TOUCH_BUTTON_GPIO GPIO_NUM_47 #define VOLUME_UP_BUTTON_GPIO GPIO_NUM_40 #define VOLUME_DOWN_BUTTON_GPIO GPIO_NUM_39 -#define DISPLAY_BACKLIGHT_PIN GPIO_NUM_13 -#define DISPLAY_MOSI_PIN GPIO_NUM_10 -#define DISPLAY_CLK_PIN GPIO_NUM_9 -#define DISPLAY_DC_PIN GPIO_NUM_8 -#define DISPLAY_RST_PIN GPIO_NUM_18 -#define DISPLAY_CS_PIN GPIO_NUM_14 - +#define DISPLAY_SDA GPIO_NUM_10 +#define DISPLAY_SCL GPIO_NUM_9 +#define DISPLAY_DC GPIO_NUM_8 +#define DISPLAY_CS GPIO_NUM_14 +#define DISPLAY_RES GPIO_NUM_18 #define DISPLAY_WIDTH 240 #define DISPLAY_HEIGHT 240 +#define DISPLAY_SWAP_XY false #define DISPLAY_MIRROR_X false #define DISPLAY_MIRROR_Y false -#define DISPLAY_SWAP_XY false -#define DISPLAY_INVERT_COLOR true -#define DISPLAY_RGB_ORDER LCD_RGB_ELEMENT_ORDER_RGB +#define BACKLIGHT_INVERT false #define DISPLAY_OFFSET_X 0 #define DISPLAY_OFFSET_Y 0 +#define DISPLAY_BACKLIGHT_PIN GPIO_NUM_13 #define DISPLAY_BACKLIGHT_OUTPUT_INVERT false +#define ML307_RX_PIN GPIO_NUM_11 +#define ML307_TX_PIN GPIO_NUM_12 + #endif // _BOARD_CONFIG_H_ diff --git a/main/boards/xingzhi-cube-1.54tft-ml307/config.json b/main/boards/xingzhi-cube-1.54tft-ml307/config.json new file mode 100644 index 00000000..96112314 --- /dev/null +++ b/main/boards/xingzhi-cube-1.54tft-ml307/config.json @@ -0,0 +1,9 @@ +{ + "target": "esp32s3", + "builds": [ + { + "name": "xingzhi-cube-1.54tft-ml307", + "sdkconfig_append": [] + } + ] +} \ No newline at end of file diff --git a/main/boards/xingzhi-cube-1.54tft-ml307/xingzhi-cube-1.54tft-ml307.cc b/main/boards/xingzhi-cube-1.54tft-ml307/xingzhi-cube-1.54tft-ml307.cc new file mode 100644 index 00000000..d57b87d9 --- /dev/null +++ b/main/boards/xingzhi-cube-1.54tft-ml307/xingzhi-cube-1.54tft-ml307.cc @@ -0,0 +1,140 @@ +#include "ml307_board.h" + +#include "audio_codecs/no_audio_codec.h" +#include "display/lcd_display.h" +#include "system_reset.h" +#include "application.h" +#include "button.h" + +#include "config.h" +#include "iot/thing_manager.h" +#include "led/single_led.h" +#include +#include +#define TAG "XINGZHI_CUBE_1_54TFT_ML307" + +LV_FONT_DECLARE(font_puhui_16_4); +LV_FONT_DECLARE(font_awesome_16_4); + +class XINGZHI_CUBE_1_54TFT_ML307 : public Ml307Board { + +private: + Button boot_button_; + Button volume_up_button_; + Button volume_down_button_; + LcdDisplay* display_; + + void InitializeSpi() { + spi_bus_config_t buscfg = {}; + buscfg.mosi_io_num = DISPLAY_SDA; + buscfg.miso_io_num = GPIO_NUM_NC; + buscfg.sclk_io_num = DISPLAY_SCL; + buscfg.quadwp_io_num = GPIO_NUM_NC; + buscfg.quadhd_io_num = GPIO_NUM_NC; + buscfg.max_transfer_sz = DISPLAY_WIDTH * DISPLAY_HEIGHT * sizeof(uint16_t); + ESP_ERROR_CHECK(spi_bus_initialize(SPI3_HOST, &buscfg, SPI_DMA_CH_AUTO)); + } + + void InitializeButtons() { + boot_button_.OnClick([this]() { + auto& app = Application::GetInstance(); + app.ToggleChatState(); + }); + + volume_up_button_.OnClick([this]() { + auto codec = GetAudioCodec(); + auto volume = codec->output_volume() + 10; + if (volume > 100) { + volume = 100; + } + codec->SetOutputVolume(volume); + GetDisplay()->ShowNotification("音量 " + std::to_string(volume)); + }); + + volume_up_button_.OnLongPress([this]() { + GetAudioCodec()->SetOutputVolume(100); + GetDisplay()->ShowNotification("最大音量"); + }); + + volume_down_button_.OnClick([this]() { + auto codec = GetAudioCodec(); + auto volume = codec->output_volume() - 10; + if (volume < 0) { + volume = 0; + } + codec->SetOutputVolume(volume); + GetDisplay()->ShowNotification("音量 " + std::to_string(volume)); + }); + + volume_down_button_.OnLongPress([this]() { + GetAudioCodec()->SetOutputVolume(0); + GetDisplay()->ShowNotification("已静音"); + }); + } + + void InitializeSt7789Display() { + esp_lcd_panel_io_handle_t panel_io = nullptr; + esp_lcd_panel_handle_t panel = nullptr; + + ESP_LOGD(TAG, "Install panel IO"); + esp_lcd_panel_io_spi_config_t io_config = {}; + io_config.cs_gpio_num = DISPLAY_CS; + io_config.dc_gpio_num = DISPLAY_DC; + io_config.spi_mode = 3; + io_config.pclk_hz = 80 * 1000 * 1000; + io_config.trans_queue_depth = 10; + io_config.lcd_cmd_bits = 8; + io_config.lcd_param_bits = 8; + ESP_ERROR_CHECK(esp_lcd_new_panel_io_spi(SPI3_HOST, &io_config, &panel_io)); + + ESP_LOGD(TAG, "Install LCD driver"); + esp_lcd_panel_dev_config_t panel_config = {}; + panel_config.reset_gpio_num = DISPLAY_RES; + panel_config.rgb_ele_order = LCD_RGB_ELEMENT_ORDER_RGB; + panel_config.bits_per_pixel = 16; + ESP_ERROR_CHECK(esp_lcd_new_panel_st7789(panel_io, &panel_config, &panel)); + ESP_ERROR_CHECK(esp_lcd_panel_reset(panel)); + ESP_ERROR_CHECK(esp_lcd_panel_init(panel)); + ESP_ERROR_CHECK(esp_lcd_panel_swap_xy(panel, DISPLAY_SWAP_XY)); + ESP_ERROR_CHECK(esp_lcd_panel_mirror(panel, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y)); + ESP_ERROR_CHECK(esp_lcd_panel_invert_color(panel, true)); + + display_ = new LcdDisplay(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, + { + .text_font = &font_puhui_16_4, + .icon_font = &font_awesome_16_4, + .emoji_font = DISPLAY_HEIGHT >= 240 ? font_emoji_64_init() : font_emoji_32_init(), + }); + } + + void InitializeIot() { + auto& thing_manager = iot::ThingManager::GetInstance(); + thing_manager.AddThing(iot::CreateThing("Speaker")); + thing_manager.AddThing(iot::CreateThing("Backlight")); + } + +public: + XINGZHI_CUBE_1_54TFT_ML307() : + Ml307Board(ML307_TX_PIN, ML307_RX_PIN, 4096), + boot_button_(BOOT_BUTTON_GPIO), + volume_up_button_(VOLUME_UP_BUTTON_GPIO), + volume_down_button_(VOLUME_DOWN_BUTTON_GPIO) { + InitializeSpi(); + InitializeButtons(); + InitializeSt7789Display(); + InitializeIot(); + } + + virtual AudioCodec* GetAudioCodec() override { + static NoAudioCodecSimplex audio_codec(AUDIO_INPUT_SAMPLE_RATE, AUDIO_OUTPUT_SAMPLE_RATE, + AUDIO_I2S_SPK_GPIO_BCLK, AUDIO_I2S_SPK_GPIO_LRCK, AUDIO_I2S_SPK_GPIO_DOUT, AUDIO_I2S_MIC_GPIO_SCK, AUDIO_I2S_MIC_GPIO_WS, AUDIO_I2S_MIC_GPIO_DIN); + return &audio_codec; + } + + virtual Display *GetDisplay() override { + return display_; + } +}; + +DECLARE_BOARD(XINGZHI_CUBE_1_54TFT_ML307); diff --git a/main/boards/xingzhi-cube-1.54tft-wifi/config.h b/main/boards/xingzhi-cube-1.54tft-wifi/config.h new file mode 100644 index 00000000..c1a998af --- /dev/null +++ b/main/boards/xingzhi-cube-1.54tft-wifi/config.h @@ -0,0 +1,36 @@ + +#ifndef _BOARD_CONFIG_H_ +#define _BOARD_CONFIG_H_ + +#include + +#define AUDIO_INPUT_SAMPLE_RATE 16000 +#define AUDIO_OUTPUT_SAMPLE_RATE 24000 +#define AUDIO_I2S_MIC_GPIO_WS GPIO_NUM_4 +#define AUDIO_I2S_MIC_GPIO_SCK GPIO_NUM_5 +#define AUDIO_I2S_MIC_GPIO_DIN GPIO_NUM_6 +#define AUDIO_I2S_SPK_GPIO_DOUT GPIO_NUM_7 +#define AUDIO_I2S_SPK_GPIO_BCLK GPIO_NUM_15 +#define AUDIO_I2S_SPK_GPIO_LRCK GPIO_NUM_16 + +#define BOOT_BUTTON_GPIO GPIO_NUM_0 +#define VOLUME_UP_BUTTON_GPIO GPIO_NUM_40 +#define VOLUME_DOWN_BUTTON_GPIO GPIO_NUM_39 + +#define DISPLAY_SDA GPIO_NUM_10 +#define DISPLAY_SCL GPIO_NUM_9 +#define DISPLAY_DC GPIO_NUM_8 +#define DISPLAY_CS GPIO_NUM_14 +#define DISPLAY_RES GPIO_NUM_18 +#define DISPLAY_WIDTH 240 +#define DISPLAY_HEIGHT 240 +#define DISPLAY_SWAP_XY false +#define DISPLAY_MIRROR_X false +#define DISPLAY_MIRROR_Y false +#define BACKLIGHT_INVERT false +#define DISPLAY_OFFSET_X 0 +#define DISPLAY_OFFSET_Y 0 +#define DISPLAY_BACKLIGHT_PIN GPIO_NUM_13 +#define DISPLAY_BACKLIGHT_OUTPUT_INVERT false + +#endif // _BOARD_CONFIG_H_ diff --git a/main/boards/xingzhi-cube-tft/config.json b/main/boards/xingzhi-cube-1.54tft-wifi/config.json similarity index 68% rename from main/boards/xingzhi-cube-tft/config.json rename to main/boards/xingzhi-cube-1.54tft-wifi/config.json index 83a6d36f..6cfa0d3b 100644 --- a/main/boards/xingzhi-cube-tft/config.json +++ b/main/boards/xingzhi-cube-1.54tft-wifi/config.json @@ -2,7 +2,7 @@ "target": "esp32s3", "builds": [ { - "name": "xingzhi-cube-tft", + "name": "xingzhi-cube-1.54tft-wifi", "sdkconfig_append": [] } ] diff --git a/main/boards/xingzhi-cube-tft/xingzhi-cube-tft.cc b/main/boards/xingzhi-cube-1.54tft-wifi/xingzhi-cube-1.54tft-wifi.cc similarity index 68% rename from main/boards/xingzhi-cube-tft/xingzhi-cube-tft.cc rename to main/boards/xingzhi-cube-1.54tft-wifi/xingzhi-cube-1.54tft-wifi.cc index aba8c48b..d7b28134 100644 --- a/main/boards/xingzhi-cube-tft/xingzhi-cube-tft.cc +++ b/main/boards/xingzhi-cube-1.54tft-wifi/xingzhi-cube-1.54tft-wifi.cc @@ -1,27 +1,25 @@ #include "wifi_board.h" + #include "audio_codecs/no_audio_codec.h" #include "display/lcd_display.h" #include "system_reset.h" #include "application.h" #include "button.h" + +#include #include "config.h" #include "iot/thing_manager.h" #include "led/single_led.h" - -#include #include -#include #include -#include - -#define TAG "xingzhicubetft" +#define TAG "XINGZHI_CUBE_1_54TFT_WIFI" LV_FONT_DECLARE(font_puhui_16_4); LV_FONT_DECLARE(font_awesome_16_4); -class xingzhicubetft : public WifiBoard { +class XINGZHI_CUBE_1_54TFT_WIFI : public WifiBoard { + private: - Button boot_button_; Button volume_up_button_; Button volume_down_button_; @@ -29,53 +27,15 @@ private: void InitializeSpi() { spi_bus_config_t buscfg = {}; - buscfg.mosi_io_num = DISPLAY_MOSI_PIN; + buscfg.mosi_io_num = DISPLAY_SDA; buscfg.miso_io_num = GPIO_NUM_NC; - buscfg.sclk_io_num = DISPLAY_CLK_PIN; + buscfg.sclk_io_num = DISPLAY_SCL; buscfg.quadwp_io_num = GPIO_NUM_NC; buscfg.quadhd_io_num = GPIO_NUM_NC; buscfg.max_transfer_sz = DISPLAY_WIDTH * DISPLAY_HEIGHT * sizeof(uint16_t); ESP_ERROR_CHECK(spi_bus_initialize(SPI3_HOST, &buscfg, SPI_DMA_CH_AUTO)); } - void InitializeLcdDisplay() { - 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 = {}; - io_config.cs_gpio_num = DISPLAY_CS_PIN; - io_config.dc_gpio_num = DISPLAY_DC_PIN; - io_config.spi_mode = 0; - io_config.pclk_hz = 40 * 1000 * 1000; - io_config.trans_queue_depth = 10; - io_config.lcd_cmd_bits = 8; - io_config.lcd_param_bits = 8; - ESP_ERROR_CHECK(esp_lcd_new_panel_io_spi(SPI3_HOST, &io_config, &panel_io)); - - // 初始化液晶屏驱动芯片 - ESP_LOGD(TAG, "Install LCD driver"); - esp_lcd_panel_dev_config_t panel_config = {}; - panel_config.reset_gpio_num = DISPLAY_RST_PIN; - panel_config.rgb_ele_order = DISPLAY_RGB_ORDER; - panel_config.bits_per_pixel = 16; - ESP_ERROR_CHECK(esp_lcd_new_panel_st7789(panel_io, &panel_config, &panel)); - - esp_lcd_panel_reset(panel); - - esp_lcd_panel_init(panel); - esp_lcd_panel_invert_color(panel, DISPLAY_INVERT_COLOR); - esp_lcd_panel_swap_xy(panel, DISPLAY_SWAP_XY); - esp_lcd_panel_mirror(panel, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y); - display_ = new LcdDisplay(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, - { - .text_font = &font_puhui_16_4, - .icon_font = &font_awesome_16_4, - .emoji_font = DISPLAY_HEIGHT >= 240 ? font_emoji_64_init() : font_emoji_32_init(), - }); - } - void InitializeButtons() { boot_button_.OnClick([this]() { auto& app = Application::GetInstance(); @@ -84,6 +44,7 @@ private: } app.ToggleChatState(); }); + volume_up_button_.OnClick([this]() { auto codec = GetAudioCodec(); auto volume = codec->output_volume() + 10; @@ -115,7 +76,42 @@ private: }); } - // 物联网初始化,添加对 AI 可见设备 + void InitializeSt7789Display() { + esp_lcd_panel_io_handle_t panel_io = nullptr; + esp_lcd_panel_handle_t panel = nullptr; + + ESP_LOGD(TAG, "Install panel IO"); + esp_lcd_panel_io_spi_config_t io_config = {}; + io_config.cs_gpio_num = DISPLAY_CS; + io_config.dc_gpio_num = DISPLAY_DC; + io_config.spi_mode = 3; + io_config.pclk_hz = 80 * 1000 * 1000; + io_config.trans_queue_depth = 10; + io_config.lcd_cmd_bits = 8; + io_config.lcd_param_bits = 8; + ESP_ERROR_CHECK(esp_lcd_new_panel_io_spi(SPI3_HOST, &io_config, &panel_io)); + + ESP_LOGD(TAG, "Install LCD driver"); + esp_lcd_panel_dev_config_t panel_config = {}; + panel_config.reset_gpio_num = DISPLAY_RES; + panel_config.rgb_ele_order = LCD_RGB_ELEMENT_ORDER_RGB; + panel_config.bits_per_pixel = 16; + ESP_ERROR_CHECK(esp_lcd_new_panel_st7789(panel_io, &panel_config, &panel)); + ESP_ERROR_CHECK(esp_lcd_panel_reset(panel)); + ESP_ERROR_CHECK(esp_lcd_panel_init(panel)); + ESP_ERROR_CHECK(esp_lcd_panel_swap_xy(panel, DISPLAY_SWAP_XY)); + ESP_ERROR_CHECK(esp_lcd_panel_mirror(panel, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y)); + ESP_ERROR_CHECK(esp_lcd_panel_invert_color(panel, true)); + + display_ = new LcdDisplay(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, + { + .text_font = &font_puhui_16_4, + .icon_font = &font_awesome_16_4, + .emoji_font = DISPLAY_HEIGHT >= 240 ? font_emoji_64_init() : font_emoji_32_init(), + }); + } + void InitializeIot() { auto& thing_manager = iot::ThingManager::GetInstance(); thing_manager.AddThing(iot::CreateThing("Speaker")); @@ -123,30 +119,25 @@ private: } public: - xingzhicubetft() : + XINGZHI_CUBE_1_54TFT_WIFI() : boot_button_(BOOT_BUTTON_GPIO), volume_up_button_(VOLUME_UP_BUTTON_GPIO), volume_down_button_(VOLUME_DOWN_BUTTON_GPIO) { InitializeSpi(); - InitializeLcdDisplay(); InitializeButtons(); + InitializeSt7789Display(); InitializeIot(); } - virtual Led* GetLed() override { - static SingleLed led(BUILTIN_LED_GPIO); - return &led; - } - - virtual AudioCodec* GetAudioCodec() override { + virtual AudioCodec *GetAudioCodec() override { static NoAudioCodecSimplex audio_codec(AUDIO_INPUT_SAMPLE_RATE, AUDIO_OUTPUT_SAMPLE_RATE, AUDIO_I2S_SPK_GPIO_BCLK, AUDIO_I2S_SPK_GPIO_LRCK, AUDIO_I2S_SPK_GPIO_DOUT, AUDIO_I2S_MIC_GPIO_SCK, AUDIO_I2S_MIC_GPIO_WS, AUDIO_I2S_MIC_GPIO_DIN); return &audio_codec; } - virtual Display* GetDisplay() override { + virtual Display *GetDisplay() override { return display_; } }; -DECLARE_BOARD(xingzhicubetft); +DECLARE_BOARD(XINGZHI_CUBE_1_54TFT_WIFI);