V1.5: 4G运行时ESP_EN拉低关闭WiFi模块省电;断电判定提速至100ms复核+优先发pow:0+留500ms发送窗口
This commit is contained in:
parent
08a1e182b5
commit
771e70dc38
|
|
@ -41,11 +41,8 @@ uint16_t getAdc(void)
|
||||||
void update_batter(void)
|
void update_batter(void)
|
||||||
{
|
{
|
||||||
static _Bool powoff = 0;
|
static _Bool powoff = 0;
|
||||||
static uint8_t low_cnt = 0;
|
uint16_t adc_value = getAdc();
|
||||||
float batter_valtage;
|
float batter_valtage = adc_value * (3.3 / 4096.0);
|
||||||
uint16_t adc_value;
|
|
||||||
adc_value = getAdc();
|
|
||||||
batter_valtage = adc_value * (3.3 / 4096.0);
|
|
||||||
batter_valtage = batter_valtage * 11.0;
|
batter_valtage = batter_valtage * 11.0;
|
||||||
batter_valtage += 0.6;
|
batter_valtage += 0.6;
|
||||||
batter_valtage = 100 * (batter_valtage - 10.8) / (12.6 - 10.8);
|
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 < 0) batter_valtage = 0;
|
||||||
if (batter_valtage > 100) batter_valtage = 100;
|
if (batter_valtage > 100) batter_valtage = 100;
|
||||||
|
|
||||||
/* 连续 3 次低于 10% 才判定(去抖),防止单次采样毛刺误判 */
|
/* 电量 <10% 基本等同外部 12V 断开。法拉电容(5.5F)续航有限,
|
||||||
if (batter_valtage < 10) {
|
* 首次低于阈值立即 50ms 快速复核 2 次(约 100ms 出结果),仍低马上按断电处理:
|
||||||
if (low_cnt < 3) low_cnt++;
|
* 优先把掉电消息发出去,再做本地记录,最后留 500ms 让模组把报文真正发完 */
|
||||||
} else {
|
if (batter_valtage < 10 && powoff == 0) {
|
||||||
low_cnt = 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;
|
powoff = 1;
|
||||||
log_info("> 电量低: %d%%", (int)batter_valtage);
|
log_info("> 电量低: %d%%", (int)batter_valtage);
|
||||||
NET_publish_power(0);
|
NET_publish_power(0); /* 优先发掉电消息 */
|
||||||
/* 电量 <10% 基本等同外部 12V 断开(法拉电容续航约 30s),
|
hlw8032_save(); /* 本地记录:电量、断电原因(都很快) */
|
||||||
* 立即写断电记录(含当前运行时长),随后复位:
|
|
||||||
* BootLoader 会检测主电源,12V 未恢复前不跳 APP,防止外设没上电时程序乱跑 */
|
|
||||||
hlw8032_save(); /* 法拉电容续航内把累计电量写进 EEPROM */
|
|
||||||
reset_log_power_loss();
|
reset_log_power_loss();
|
||||||
HAL_Delay(200);
|
HAL_Delay(500); /* 给模组把 MQTT 报文发出去的时间 */
|
||||||
NVIC_SystemReset();
|
NVIC_SystemReset();
|
||||||
|
/* BootLoader 会检测主电源,12V 未恢复前不跳 APP,防止外设没上电时程序乱跑 */
|
||||||
}
|
}
|
||||||
/* LED1: 低电量时常亮 */
|
/* LED1: 低电量时常亮 */
|
||||||
if (powoff) LED1_ON; else LED1_OFF;
|
if (powoff) LED1_ON; else LED1_OFF;
|
||||||
|
|
|
||||||
|
|
@ -41,6 +41,14 @@ volatile uint8_t g_no_sim_detected = 0;
|
||||||
volatile uint8_t g_no_signal_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 net_ui_phase_t g_net_ui_phase = NET_UI_NONE;
|
||||||
volatile int g_net_ui_countdown = 0;
|
volatile int g_net_ui_countdown = 0;
|
||||||
|
|
||||||
|
|
@ -128,6 +136,7 @@ void NET_init(void)
|
||||||
|
|
||||||
if (m == NET_MODE_4G) {
|
if (m == NET_MODE_4G) {
|
||||||
s_backend = NET_BACKEND_4G;
|
s_backend = NET_BACKEND_4G;
|
||||||
|
esp_power(0); /* 4G 优先:关闭 WiFi 模块省电 */
|
||||||
net_at_lock();
|
net_at_lock();
|
||||||
air780e_init();
|
air780e_init();
|
||||||
net_at_unlock();
|
net_at_unlock();
|
||||||
|
|
@ -141,6 +150,7 @@ void NET_init(void)
|
||||||
} else {
|
} else {
|
||||||
/* 上次 WiFi 成功:WiFi 优先,NET_process 会立即发起 net_wifi_init */
|
/* 上次 WiFi 成功:WiFi 优先,NET_process 会立即发起 net_wifi_init */
|
||||||
log_info("> NET: 上次联网方式为 WiFi,WiFi 优先");
|
log_info("> NET: 上次联网方式为 WiFi,WiFi 优先");
|
||||||
|
esp_power(1); /* WiFi 优先:使能 WiFi 模块 */
|
||||||
s_backend = NET_BACKEND_WIFI;
|
s_backend = NET_BACKEND_WIFI;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -149,6 +159,7 @@ void NET_init(void)
|
||||||
static void net_switch_to_wifi(void)
|
static void net_switch_to_wifi(void)
|
||||||
{
|
{
|
||||||
log_warn("> NET: 切换 4G -> WiFi");
|
log_warn("> NET: 切换 4G -> WiFi");
|
||||||
|
esp_power(1); /* 使能 WiFi 模块 */
|
||||||
USART3_StopRx();
|
USART3_StopRx();
|
||||||
g_net_mqtt_ready = 0;
|
g_net_mqtt_ready = 0;
|
||||||
g_net_first_publish_ok = 0;
|
g_net_first_publish_ok = 0;
|
||||||
|
|
@ -160,6 +171,7 @@ static void net_switch_to_4g(void)
|
||||||
{
|
{
|
||||||
log_warn("> NET: 切换 WiFi -> 4G");
|
log_warn("> NET: 切换 WiFi -> 4G");
|
||||||
UART4_StopRx();
|
UART4_StopRx();
|
||||||
|
esp_power(0); /* 关闭 WiFi 模块省电 */
|
||||||
g_net_mqtt_ready = 0;
|
g_net_mqtt_ready = 0;
|
||||||
g_net_first_publish_ok = 0;
|
g_net_first_publish_ok = 0;
|
||||||
g_no_sim_detected = 0;
|
g_no_sim_detected = 0;
|
||||||
|
|
|
||||||
|
|
@ -102,8 +102,9 @@ void MX_GPIO_Init(void)
|
||||||
g.Pin = GPIO_PIN_4;
|
g.Pin = GPIO_PIN_4;
|
||||||
HAL_GPIO_Init(GPIOC, &g);
|
HAL_GPIO_Init(GPIOC, &g);
|
||||||
|
|
||||||
/* ESP_EN(PA6): WiFi 模块使能,高电平有效,推挽输出(上电给高电平) */
|
/* ESP_EN(PA6): WiFi 模块使能,高电平有效。默认关闭省电,
|
||||||
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);
|
* 由 network.c 按通道开关(4G 运行时拉低断电,切 WiFi 才拉高) */
|
||||||
|
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);
|
||||||
g.Mode = GPIO_MODE_OUTPUT_PP;
|
g.Mode = GPIO_MODE_OUTPUT_PP;
|
||||||
g.Pin = GPIO_PIN_6;
|
g.Pin = GPIO_PIN_6;
|
||||||
HAL_GPIO_Init(GPIOA, &g);
|
HAL_GPIO_Init(GPIOA, &g);
|
||||||
|
|
|
||||||
|
|
@ -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
|
#define PRODUCT_WITH_FEED_SCALE 0
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -59,7 +59,7 @@
|
||||||
| UART5 | HLW8032 电能计量 | PD2(RX) | 4800-8E1,只收,芯片每 50ms 主动上报 |
|
| UART5 | HLW8032 电能计量 | PD2(RX) | 4800-8E1,只收,芯片每 50ms 主动上报 |
|
||||||
| ESP_RST | WiFi 模块复位 | PA5 | 低电平 500ms 复位 |
|
| ESP_RST | WiFi 模块复位 | PA5 | 低电平 500ms 复位 |
|
||||||
| CAT_PWR | 4G 模块开机 | PC4 | 开漏输出,拉低=模块开机(上电即拉低) |
|
| CAT_PWR | 4G 模块开机 | PC4 | 开漏输出,拉低=模块开机(上电即拉低) |
|
||||||
| ESP_EN | WiFi 模块使能 | PA6 | 推挽输出,高电平=使能(上电即置高) |
|
| ESP_EN | WiFi 模块使能 | PA6 | 推挽输出,高电平=使能;**默认关闭,4G 运行时拉低断电省电,切 WiFi 才拉高** |
|
||||||
| BT_MODE | 蓝牙 AT/透传切换 | PB0 | 开漏输出,拉低 1s 进 AT 模式(ble_at.c 控制) |
|
| BT_MODE | 蓝牙 AT/透传切换 | PB0 | 开漏输出,拉低 1s 进 AT 模式(ble_at.c 控制) |
|
||||||
| BT_RST | 蓝牙模块复位 | PA7 | 推挽输出,低电平=工作(默认),高电平=复位 |
|
| BT_RST | 蓝牙模块复位 | PA7 | 推挽输出,低电平=工作(默认),高电平=复位 |
|
||||||
| OLED 屏幕 | 128x64 + GB2312 字库 IC | CLK=PC12 MOSI=PC9 DC=PC8 CS1=PC7 FSO=PC6 CS2=PB15 | GPIO 模拟 SPI,显示电压/电流/功率/电能/继电器/网络 |
|
| OLED 屏幕 | 128x64 + GB2312 字库 IC | CLK=PC12 MOSI=PC9 DC=PC8 CS1=PC7 FSO=PC6 CS2=PB15 | GPIO 模拟 SPI,显示电压/电流/功率/电能/继电器/网络 |
|
||||||
|
|
@ -101,7 +101,7 @@
|
||||||
|
|
||||||
### 断电保护(法拉电容 + PA0 检测)
|
### 断电保护(法拉电容 + PA0 检测)
|
||||||
|
|
||||||
- APP:PA0 电量检测连续 3 次 <10%(=外部 12V 断开)→ 上报 `pow:0` → 立即把"外部断电"记录(含精确运行时长)写入 W25Q64 → 复位。电量百分比做了 0~100% 限幅(电容放电时 3.3V 基准下跌会失真)
|
- APP:PA0 电量检测 <10%(=外部 12V 断开)立即 50ms 快速复核 2 次(约 100ms 出结果,法拉电容 5.5F 续航有限,原 3s 去抖来不及)→ **优先上报 `pow:0`** → 写电能/断电记录 → 留 500ms 让模组把报文发完 → 复位。电量百分比做了 0~100% 限幅(电容放电时 3.3V 基准下跌会失真)
|
||||||
- BootLoader:跳转 APP 前读 PA0(寄存器直读 ADC),主电源未恢复(<约 11V)则每 500ms 检测原地等待,**不跳 APP**——防止单片机靠电容低压运行 APP 而外设没电的乱态;12V 恢复后正常放行
|
- BootLoader:跳转 APP 前读 PA0(寄存器直读 ADC),主电源未恢复(<约 11V)则每 500ms 检测原地等待,**不跳 APP**——防止单片机靠电容低压运行 APP 而外设没电的乱态;12V 恢复后正常放行
|
||||||
- 断电记录只被下次成功启动消费一次(`boot_seen` 位翻转标记),一次掉电 = 一条记录,BL 等待期间不产生记录
|
- 断电记录只被下次成功启动消费一次(`boot_seen` 位翻转标记),一次掉电 = 一条记录,BL 等待期间不产生记录
|
||||||
- BL 找不到有效 APP(如只刷了 BL):打印提示并每 3s 主动复位重试,刷入 APP 即恢复
|
- BL 找不到有效 APP(如只刷了 BL):打印提示并每 3s 主动复位重试,刷入 APP 即恢复
|
||||||
|
|
|
||||||
|
|
@ -135,3 +135,5 @@
|
||||||
- OLED 欢迎页按产品模式显示标题;运行时间改 天:时:分 格式
|
- OLED 欢迎页按产品模式显示标题;运行时间改 天:时:分 格式
|
||||||
- 新增 SIM 卡号上报:4G 初始化 SIM 就绪后 AT+ICCID 读卡号,MQTT OK 后随 pow 上报平台
|
- 新增 SIM 卡号上报:4G 初始化 SIM 就绪后 AT+ICCID 读卡号,MQTT OK 后随 pow 上报平台
|
||||||
(标识符 iccid,字符串;平台物模型加字符串字段即可,便于物联网卡套餐到期查询缴费)
|
(标识符 iccid,字符串;平台物模型加字符串字段即可,便于物联网卡套餐到期查询缴费)
|
||||||
|
- 4G 运行时关闭 WiFi 模块:ESP_EN(PA6) 默认低电平,切 WiFi 才拉高、切回 4G 拉低断电(省电/延长法拉电容续航)
|
||||||
|
- 断电消息提速:电量 <10% 判定从 3s 去抖改为 100ms 快速复核,确认后优先发 pow:0、再写记录、留 500ms 让模组发完再复位(5.5F 电容下原逻辑来不及上报)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue