V1.5: 断电检测改50ms快轮询+先发包后打日志;修复通道忙时掉电消息被丢弃(改为50ms周期重试直到发出)
This commit is contained in:
parent
9fe86a5111
commit
9d1842404c
|
|
@ -65,9 +65,12 @@ void update_batter(void)
|
|||
}
|
||||
if (!confirm) return;
|
||||
|
||||
/* 分毫必争:先发掉电消息,后打日志(串口打印也要十几 ms)。
|
||||
* 发送通道被占用(如 GPS 轮询)时丢弃返回 -1:不锁存,下个 50ms 周期重试,
|
||||
* 直到发出或电容耗尽 */
|
||||
if (NET_publish_power(0) != 0) return;
|
||||
powoff = 1;
|
||||
log_info("> 电量低: %d%%", (int)batter_valtage);
|
||||
NET_publish_power(0); /* 优先发掉电消息 */
|
||||
hlw8032_save(); /* 本地记录:电量、断电原因(都很快) */
|
||||
reset_log_power_loss();
|
||||
HAL_Delay(500); /* 给模组把 MQTT 报文发出去的时间 */
|
||||
|
|
|
|||
|
|
@ -317,11 +317,11 @@ void NET_publish_response(const char *cmd_id, int ok, const char *msg)
|
|||
net_at_unlock();
|
||||
}
|
||||
|
||||
/* 上报电量状态: on=1 正常, on=0 低电量 */
|
||||
void NET_publish_power(int on)
|
||||
/* 上报电量状态: on=1 正常, on=0 低电量。返回 0=已发出,-1=通道忙被丢弃 */
|
||||
int NET_publish_power(int on)
|
||||
{
|
||||
if (g_net_tx_busy) { log_info("> NET: 电量上报被丢弃 (发送忙)"); return; }
|
||||
if (net_at_trylock() != 0) { log_info("> NET: 电量上报被丢弃 (AT 忙)"); return; }
|
||||
if (g_net_tx_busy) { log_info("> NET: 电量上报被丢弃 (发送忙)"); return -1; }
|
||||
if (net_at_trylock() != 0) { log_info("> NET: 电量上报被丢弃 (AT 忙)"); return -1; }
|
||||
if (s_backend == NET_BACKEND_4G) {
|
||||
CAT1_printf("AT+MPUB=\"/iot/data/up/%s\",0,0,\"{\\22header\\22:\\22iot.prop.post\\22,\\22body\\22:{\\22pow\\22:%d}}\"",
|
||||
MqttInfoStr.ClientID, on ? 1 : 0);
|
||||
|
|
@ -332,6 +332,7 @@ void NET_publish_power(int on)
|
|||
net_wifi_publish_up(json);
|
||||
}
|
||||
net_at_unlock();
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* 上报累计电量: energy 字段,单位 kWh,两位小数 */
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@ net_backend_t NET_GetActiveBackend(void);
|
|||
void NET_publish_status(int sw1, int feeding, int sw2, int sw3, int sw4,
|
||||
float weight_kg, float once_wt_kg, float zero_kg);
|
||||
void NET_publish_response(const char *cmd_id, int ok, const char *msg);
|
||||
void NET_publish_power(int on);
|
||||
int NET_publish_power(int on); /* 返回 0=已发出,-1=通道忙被丢弃 */
|
||||
void NET_publish_energy(float kwh); /* 上报累计电量,标识符 energy,单位 kWh */
|
||||
int NET_mqtt_report(const char *header, const char *ota_id, int val); /* 返回 0=送达 */
|
||||
int NET_ota_confirm(void); /* 0=确认通知已送达 1=无挂起 -1=未送达(需重试) */
|
||||
|
|
|
|||
|
|
@ -320,6 +320,7 @@ static void sys_task(void *arg)
|
|||
{
|
||||
(void)arg;
|
||||
uint32_t batt_tick = HAL_GetTick();
|
||||
uint32_t batt_fast_tick = HAL_GetTick();
|
||||
uint32_t up_last = HAL_GetTick();
|
||||
uint32_t up_print = HAL_GetTick();
|
||||
uint32_t en_print = HAL_GetTick();
|
||||
|
|
@ -335,10 +336,15 @@ static void sys_task(void *arg)
|
|||
/* LED 心跳/联网指示 */
|
||||
activeEvents();
|
||||
|
||||
/* 电量 1s 节流更新 */
|
||||
/* 断电检测 50ms 快轮询(PA0 掉电要抢在法拉电容耗尽前发消息) */
|
||||
if (HAL_GetTick() - batt_fast_tick >= 50) {
|
||||
batt_fast_tick = HAL_GetTick();
|
||||
update_batter();
|
||||
}
|
||||
|
||||
/* 运行秒数 1s 节流更新 */
|
||||
if (HAL_GetTick() - batt_tick >= 1000) {
|
||||
batt_tick = HAL_GetTick();
|
||||
update_batter();
|
||||
hlw8032_tick(); /* 攒够约 0.1kWh 写一次 EEPROM */
|
||||
oled_home_refresh(up_ms); /* OLED 界面 1s 刷新 */
|
||||
reset_log_tick((uint32_t)(up_ms / 1000)); /* 共享 RAM 更新运行秒数,热复位不丢 */
|
||||
|
|
|
|||
|
|
@ -101,7 +101,7 @@
|
|||
|
||||
### 断电保护(法拉电容 + PA0 检测)
|
||||
|
||||
- APP:PA0 电量检测 <10%(=外部 12V 断开)立即 50ms 快速复核 2 次(约 100ms 出结果,法拉电容 5.5F 续航有限,原 3s 去抖来不及)→ **优先上报 `pow:0`** → 写电能/断电记录 → 留 500ms 让模组把报文发完 → 复位。电量百分比做了 0~100% 限幅(电容放电时 3.3V 基准下跌会失真)
|
||||
- APP:PA0 电量检测改为 **50ms 快轮询**(原 1s),<10%(=外部 12V 断开)立即 50ms 快速复核 2 次(检测+确认全程 ~150ms)→ **先发 `pow:0` 后打日志** → 写电能/断电记录 → 留 500ms 让模组把报文发完 → 复位。发送通道忙(如 GPS 轮询占锁)时不锁存、下个周期重试直到发出或电容耗尽。电量百分比做了 0~100% 限幅(电容放电时 3.3V 基准下跌会失真)
|
||||
- BootLoader:跳转 APP 前读 PA0(寄存器直读 ADC),主电源未恢复(<约 11V)则每 500ms 检测原地等待,**不跳 APP**——防止单片机靠电容低压运行 APP 而外设没电的乱态;12V 恢复后正常放行
|
||||
- 断电记录只被下次成功启动消费一次(`boot_seen` 位翻转标记),一次掉电 = 一条记录,BL 等待期间不产生记录
|
||||
- BL 找不到有效 APP(如只刷了 BL):打印提示并每 3s 主动复位重试,刷入 APP 即恢复
|
||||
|
|
|
|||
|
|
@ -140,3 +140,5 @@
|
|||
- 修复 OTA 确认通知发送失败("重试 3 次无 OK"):确认从首次发布+3s 延后到 +9s 避开开机上报风暴;
|
||||
本地确认标志/版本号先于通知落盘(通知失败不再影响防回滚);通知未送达每 30s 重试直到成功;
|
||||
开机 pow/ICCID 上报间隔拉开到 300ms
|
||||
- 断电上报再提速:PA0 检测从 1s 轮询改 50ms 快轮询(检测+确认 ~150ms 触发);先发包后打日志;
|
||||
修复发送通道忙时掉电消息被丢弃不重试的问题(NET_publish_power 返回状态,忙则 50ms 后重试直到发出)
|
||||
|
|
|
|||
Loading…
Reference in New Issue