V1.5: 电能上报策略改为功率>10W每30s一次,<=10W仅首次联网报一次(开关切换随状态大报文携带)

This commit is contained in:
helei 2026-08-15 07:58:55 +08:00
parent 048eed9be6
commit 7500acb041
2 changed files with 23 additions and 7 deletions

View File

@ -293,8 +293,10 @@ static void oled_home_refresh(uint32_t up_ms)
}
}
/* 电能日志/上报间隔:想改频率就改这个宏(单位 ms */
#define ENERGY_REPORT_INTERVAL_MS 10000u
/* 电能上报策略:功率 > 10W 时每 30s 上报一次;<=10W 仅首次联网报一次
* energy 10s */
#define ENERGY_REPORT_INTERVAL_MS 30000u
#define ENERGY_REPORT_POWER_W 10.0f
/*==== sys_task系统辅助LED/电量/蓝牙命令/运行时长)====*/
static void sys_task(void *arg)
@ -344,16 +346,30 @@ static void sys_task(void *arg)
}
}
/* 电能日志+上报:联网且计量芯片在线时每 ENERGY_REPORT_INTERVAL_MS 一条 */
/* 电能:串口日志固定 10s 一条;上报按功率策略(>10W 每 30s否则仅首次 */
if (g_net_mqtt_ready && hlw8032_online() &&
(HAL_GetTick() - en_print) >= ENERGY_REPORT_INTERVAL_MS) {
(HAL_GetTick() - en_print) >= 10000u) {
en_print = HAL_GetTick();
static uint8_t energy_first_reported = 0;
static uint32_t energy_report_tick = 0;
float kwh = hlw8032_get_energy_kwh();
float pw = hlw8032_get_power_w();
uint8_t report = 0;
if (!energy_first_reported) {
report = 1;
energy_first_reported = 1;
} else if (pw > ENERGY_REPORT_POWER_W &&
(HAL_GetTick() - energy_report_tick) >= ENERGY_REPORT_INTERVAL_MS) {
report = 1;
}
if (report) {
energy_report_tick = HAL_GetTick();
NET_publish_energy(kwh);
}
log_info(FMT_ENERGY, (double)kwh,
(double)hlw8032_get_voltage_v(),
(double)hlw8032_get_current_a(),
(double)hlw8032_get_power_w());
(double)pw);
}
vTaskDelay(20);

View File

@ -115,7 +115,7 @@
- **电量算法**(手册公式):`kWh = 总脉冲 × 功率参数寄存器 × 电压系数 × 电流系数 / (10^9×3600)`PF 寄存器 16 位溢出由数据更新寄存器 bit7 翻转计数(`总脉冲 = k×65536 + PF`50ms 一帧不可能漏翻转;芯片断电重启(计数值倒退)自动重新基准
- **系数宏**`main.h` 的 `HLW_U_COEF`=100K/49.9/1000=2.004)、`HLW_I_COEF`=1/(0.002×1000)=0.5)——改电阻/互感器只动这两个宏
- **持久化**累计脉冲数uint64存 EEPROM 偏移 164~171每攒约 0.1kWh 写一次(限制擦写),所有计划内复位(`reset_log_mark` 覆盖的复位点)复位前写一次,断电预警(法拉电容续航内)再写一次——除突然死机外基本不丢电量
- **上报**MQTT 就绪且芯片在线1s 内有有效帧)时,每分钟随运行心跳上报一次 `{"energy":%.2f}`;未联网/芯片不在线不上报
- **上报策略**:功率 >10W 时每 30s 上报一次 `{"energy":%.2f}`≤10W 时仅首次联网报一次(省流量);继电器开关切换随状态大报文携带 energy。串口电能日志固定 10s 一条。阈值宏 `ENERGY_REPORT_POWER_W`、间隔宏 `ENERGY_REPORT_INTERVAL_MS` 在 app_loop.c
- **调试日志**:芯片在线时每分钟日志同时打印电压/电流/功率(`运行时间: ... 电能: x.xxkWh 电压: xxx.xV 电流: x.xxA 功率: xxxx.xW`
## OLED 屏幕显示128x64 + GB2312 字库 IC