阶段1: 将 dzbj 项目的 LVGL 8.3.11 LCD 显示集成到 AI小智 主项目, 开机显示 ScreenHome 界面,同时优化配网模式下的内存使用, 确保 WiFi+BLE+LVGL 三者共存运行。 ## 新增功能 ### dzbj 显示模块集成 - 新增 main/dzbj/ 目录,移植 LCD 驱动(ST77916 QSPI)、触摸驱动(CST816S)、 LVGL 初始化和 SquareLine Studio UI 界面 - I2C 总线共享:dzbj 触摸控制器复用主项目的 I2C_NUM_1 总线 - GPIO 冲突解决:LED(GPIO21)、Touch1(GPIO1)、Touch4(GPIO7) 改为 NC, 电池 ADC 从 GPIO6 改为 GPIO3 - 添加 LVGL、esp_lcd_st77916、esp_lcd_touch_cst816s 等组件依赖 - managed_components 纳入版本管理 ### 配网模式轻量化启动 - BoxAudioCodec: 新增 output_only 模式,仅创建 I2S TX 通道(省 ~13KB DMA) 跳过 ES7210 ADC 初始化(省 ~2-4KB) - AudioCodec: 新增 StartOutputOnly() 方法,仅启用扬声器输出 - Application: 配网模式跳过 Opus 编码器、输入重采样器、协议初始化、 天气位置检测等网络业务 - 板级构造函数: 配网模式跳过电池检测、IMU传感器、PowerSaveTimer ### WifiBoard 配网流程修复 - NeedsProvisioning() 静态方法: 读取 NVS force_ap 和 SSID 列表, 用于提前判断配网模式 - force_ap 竞态修复: 构造函数不再清零 force_ap,改在 StartNetwork() 清零, 确保 NeedsProvisioning() 能正确读到 force_ap=1 - Application 缓存 provisioning_mode_ 成员变量,避免重复读 NVS ### BLE 配网重启修复 - 配网成功后用 esp_timer 延迟重启替代 xTaskCreate, 避免内存紧张时任务创建失败导致设备不重启 - 注释掉 WiFi 连接成功后的 MAC 地址发送步骤 ### sdkconfig 内存优化 - BT_ALLOCATION_FROM_SPIRAM_FIRST=y (BLE 动态分配优先 PSRAM) - SPIRAM_MALLOC_RESERVE_INTERNAL=32768 - NVS_ALLOCATE_CACHE_IN_SPIRAM=y - WiFi 静态缓冲区数量优化 (RX=10, TX=8) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
54 lines
1.8 KiB
C
54 lines
1.8 KiB
C
#include "pages_pwm.h"
|
||
#include "dzbj_gpio.h"
|
||
#include "driver/ledc.h"
|
||
|
||
// 当前亮度值(用于休眠恢复)
|
||
static uint8_t current_brightness = 50;
|
||
|
||
// 获取当前亮度值
|
||
uint8_t pwm_get_brightness(void) {
|
||
return current_brightness;
|
||
}
|
||
|
||
// 设置屏幕亮度,percent范围0-100
|
||
// 0=完全关闭背光,10~100为正常亮度范围
|
||
// 显示10%~100%映射到实际亮度20%~100%,背光低电平有效需反转占空比
|
||
void pwm_set_brightness(uint8_t percent) {
|
||
if (percent == 0) {
|
||
// 完全关闭背光(低电平有效,占空比100%=全高=关闭)
|
||
ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, 8191);
|
||
ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0);
|
||
return;
|
||
}
|
||
if (percent < 10) percent = 10;
|
||
if (percent > 100) percent = 100;
|
||
current_brightness = percent;
|
||
uint32_t actual = 20 + (uint32_t)(percent - 10) * 80 / 90;
|
||
uint32_t duty = 8191 - (8191 * actual) / 100;
|
||
ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, duty);
|
||
ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0);
|
||
}
|
||
|
||
// 初始化PWM背光
|
||
void pwm_init(void) {
|
||
ledc_timer_config_t ledc_timer = {
|
||
.speed_mode = LEDC_LOW_SPEED_MODE,
|
||
.timer_num = LEDC_TIMER_0,
|
||
.duty_resolution = LEDC_TIMER_13_BIT,
|
||
.freq_hz = 5000,
|
||
.clk_cfg = LEDC_AUTO_CLK
|
||
};
|
||
ledc_timer_config(&ledc_timer);
|
||
ledc_channel_config_t ledc_channel = {
|
||
.speed_mode = LEDC_LOW_SPEED_MODE,
|
||
.channel = LEDC_CHANNEL_0,
|
||
.timer_sel = LEDC_TIMER_0,
|
||
.intr_type = LEDC_INTR_DISABLE,
|
||
.gpio_num = PIN_LCD_EN,
|
||
.duty = 0,
|
||
.hpoint = 0
|
||
};
|
||
ledc_channel_config(&ledc_channel);
|
||
pwm_set_brightness(50); // 初始亮度50%
|
||
}
|