V1.5: 4G运行时ESP_EN拉低关闭WiFi模块省电;断电判定提速至100ms复核+优先发pow:0+留500ms发送窗口

This commit is contained in:
helei 2026-08-15 18:19:59 +08:00
parent 08a1e182b5
commit 771e70dc38
6 changed files with 40 additions and 23 deletions

View File

@ -41,11 +41,8 @@ uint16_t getAdc(void)
void update_batter(void)
{
static _Bool powoff = 0;
static uint8_t low_cnt = 0;
float batter_valtage;
uint16_t adc_value;
adc_value = getAdc();
batter_valtage = adc_value * (3.3 / 4096.0);
uint16_t adc_value = getAdc();
float batter_valtage = adc_value * (3.3 / 4096.0);
batter_valtage = batter_valtage * 11.0;
batter_valtage += 0.6;
batter_valtage = 100 * (batter_valtage - 10.8) / (12.6 - 10.8);
@ -53,24 +50,29 @@ void update_batter(void)
if (batter_valtage < 0) batter_valtage = 0;
if (batter_valtage > 100) batter_valtage = 100;
/* 连续 3 次低于 10% 才判定(去抖),防止单次采样毛刺误判 */
if (batter_valtage < 10) {
if (low_cnt < 3) low_cnt++;
} else {
low_cnt = 0;
/* 电量 <10% 基本等同外部 12V 断开。法拉电容(5.5F)续航有限,
* 50ms 2 100ms
* 500ms */
if (batter_valtage < 10 && powoff == 0) {
uint8_t confirm = 1;
for (int k = 0; k < 2; k++) {
HAL_Delay(50);
adc_value = getAdc();
float v = adc_value * (3.3 / 4096.0);
v = v * 11.0 + 0.6;
v = 100 * (v - 10.8) / (12.6 - 10.8);
if (v >= 10) { confirm = 0; break; }
}
if (!confirm) return;
if (low_cnt >= 3 && powoff == 0) {
powoff = 1;
log_info("> µçÁ¿µÍ: %d%%", (int)batter_valtage);
NET_publish_power(0);
/* 电量 <10% 基本等同外部 12V 断开(法拉电容续航约 30s
*
* BootLoader 12V APP */
hlw8032_save(); /* 法拉电容续航内把累计电量写进 EEPROM */
NET_publish_power(0); /* 优先发掉电消息 */
hlw8032_save(); /* 本地记录:电量、断电原因(都很快) */
reset_log_power_loss();
HAL_Delay(200);
HAL_Delay(500); /* 给模组把 MQTT 报文发出去的时间 */
NVIC_SystemReset();
/* BootLoader 会检测主电源12V 未恢复前不跳 APP防止外设没上电时程序乱跑 */
}
/* LED1: µÍµçÁ¿Ê±³£ÁÁ */
if (powoff) LED1_ON; else LED1_OFF;

View File

@ -41,6 +41,14 @@ volatile uint8_t g_no_sim_detected = 0;
volatile uint8_t g_no_signal_detected = 0;
/* 当前激活的网络后端 */
/* WiFi 模块使能脚PA6高电平工作4G 运行时拉低断电省电 */
#define ESP_EN_PORT GPIOA
#define ESP_EN_PIN GPIO_PIN_6
static void esp_power(uint8_t on)
{
HAL_GPIO_WritePin(ESP_EN_PORT, ESP_EN_PIN, on ? GPIO_PIN_SET : GPIO_PIN_RESET);
}
volatile net_ui_phase_t g_net_ui_phase = NET_UI_NONE;
volatile int g_net_ui_countdown = 0;
@ -128,6 +136,7 @@ void NET_init(void)
if (m == NET_MODE_4G) {
s_backend = NET_BACKEND_4G;
esp_power(0); /* 4G 优先:关闭 WiFi 模块省电 */
net_at_lock();
air780e_init();
net_at_unlock();
@ -141,6 +150,7 @@ void NET_init(void)
} else {
/* 上次 WiFi 成功WiFi 优先NET_process 会立即发起 net_wifi_init */
log_info("> NET: 上次联网方式为 WiFiWiFi 优先");
esp_power(1); /* WiFi 优先:使能 WiFi 模块 */
s_backend = NET_BACKEND_WIFI;
}
}
@ -149,6 +159,7 @@ void NET_init(void)
static void net_switch_to_wifi(void)
{
log_warn("> NET: 切换 4G -> WiFi");
esp_power(1); /* 使能 WiFi 模块 */
USART3_StopRx();
g_net_mqtt_ready = 0;
g_net_first_publish_ok = 0;
@ -160,6 +171,7 @@ static void net_switch_to_4g(void)
{
log_warn("> NET: 切换 WiFi -> 4G");
UART4_StopRx();
esp_power(0); /* 关闭 WiFi 模块省电 */
g_net_mqtt_ready = 0;
g_net_first_publish_ok = 0;
g_no_sim_detected = 0;

View File

@ -102,8 +102,9 @@ void MX_GPIO_Init(void)
g.Pin = GPIO_PIN_4;
HAL_GPIO_Init(GPIOC, &g);
/* ESP_EN(PA6): WiFi 模块使能,高电平有效,推挽输出(上电给高电平) */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);
/* ESP_EN(PA6): WiFi 模块使能,高电平有效。默认关闭省电,
* network.c 4G WiFi */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);
g.Mode = GPIO_MODE_OUTPUT_PP;
g.Pin = GPIO_PIN_6;
HAL_GPIO_Init(GPIOA, &g);

View File

@ -31,7 +31,7 @@ extern UART_HandleTypeDef huart3;
*
*/
/*===== 固件版本号(开机横幅打印用,改版本只动这里) =====*/
#define FIRMWARE_VERSION_STR "1.5.0"
#define FIRMWARE_VERSION_STR "1.5.1"
#define PRODUCT_WITH_FEED_SCALE 0

View File

@ -59,7 +59,7 @@
| UART5 | HLW8032 电能计量 | PD2(RX) | 4800-8E1只收芯片每 50ms 主动上报 |
| ESP_RST | WiFi 模块复位 | PA5 | 低电平 500ms 复位 |
| CAT_PWR | 4G 模块开机 | PC4 | 开漏输出,拉低=模块开机(上电即拉低) |
| ESP_EN | WiFi 模块使能 | PA6 | 推挽输出,高电平=使能(上电即置高) |
| ESP_EN | WiFi 模块使能 | PA6 | 推挽输出,高电平=使能**默认关闭4G 运行时拉低断电省电,切 WiFi 才拉高** |
| BT_MODE | 蓝牙 AT/透传切换 | PB0 | 开漏输出,拉低 1s 进 AT 模式ble_at.c 控制) |
| BT_RST | 蓝牙模块复位 | PA7 | 推挽输出,低电平=工作(默认),高电平=复位 |
| OLED 屏幕 | 128x64 + GB2312 字库 IC | CLK=PC12 MOSI=PC9 DC=PC8 CS1=PC7 FSO=PC6 CS2=PB15 | GPIO 模拟 SPI显示电压/电流/功率/电能/继电器/网络 |
@ -101,7 +101,7 @@
### 断电保护(法拉电容 + PA0 检测)
- APPPA0 电量检测连续 3 次 <10%=外部 12V 断开上报 `pow:0` 立即把"外部断电"记录含精确运行时长写入 W25Q64 复位电量百分比做了 0~100% 限幅电容放电时 3.3V 基准下跌会失真
- APPPA0 电量检测 <10%=外部 12V 断开立即 50ms 快速复核 2 100ms 出结果法拉电容 5.5F 续航有限 3s 去抖来不及)→ **优先上报 `pow:0`** 写电能/断电记录 500ms 让模组把报文发完 复位电量百分比做了 0~100% 限幅电容放电时 3.3V 基准下跌会失真
- BootLoader跳转 APP 前读 PA0寄存器直读 ADC主电源未恢复< 11V则每 500ms 检测原地等待**不跳 APP**防止单片机靠电容低压运行 APP 而外设没电的乱态12V 恢复后正常放行
- 断电记录只被下次成功启动消费一次(`boot_seen` 位翻转标记),一次掉电 = 一条记录BL 等待期间不产生记录
- BL 找不到有效 APP如只刷了 BL打印提示并每 3s 主动复位重试,刷入 APP 即恢复

View File

@ -135,3 +135,5 @@
- OLED 欢迎页按产品模式显示标题;运行时间改 天:时:分 格式
- 新增 SIM 卡号上报4G 初始化 SIM 就绪后 AT+ICCID 读卡号MQTT OK 后随 pow 上报平台
(标识符 iccid字符串平台物模型加字符串字段即可便于物联网卡套餐到期查询缴费
- 4G 运行时关闭 WiFi 模块ESP_EN(PA6) 默认低电平,切 WiFi 才拉高、切回 4G 拉低断电(省电/延长法拉电容续航)
- 断电消息提速:电量 <10% 判定从 3s 去抖改为 100ms 快速复核确认后优先发 pow:0再写记录 500ms 让模组发完再复位5.5F 电容下原逻辑来不及上报