From e19604b21e4f349ff4eb6d5dcff9eba905a354ee Mon Sep 17 00:00:00 2001 From: zhou <60282327+windskyxb@users.noreply.github.com> Date: Wed, 12 Feb 2025 02:40:02 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=97=A0=E5=90=8D=E7=A7=91?= =?UTF-8?q?=E6=8A=80=E7=9A=84ESP32S3=E6=98=9F=E6=99=BA=E5=BC=80=E5=8F=91?= =?UTF-8?q?=E6=9D=BF=20(#142)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update CMakeLists.txt * Update Kconfig.projbuild * Add files via upload * Update CMakeLists.txt * Update Kconfig.projbuild * update * update --- main/CMakeLists.txt | 2 + main/Kconfig.projbuild | 4 +- main/boards/xingzhi-cube-oled/config.h | 29 ++++ .../xingzhi-cube-oled/xingzhi-cube-oled.cc | 126 ++++++++++++++++++ 4 files changed, 160 insertions(+), 1 deletion(-) create mode 100644 main/boards/xingzhi-cube-oled/config.h create mode 100644 main/boards/xingzhi-cube-oled/xingzhi-cube-oled.cc diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index b7d9c7d0..8603bd1b 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -89,6 +89,8 @@ 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") 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 c763bdff..0a4421de 100644 --- a/main/Kconfig.projbuild +++ b/main/Kconfig.projbuild @@ -87,7 +87,9 @@ choice BOARD_TYPE config BOARD_TYPE_DU_CHATX bool "嘟嘟开发板CHATX(wifi)" config BOARD_TYPE_ESP32S3_Taiji_Pi - bool "太极小派esp32s3" + bool "太极小派esp32s3" + config BOARD_TYPE_XINGZHI_Cube_OLED + bool "无名科技星智0.96" endchoice choice DISPLAY_LCD_TYPE diff --git a/main/boards/xingzhi-cube-oled/config.h b/main/boards/xingzhi-cube-oled/config.h new file mode 100644 index 00000000..bf2e9357 --- /dev/null +++ b/main/boards/xingzhi-cube-oled/config.h @@ -0,0 +1,29 @@ +#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 TOUCH_BUTTON_GPIO GPIO_NUM_47 +#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 + +#endif // _BOARD_CONFIG_H_ diff --git a/main/boards/xingzhi-cube-oled/xingzhi-cube-oled.cc b/main/boards/xingzhi-cube-oled/xingzhi-cube-oled.cc new file mode 100644 index 00000000..a7ae74ff --- /dev/null +++ b/main/boards/xingzhi-cube-oled/xingzhi-cube-oled.cc @@ -0,0 +1,126 @@ +#include "wifi_board.h" +#include "audio_codecs/no_audio_codec.h" +#include "display/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 +#include + +#define TAG "xingzhicubeoled" + +LV_FONT_DECLARE(font_puhui_14_1); +LV_FONT_DECLARE(font_awesome_14_1); + +class xingzhicubeoled : public WifiBoard { +private: + i2c_master_bus_handle_t display_i2c_bus_; + Button boot_button_; + Button touch_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(); + if (app.GetDeviceState() == kDeviceStateStarting && !WifiStation::GetInstance().IsConnected()) { + ResetWifiConfiguration(); + } + app.ToggleChatState(); + }); + touch_button_.OnPressDown([this]() { + Application::GetInstance().StartListening(); + }); + touch_button_.OnPressUp([this]() { + Application::GetInstance().StopListening(); + }); + + 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("已静音"); + }); + } + + // 物联网初始化,添加对 AI 可见设备 + void InitializeIot() { + auto& thing_manager = iot::ThingManager::GetInstance(); + thing_manager.AddThing(iot::CreateThing("Speaker")); + thing_manager.AddThing(iot::CreateThing("Lamp")); + } + +public: + xingzhicubeoled() : + boot_button_(BOOT_BUTTON_GPIO), + touch_button_(TOUCH_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(xingzhicubeoled);