Skip to content

Commit 0183830

Browse files
authored
add zhengchen_ml307 board(征辰科技) (#641)
* add zhengchen_ml307 board * add boards_http
1 parent 61bf575 commit 0183830

File tree

7 files changed

+338
-0
lines changed

7 files changed

+338
-0
lines changed

main/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,8 @@ elseif(CONFIG_BOARD_TYPE_ESP_S3_LCD_EV_Board)
165165
set(BOARD_TYPE "esp-s3-lcd-ev-board")
166166
elseif(CONFIG_BOARD_TYPE_ZHENGCHEN_1_54TFT_WIFI)
167167
set(BOARD_TYPE "zhengchen-1.54tft-wifi")
168+
elseif(CONFIG_BOARD_TYPE_ZHENGCHEN_1_54TFT_ML307)
169+
set(BOARD_TYPE "zhengchen-1.54tft-ml307")
168170
endif()
169171
file(GLOB BOARD_SOURCES
170172
${CMAKE_CURRENT_SOURCE_DIR}/boards/${BOARD_TYPE}/*.cc

main/Kconfig.projbuild

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,8 @@ choice BOARD_TYPE
158158
bool "乐鑫ESP S3 LCD EV Board开发板"
159159
config BOARD_TYPE_ZHENGCHEN_1_54TFT_WIFI
160160
bool "征辰科技1.54(WIFI)"
161+
config BOARD_TYPE_ZHENGCHEN_1_54TFT_ML307
162+
bool "征辰科技1.54(ML307)"
161163
endchoice
162164

163165
choice ESP_S3_LCD_EV_Board_Version_TYPE
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# 产品相关介绍网址
2+
3+
```http
4+
https://e.tb.cn/h.6Gl2LC7rsrswQZp?tk=qFuaV9hzh0k CZ356
5+
```
6+
7+
# 编译配置命令
8+
9+
**配置编译目标为 ESP32S3:**
10+
11+
```bash
12+
idf.py set-target esp32s3
13+
```
14+
15+
**打开 menuconfig:**
16+
17+
```bash
18+
idf.py menuconfig
19+
```
20+
21+
**选择板子:**
22+
23+
```
24+
Xiaozhi Assistant -> Board Type -> zhengchen-1.54tft-ml307
25+
```
26+
27+
```
28+
29+
**编译:**
30+
31+
bash
32+
idf.py build
33+
```
34+
35+
**下载:**
36+
idf.py build flash monitor
37+
38+
进行下载和显示日志
39+
40+
41+
**固件生成:**
42+
43+
```bash
44+
idf.py merge-bin
45+
```
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
2+
#ifndef _BOARD_CONFIG_H_
3+
#define _BOARD_CONFIG_H_
4+
5+
#include <driver/gpio.h>
6+
7+
#define AUDIO_INPUT_SAMPLE_RATE 16000
8+
#define AUDIO_OUTPUT_SAMPLE_RATE 24000
9+
10+
#define AUDIO_I2S_MIC_GPIO_WS GPIO_NUM_4
11+
#define AUDIO_I2S_MIC_GPIO_SCK GPIO_NUM_5
12+
#define AUDIO_I2S_MIC_GPIO_DIN GPIO_NUM_6
13+
#define AUDIO_I2S_SPK_GPIO_DOUT GPIO_NUM_7
14+
#define AUDIO_I2S_SPK_GPIO_BCLK GPIO_NUM_15
15+
#define AUDIO_I2S_SPK_GPIO_LRCK GPIO_NUM_16
16+
17+
#define BOOT_BUTTON_GPIO GPIO_NUM_0
18+
#define VOLUME_UP_BUTTON_GPIO GPIO_NUM_10
19+
#define VOLUME_DOWN_BUTTON_GPIO GPIO_NUM_39
20+
21+
#define DISPLAY_SDA GPIO_NUM_41
22+
#define DISPLAY_SCL GPIO_NUM_42
23+
#define DISPLAY_RES GPIO_NUM_45
24+
#define DISPLAY_DC GPIO_NUM_40
25+
#define DISPLAY_CS GPIO_NUM_21
26+
27+
#define DISPLAY_WIDTH 240
28+
#define DISPLAY_HEIGHT 240
29+
#define DISPLAY_SWAP_XY false
30+
#define DISPLAY_MIRROR_X false
31+
#define DISPLAY_MIRROR_Y false
32+
#define BACKLIGHT_INVERT false
33+
#define DISPLAY_OFFSET_X 0
34+
#define DISPLAY_OFFSET_Y 0
35+
36+
#define DISPLAY_BACKLIGHT_PIN GPIO_NUM_20
37+
#define DISPLAY_BACKLIGHT_OUTPUT_INVERT false
38+
39+
#define ML307_RX_PIN GPIO_NUM_11
40+
#define ML307_TX_PIN GPIO_NUM_12
41+
42+
#endif // _BOARD_CONFIG_H_
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"target": "esp32s3",
3+
"builds": [
4+
{
5+
"name": "zhengchen-1.54tft-ml307",
6+
"sdkconfig_append": []
7+
}
8+
]
9+
}
Lines changed: 232 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,232 @@
1+
#include "dual_network_board.h"
2+
#include "audio_codecs/no_audio_codec.h"
3+
#include "../zhengchen-1.54tft-wifi/zhengchen_lcd_display.h"
4+
#include "system_reset.h"
5+
#include "application.h"
6+
#include "button.h"
7+
#include "config.h"
8+
#include "power_save_timer.h"
9+
#include "iot/thing_manager.h"
10+
#include "led/single_led.h"
11+
#include "assets/lang_config.h"
12+
#include "../zhengchen-1.54tft-wifi/power_manager.h"
13+
14+
#include <esp_log.h>
15+
#include <esp_lcd_panel_vendor.h>
16+
#include <wifi_station.h>
17+
18+
#include <driver/rtc_io.h>
19+
#include <esp_sleep.h>
20+
21+
#define TAG "ZHENGCHEN_1_54TFT_ML307"
22+
23+
LV_FONT_DECLARE(font_puhui_20_4);
24+
LV_FONT_DECLARE(font_awesome_20_4);
25+
26+
27+
class ZHENGCHEN_1_54TFT_ML307 : public DualNetworkBoard {
28+
private:
29+
Button boot_button_;
30+
Button volume_up_button_;
31+
Button volume_down_button_;
32+
ZHENGCHEN_LcdDisplay* display_;
33+
PowerSaveTimer* power_save_timer_;
34+
PowerManager* power_manager_;
35+
esp_lcd_panel_io_handle_t panel_io_ = nullptr;
36+
esp_lcd_panel_handle_t panel_ = nullptr;
37+
38+
void InitializePowerManager() {
39+
power_manager_ = new PowerManager(GPIO_NUM_9);
40+
power_manager_->OnTemperatureChanged([this](float chip_temp) {
41+
display_->UpdateHighTempWarning(chip_temp);
42+
});
43+
power_manager_->OnChargingStatusChanged([this](bool is_charging) {
44+
if (is_charging) {
45+
power_save_timer_->SetEnabled(false);
46+
} else {
47+
power_save_timer_->SetEnabled(true);
48+
}
49+
});
50+
}
51+
52+
void InitializePowerSaveTimer() {
53+
rtc_gpio_init(GPIO_NUM_2);
54+
rtc_gpio_set_direction(GPIO_NUM_2, RTC_GPIO_MODE_OUTPUT_ONLY);
55+
rtc_gpio_set_level(GPIO_NUM_2, 1);
56+
57+
power_save_timer_ = new PowerSaveTimer(-1, 60, 300);
58+
power_save_timer_->OnEnterSleepMode([this]() {
59+
ESP_LOGI(TAG, "Enabling sleep mode");
60+
display_->SetChatMessage("system", "");
61+
display_->SetEmotion("sleepy");
62+
GetBacklight()->SetBrightness(1);
63+
});
64+
power_save_timer_->OnExitSleepMode([this]() {
65+
display_->SetChatMessage("system", "");
66+
display_->SetEmotion("neutral");
67+
GetBacklight()->RestoreBrightness();
68+
});
69+
power_save_timer_->SetEnabled(true);
70+
}
71+
72+
void InitializeSpi() {
73+
spi_bus_config_t buscfg = {};
74+
buscfg.mosi_io_num = DISPLAY_SDA;
75+
buscfg.miso_io_num = GPIO_NUM_NC;
76+
buscfg.sclk_io_num = DISPLAY_SCL;
77+
buscfg.quadwp_io_num = GPIO_NUM_NC;
78+
buscfg.quadhd_io_num = GPIO_NUM_NC;
79+
buscfg.max_transfer_sz = DISPLAY_WIDTH * DISPLAY_HEIGHT * sizeof(uint16_t);
80+
ESP_ERROR_CHECK(spi_bus_initialize(SPI3_HOST, &buscfg, SPI_DMA_CH_AUTO));
81+
}
82+
83+
void InitializeButtons() {
84+
boot_button_.OnClick([this]() {
85+
power_save_timer_->WakeUp();
86+
auto& app = Application::GetInstance();
87+
if (GetNetworkType() == NetworkType::WIFI) {
88+
if (app.GetDeviceState() == kDeviceStateStarting && !WifiStation::GetInstance().IsConnected()) {
89+
// cast to WifiBoard
90+
auto& wifi_board = static_cast<WifiBoard&>(GetCurrentBoard());
91+
wifi_board.ResetWifiConfiguration();
92+
}
93+
}
94+
app.ToggleChatState();
95+
});
96+
97+
boot_button_.OnLongPress([this]() {
98+
SwitchNetworkType();
99+
});
100+
101+
volume_up_button_.OnClick([this]() {
102+
power_save_timer_->WakeUp();
103+
auto codec = GetAudioCodec();
104+
auto volume = codec->output_volume() + 10;
105+
if (volume > 100) {
106+
volume = 100;
107+
}
108+
codec->SetOutputVolume(volume);
109+
GetDisplay()->ShowNotification(Lang::Strings::VOLUME + std::to_string(volume/10));
110+
});
111+
112+
volume_up_button_.OnLongPress([this]() {
113+
power_save_timer_->WakeUp();
114+
GetAudioCodec()->SetOutputVolume(100);
115+
GetDisplay()->ShowNotification(Lang::Strings::MAX_VOLUME);
116+
});
117+
118+
volume_down_button_.OnClick([this]() {
119+
power_save_timer_->WakeUp();
120+
auto codec = GetAudioCodec();
121+
auto volume = codec->output_volume() - 10;
122+
if (volume < 0) {
123+
volume = 0;
124+
}
125+
codec->SetOutputVolume(volume);
126+
GetDisplay()->ShowNotification(Lang::Strings::VOLUME + std::to_string(volume/10));
127+
});
128+
129+
volume_down_button_.OnLongPress([this]() {
130+
power_save_timer_->WakeUp();
131+
GetAudioCodec()->SetOutputVolume(0);
132+
GetDisplay()->ShowNotification(Lang::Strings::MUTED);
133+
});
134+
}
135+
136+
void InitializeSt7789Display() {
137+
ESP_LOGD(TAG, "Install panel IO");
138+
esp_lcd_panel_io_spi_config_t io_config = {};
139+
io_config.cs_gpio_num = DISPLAY_CS;
140+
io_config.dc_gpio_num = DISPLAY_DC;
141+
io_config.spi_mode = 3;
142+
io_config.pclk_hz = 80 * 1000 * 1000;
143+
io_config.trans_queue_depth = 10;
144+
io_config.lcd_cmd_bits = 8;
145+
io_config.lcd_param_bits = 8;
146+
ESP_ERROR_CHECK(esp_lcd_new_panel_io_spi(SPI3_HOST, &io_config, &panel_io_));
147+
148+
ESP_LOGD(TAG, "Install LCD driver");
149+
esp_lcd_panel_dev_config_t panel_config = {};
150+
panel_config.reset_gpio_num = DISPLAY_RES;
151+
panel_config.rgb_ele_order = LCD_RGB_ELEMENT_ORDER_RGB;
152+
panel_config.bits_per_pixel = 16;
153+
ESP_ERROR_CHECK(esp_lcd_new_panel_st7789(panel_io_, &panel_config, &panel_));
154+
ESP_ERROR_CHECK(esp_lcd_panel_reset(panel_));
155+
ESP_ERROR_CHECK(esp_lcd_panel_init(panel_));
156+
ESP_ERROR_CHECK(esp_lcd_panel_swap_xy(panel_, DISPLAY_SWAP_XY));
157+
ESP_ERROR_CHECK(esp_lcd_panel_mirror(panel_, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y));
158+
ESP_ERROR_CHECK(esp_lcd_panel_invert_color(panel_, true));
159+
160+
display_ = new ZHENGCHEN_LcdDisplay(panel_io_, panel_, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_OFFSET_X, DISPLAY_OFFSET_Y,
161+
DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, DISPLAY_SWAP_XY,
162+
{
163+
.text_font = &font_puhui_20_4,
164+
.icon_font = &font_awesome_20_4,
165+
.emoji_font = font_emoji_64_init(),
166+
});
167+
display_->SetupHighTempWarningPopup();
168+
}
169+
170+
void InitializeIot() {
171+
auto& thing_manager = iot::ThingManager::GetInstance();
172+
thing_manager.AddThing(iot::CreateThing("Speaker"));
173+
thing_manager.AddThing(iot::CreateThing("Screen"));
174+
thing_manager.AddThing(iot::CreateThing("Battery"));
175+
}
176+
177+
public:
178+
ZHENGCHEN_1_54TFT_ML307() :
179+
DualNetworkBoard(ML307_TX_PIN, ML307_RX_PIN, 4096),
180+
boot_button_(BOOT_BUTTON_GPIO),
181+
volume_up_button_(VOLUME_UP_BUTTON_GPIO),
182+
volume_down_button_(VOLUME_DOWN_BUTTON_GPIO) {
183+
InitializePowerManager();
184+
InitializePowerSaveTimer();
185+
InitializeSpi();
186+
InitializeButtons();
187+
InitializeSt7789Display();
188+
InitializeIot();
189+
GetBacklight()->RestoreBrightness();
190+
}
191+
192+
virtual AudioCodec* GetAudioCodec() override {
193+
static NoAudioCodecSimplex audio_codec(AUDIO_INPUT_SAMPLE_RATE, AUDIO_OUTPUT_SAMPLE_RATE,
194+
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);
195+
return &audio_codec;
196+
}
197+
198+
virtual Display* GetDisplay() override {
199+
return display_;
200+
}
201+
202+
virtual Backlight* GetBacklight() override {
203+
static PwmBacklight backlight(DISPLAY_BACKLIGHT_PIN, DISPLAY_BACKLIGHT_OUTPUT_INVERT);
204+
return &backlight;
205+
}
206+
207+
virtual bool GetBatteryLevel(int& level, bool& charging, bool& discharging) override {
208+
static bool last_discharging = false;
209+
charging = power_manager_->IsCharging();
210+
discharging = power_manager_->IsDischarging();
211+
if (discharging != last_discharging) {
212+
power_save_timer_->SetEnabled(discharging);
213+
last_discharging = discharging;
214+
}
215+
level = power_manager_->GetBatteryLevel();
216+
return true;
217+
}
218+
219+
virtual bool GetTemperature(float& esp32temp) override {
220+
esp32temp = power_manager_->GetTemperature();
221+
return true;
222+
}
223+
224+
virtual void SetPowerSaveMode(bool enabled) override {
225+
if (!enabled) {
226+
power_save_timer_->WakeUp();
227+
}
228+
DualNetworkBoard::SetPowerSaveMode(enabled);
229+
}
230+
};
231+
232+
DECLARE_BOARD(ZHENGCHEN_1_54TFT_ML307);

main/boards/zhengchen-1.54tft-wifi/README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
# 产品相关介绍网址
2+
3+
```http
4+
https://e.tb.cn/h.6Gl2LC7rsrswQZp?tk=qFuaV9hzh0k CZ356
5+
```
6+
17
# 编译配置命令
28

39
**配置编译目标为 ESP32S3:**

0 commit comments

Comments
 (0)