Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

增加凡诚开发板 #280

Open
wants to merge 10 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,5 @@ dependencies.lock
.env
releases/
main/assets/lang_config.h
.DS_Store
.DS_Store
.cache/
16 changes: 16 additions & 0 deletions main/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,22 @@ elseif(CONFIG_BOARD_TYPE_XINGZHI_Cube_1_54TFT_ML307)
set(BOARD_TYPE "xingzhi-cube-1.54tft-ml307")
elseif(CONFIG_BOARD_TYPE_SENSECAP_WATCHER)
set(BOARD_TYPE "sensecap-watcher")
elseif(CONFIG_BOARD_TYPE_FANCHENG_OLED_ML307)
set(BOARD_TYPE "fancheng-0.96-4g")
elseif(CONFIG_BOARD_TYPE_FANCHENG_OLED_WIFI)
set(BOARD_TYPE "fancheng-0.96-wifi")
elseif(CONFIG_BOARD_TYPE_FANCHENG_1_8LCD_ML307)
set(BOARD_TYPE "fancheng-1.8-4g")
elseif(CONFIG_BOARD_TYPE_FANCHENG_1_8LCD_WIFI)
set(BOARD_TYPE "fancheng-1.8-wifi")
elseif(CONFIG_BOARD_TYPE_FANCHENG_OLED_ML307_M)
set(BOARD_TYPE "fancheng-0.96-4g-m")
elseif(CONFIG_BOARD_TYPE_FANCHENG_OLED_WIFI_M)
set(BOARD_TYPE "fancheng-0.96-wifi-m")
elseif(CONFIG_BOARD_TYPE_FANCHENG_1_8LCD_ML307_M)
set(BOARD_TYPE "fancheng-1.8-4g-m")
elseif(CONFIG_BOARD_TYPE_FANCHENG_1_8LCD_WIFI_M)
set(BOARD_TYPE "fancheng-1.8-wifi-m")
elseif(CONFIG_BOARD_TYPE_ESP32_CGC)
set(BOARD_TYPE "esp32-cgc")
endif()
Expand Down
16 changes: 16 additions & 0 deletions main/Kconfig.projbuild
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,22 @@ choice BOARD_TYPE
bool "无名科技星智1.54(ML307)"
config BOARD_TYPE_SENSECAP_WATCHER
bool "SenseCAP Watcher"
config BOARD_TYPE_FANCHENG_OLED_ML307
bool "凡诚 0.96 4G(ML307)"
config BOARD_TYPE_FANCHENG_OLED_WIFI
bool "凡诚0.96 WIFI"
config BOARD_TYPE_FANCHENG_1_8LCD_ML307
bool "凡诚1.8 4G(ML307)"
config BOARD_TYPE_FANCHENG_1_8LCD_WIFI
bool "凡诚1.8 WIFI"
config BOARD_TYPE_FANCHENG_OLED_ML307_M
bool "凡诚0.96 4G(ML307) M"
config BOARD_TYPE_FANCHENG_OLED_WIFI_M
bool "凡诚0.96 WIFI M"
config BOARD_TYPE_FANCHENG_1_8LCD_ML307_M
bool "凡诚1.8 4G(ML307) M"
config BOARD_TYPE_FANCHENG_1_8LCD_WIFI_M
bool "凡诚1.8 WIFI M"
endchoice

choice DISPLAY_OLED_TYPE
Expand Down
8 changes: 6 additions & 2 deletions main/application.cc
Original file line number Diff line number Diff line change
Expand Up @@ -530,10 +530,14 @@ void Application::Start() {
}
#endif
}

extern "C" void TM1650_display_time(uint8_t hours, uint8_t minutes);
void Application::OnClockTimer() {
clock_ticks_++;

#if CONFIG_BOARD_TYPE_FANCHENG_OLED_ML307_M || CONFIG_BOARD_TYPE_FANCHENG_OLED_WIFI_M || CONFIG_BOARD_TYPE_FANCHENG_1_8LCD_ML307_M || CONFIG_BOARD_TYPE_FANCHENG_1_8LCD_WIFI_M
time_t nowtime = time(NULL);
struct tm* tm_info = localtime(&nowtime);
TM1650_display_time(tm_info->tm_hour, tm_info->tm_min);
#endif
// Print the debug info every 10 seconds
if (clock_ticks_ % 10 == 0) {
int free_sram = heap_caps_get_free_size(MALLOC_CAP_INTERNAL);
Expand Down
44 changes: 44 additions & 0 deletions main/boards/fancheng-0.96-4g-m/config.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/*
* @Date: 2025-03-01 10:58:13
* @LastEditors: zhouke
* @LastEditTime: 2025-03-02 21:24:38
* @FilePath: \xiaozhi-esp32\main\boards\fancheng-0.96-4g\config.h
*/
#ifndef _BOARD_CONFIG_H_
#define _BOARD_CONFIG_H_

#include <driver/gpio.h>

#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_8
#define DISPLAY_SCL_PIN GPIO_NUM_20
#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_
11 changes: 11 additions & 0 deletions main/boards/fancheng-0.96-4g-m/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"target": "esp32s3",
"builds": [
{
"name": "fancheng-0.96-4g",
"sdkconfig_append": [
"CONFIG_OLED_SSD1306_128X64=y"
]
}
]
}
178 changes: 178 additions & 0 deletions main/boards/fancheng-0.96-4g-m/fancheng-0.96-4g.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
#include "ml307_board.h"
#include "audio_codecs/no_audio_codec.h"
#include "display/oled_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 "assets/lang_config.h"

#include <esp_log.h>
#include <driver/i2c_master.h>
#include <esp_lcd_panel_ops.h>
#include <esp_lcd_panel_vendor.h>

#define TAG "FanChengOledMl307Board"

LV_FONT_DECLARE(font_puhui_14_1);
LV_FONT_DECLARE(font_awesome_14_1);

class FanChengOledMl307Board : public Ml307Board {
private:
i2c_master_bus_handle_t display_i2c_bus_;
esp_lcd_panel_io_handle_t panel_io_ = nullptr;
esp_lcd_panel_handle_t panel_ = nullptr;
OledDisplay* display_ = nullptr;
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 InitializeSsd1306Display() {
// SSD1306 config
esp_lcd_panel_io_i2c_config_t io_config = {
.dev_addr = 0x3C,
.on_color_trans_done = nullptr,
.user_ctx = nullptr,
.control_phase_bytes = 1,
.dc_bit_offset = 6,
.lcd_cmd_bits = 8,
.lcd_param_bits = 8,
.flags = {
.dc_low_on_data = 0,
.disable_control_phase = 0,
},
.scl_speed_hz = 400 * 1000,
};

ESP_ERROR_CHECK(esp_lcd_new_panel_io_i2c_v2(display_i2c_bus_, &io_config, &panel_io_));

ESP_LOGI(TAG, "Install SSD1306 driver");
esp_lcd_panel_dev_config_t panel_config = {};
panel_config.reset_gpio_num = -1;
panel_config.bits_per_pixel = 1;

esp_lcd_panel_ssd1306_config_t ssd1306_config = {
.height = static_cast<uint8_t>(DISPLAY_HEIGHT),
};
panel_config.vendor_config = &ssd1306_config;

ESP_ERROR_CHECK(esp_lcd_new_panel_ssd1306(panel_io_, &panel_config, &panel_));
ESP_LOGI(TAG, "SSD1306 driver installed");

// Reset the display
ESP_ERROR_CHECK(esp_lcd_panel_reset(panel_));
if (esp_lcd_panel_init(panel_) != ESP_OK) {
ESP_LOGE(TAG, "Failed to initialize display");
return;
}

// Set the display to on
ESP_LOGI(TAG, "Turning display on");
ESP_ERROR_CHECK(esp_lcd_panel_disp_on_off(panel_, true));

display_ = new OledDisplay(panel_io_, panel_, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y,
{&font_puhui_14_1, &font_awesome_14_1});
}

void InitializeButtons() {
boot_button_.OnClick([this]() {
Application::GetInstance().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(Lang::Strings::VOLUME + std::to_string(volume));

});

volume_up_button_.OnLongPress([this]() {
GetAudioCodec()->SetOutputVolume(100);
GetDisplay()->ShowNotification(Lang::Strings::MAX_VOLUME);

});

volume_down_button_.OnClick([this]() {
auto codec = GetAudioCodec();
auto volume = codec->output_volume() - 10;
if (volume < 0) {
volume = 0;
}
codec->SetOutputVolume(volume);
GetDisplay()->ShowNotification(Lang::Strings::VOLUME + std::to_string(volume));
});

volume_down_button_.OnLongPress([this]() {
GetAudioCodec()->SetOutputVolume(0);
GetDisplay()->ShowNotification(Lang::Strings::MUTED);

});
}

// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("ColorLamp"));
thing_manager.AddThing(iot::CreateThing("Motor"));
}

public:
FanChengOledMl307Board() : Ml307Board(ML307_TX_PIN, ML307_RX_PIN, 4096),
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();
InitializeSsd1306Display();
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 {
return display_;
}
};

DECLARE_BOARD(FanChengOledMl307Board);
Loading