diff --git a/V1.5/STM32F103_App1/HardWare/HLW8032/hlw8032.c b/V1.5/STM32F103_App1/HardWare/HLW8032/hlw8032.c index 82c4e95..b5c9965 100644 --- a/V1.5/STM32F103_App1/HardWare/HLW8032/hlw8032.c +++ b/V1.5/STM32F103_App1/HardWare/HLW8032/hlw8032.c @@ -39,6 +39,9 @@ static uint8_t s_idx = 0; /* 帧同 static uint64_t s_total_pulses = 0; /* 累计脉冲(含 EEPROM 恢复的历史值) */ static uint64_t s_saved_pulses = 0; /* 上次已写入 EEPROM 的值 */ static uint32_t s_power_par = 0; /* 功率参数寄存器(芯片常数,收到帧后才有) */ +static uint32_t s_u_par = 0, s_u_reg = 0; /* 电压参数/电压寄存器(显示电压用) */ +static uint32_t s_i_par = 0, s_i_reg = 0; /* 电流参数/电流寄存器 */ +static uint32_t s_p_reg = 0; /* 功率寄存器 */ static uint32_t s_k = 0; /* 本次上电以来 bit7 翻转(PF 溢出)次数 */ static uint8_t s_last_bit7 = 0; @@ -57,6 +60,13 @@ static void hlw8032_parse(const uint8_t *f) if (power_par == 0) return; /* 参数寄存器异常,帧不可用 */ s_power_par = power_par; + /* 电压/电流/功率原始寄存器(调试用,每分钟日志显示) */ + s_u_par = ((uint32_t)f[2] << 16) | ((uint32_t)f[3] << 8) | f[4]; + s_u_reg = ((uint32_t)f[5] << 16) | ((uint32_t)f[6] << 8) | f[7]; + s_i_par = ((uint32_t)f[8] << 16) | ((uint32_t)f[9] << 8) | f[10]; + s_i_reg = ((uint32_t)f[11] << 16) | ((uint32_t)f[12] << 8) | f[13]; + s_p_reg = ((uint32_t)f[17] << 16) | ((uint32_t)f[18] << 8) | f[19]; + uint8_t bit7 = f[20] & 0x80; uint16_t pf = ((uint16_t)f[21] << 8) | f[22]; @@ -141,6 +151,25 @@ float hlw8032_get_energy_kwh(void) (double)HLW_U_COEF * (double)HLW_I_COEF / 3.6e12); } +/*==== 电压/电流/功率(手册:有效值 = 参数寄存器/寄存器 × 系数)====*/ +float hlw8032_get_voltage_v(void) +{ + if (!s_u_reg) return 0.0f; + return (float)((double)s_u_par / (double)s_u_reg * HLW_U_COEF); +} + +float hlw8032_get_current_a(void) +{ + if (!s_i_reg) return 0.0f; + return (float)((double)s_i_par / (double)s_i_reg * HLW_I_COEF); +} + +float hlw8032_get_power_w(void) +{ + if (!s_p_reg) return 0.0f; + return (float)((double)s_power_par / (double)s_p_reg * HLW_U_COEF * HLW_I_COEF); +} + /*==== 在线判断:1s 内收到过有效帧 ====*/ uint8_t hlw8032_online(void) { diff --git a/V1.5/STM32F103_App1/HardWare/HLW8032/hlw8032.h b/V1.5/STM32F103_App1/HardWare/HLW8032/hlw8032.h index ed52dd8..65c504c 100644 --- a/V1.5/STM32F103_App1/HardWare/HLW8032/hlw8032.h +++ b/V1.5/STM32F103_App1/HardWare/HLW8032/hlw8032.h @@ -14,6 +14,9 @@ void hlw8032_rx_byte(uint8_t b); /* UART5 void hlw8032_tick(void); /* 1s 周期:到阈值就把累计脉冲写 EEPROM */ void hlw8032_save(void); /* 立即写 EEPROM(断电预警/计划复位前调用) */ float hlw8032_get_energy_kwh(void); /* 累计电量 kWh(未收到帧前为 0) */ +float hlw8032_get_voltage_v(void); /* 电压有效值 V(调试显示用) */ +float hlw8032_get_current_a(void); /* 电流有效值 A */ +float hlw8032_get_power_w(void); /* 有功功率 W */ uint8_t hlw8032_online(void); /* 最近 1s 内收到过有效帧 */ #endif /* __HLW8032_H */ diff --git a/V1.5/STM32F103_App1/HardWare/LOG/log_cn.c b/V1.5/STM32F103_App1/HardWare/LOG/log_cn.c index 99d8354..4001fac 100644 --- a/V1.5/STM32F103_App1/HardWare/LOG/log_cn.c +++ b/V1.5/STM32F103_App1/HardWare/LOG/log_cn.c @@ -3,4 +3,4 @@ /* 本文件为 UTF-8 编码:ARMCC 原样输出字符串字面量的字节, * 串口收到即为 UTF-8(串口工具编码选 UTF-8 即可正确显示中文) */ const char FMT_UPTIME[] = "> 运行时间: %u天--%02u小时--%02u分钟"; -const char FMT_UPTIME_EN[] = "> 运行时间: %u天--%02u小时--%02u分钟 电能: %.2fkWh"; +const char FMT_UPTIME_EN[] = "> 运行时间: %u天--%02u小时--%02u分钟 电能: %.2fkWh 电压: %.1fV 电流: %.2fA 功率: %.1fW"; diff --git a/V1.5/STM32F103_App1/HardWare/SYSINIT/app_loop.c b/V1.5/STM32F103_App1/HardWare/SYSINIT/app_loop.c index 4417f9d..e84a0bc 100644 --- a/V1.5/STM32F103_App1/HardWare/SYSINIT/app_loop.c +++ b/V1.5/STM32F103_App1/HardWare/SYSINIT/app_loop.c @@ -236,7 +236,10 @@ static void sys_task(void *arg) log_info(FMT_UPTIME_EN, (unsigned)(mins / 1440), (unsigned)((mins % 1440) / 60), - (unsigned)(mins % 60), (double)kwh); + (unsigned)(mins % 60), (double)kwh, + (double)hlw8032_get_voltage_v(), + (double)hlw8032_get_current_a(), + (double)hlw8032_get_power_w()); } else { log_info(FMT_UPTIME, (unsigned)(mins / 1440), diff --git a/V1.5/STM32F103_App1/Inc/main.h b/V1.5/STM32F103_App1/Inc/main.h index ee29904..c2681fa 100644 --- a/V1.5/STM32F103_App1/Inc/main.h +++ b/V1.5/STM32F103_App1/Inc/main.h @@ -62,12 +62,12 @@ extern UART_HandleTypeDef huart3; #define BLE_NAME "Bt1" /*===== HLW8032 电量计量系数(UART5 PD2 接收,只上报累计电量) ===== - * 电压通道: ZMPT107-1(2mA:2mA),初级 220V 串 100K,次级并 50R - * -> 电压系数 = (100K/50)/1000 = 2.0 + * 电压通道: ZMPT107-1(2mA:2mA),初级 220V 串 100K,次级并 49.9R + * -> 电压系数 = (100K/49.9)/1000 = 2.004 * 电流通道: CT 100A/100mA(1000:1),输出并 2R -> 等效采样电阻 0.002R * -> 电流系数 = 1/(0.002*1000) = 0.5 * 改电阻/互感器只需改这两个宏(公式见 HLW8032 手册电量计算一节) */ -#define HLW_U_COEF 2.0f +#define HLW_U_COEF 2.004f #define HLW_I_COEF 0.5f /*===== 蓝牙 GATT UUID 配置(透传服务)===== diff --git a/V1.5/STM32F103_App1/README.md b/V1.5/STM32F103_App1/README.md index d7ecf9f..813af89 100644 --- a/V1.5/STM32F103_App1/README.md +++ b/V1.5/STM32F103_App1/README.md @@ -109,12 +109,13 @@ 鍙閲**绱娑堣楃數閲**锛屼笂鎶ュ钩鍙版爣璇嗙 `energy`锛堝崟浣 kWh锛屼袱浣嶅皬鏁帮級銆 -- **纭欢**锛欻LW8032锛5V 渚涚數锛夌粡 B0505S 闅旂鐢垫簮 + 鍏夎﹂殧绂伙紝鑺墖 TXD 鎺 PD2锛圲ART5_RX锛夛紱鐢靛帇閲囨牱 ZMPT107-1锛2mA:2mA锛屽垵绾 220V 涓 100K锛屾绾у苟 50惟锛夛紝鐢垫祦閲囨牱 CT 100A/100mA锛1000:1锛岃緭鍑哄苟 2惟锛夛紝涓変釜妯℃嫙鑴氬悇瀵瑰湴 33nF +- **纭欢**锛欻LW8032锛5V 渚涚數锛夌粡 B0505S 闅旂鐢垫簮 + 鍏夎﹂殧绂伙紝鑺墖 TXD 鎺 PD2锛圲ART5_RX锛夛紱鐢靛帇閲囨牱 ZMPT107-1锛2mA:2mA锛屽垵绾 220V 涓 100K锛屾绾у苟 49.9惟锛夛紝鐢垫祦閲囨牱 CT 100A/100mA锛1000:1锛岃緭鍑哄苟 2惟锛夛紝涓変釜妯℃嫙鑴氬悇瀵瑰湴 33nF - **閫氫俊**锛4800bps 8E1锛團1 涓婃寜 9 浣嶅抚闀 + 鍋舵牎楠岄厤缃級锛岃姱鐗囨瘡 50ms 涓诲姩涓婃姤 24 瀛楄妭甯э紝鍙敹涓嶅彂锛涘抚鍚屾 = 棣栧瓧鑺 0x55/0xAA/0xFx + 绗簩瀛楄妭 0x5A + 鏍¢獙鍜岋紙[2]~[22] 鐩稿姞浣 8 浣嶏級 - **鐢甸噺绠楁硶**锛堟墜鍐屽叕寮忥級锛歚kWh = 鎬昏剦鍐 脳 鍔熺巼鍙傛暟瀵勫瓨鍣 脳 鐢靛帇绯绘暟 脳 鐢垫祦绯绘暟 / (10^9脳3600)`锛汸F 瀵勫瓨鍣 16 浣嶆孩鍑虹敱鏁版嵁鏇存柊瀵勫瓨鍣 bit7 缈昏浆璁℃暟锛坄鎬昏剦鍐 = k脳65536 + PF`锛夛紝50ms 涓甯т笉鍙兘婕忕炕杞紱鑺墖鏂數閲嶅惎锛堣鏁板煎掗锛夎嚜鍔ㄩ噸鏂板熀鍑 -- **绯绘暟瀹**锛歚main.h` 鐨 `HLW_U_COEF`锛=100K/50/1000=2.0锛夈乣HLW_I_COEF`锛=1/(0.002脳1000)=0.5锛夆斺旀敼鐢甸樆/浜掓劅鍣ㄥ彧鍔ㄨ繖涓や釜瀹 +- **绯绘暟瀹**锛歚main.h` 鐨 `HLW_U_COEF`锛=100K/49.9/1000=2.004锛夈乣HLW_I_COEF`锛=1/(0.002脳1000)=0.5锛夆斺旀敼鐢甸樆/浜掓劅鍣ㄥ彧鍔ㄨ繖涓や釜瀹 - **鎸佷箙鍖**锛氱疮璁¤剦鍐叉暟锛坲int64锛夊瓨 EEPROM 鍋忕Щ 164~171锛涙瘡鏀掔害 0.1kWh 鍐欎竴娆★紙闄愬埗鎿﹀啓锛夛紝鏂數棰勮锛堟硶鎷夌數瀹圭画鑸唴锛夌珛鍗冲啓涓娆★紝鎺夌數鎹熷け <0.1kWh - **涓婃姤**锛歁QTT 灏辩华涓旇姱鐗囧湪绾匡紙1s 鍐呮湁鏈夋晥甯э級鏃讹紝姣忓垎閽熼殢杩愯蹇冭烦涓婃姤涓娆 `{"energy":%.2f}`锛涙湭鑱旂綉/鑺墖涓嶅湪绾夸笉涓婃姤 +- **璋冭瘯鏃ュ織**锛氳姱鐗囧湪绾挎椂姣忓垎閽熸棩蹇楀悓鏃舵墦鍗扮數鍘/鐢垫祦/鍔熺巼锛坄杩愯鏃堕棿: ... 鐢佃兘: x.xxkWh 鐢靛帇: xxx.xV 鐢垫祦: x.xxA 鍔熺巼: xxxx.xW`锛 ## 鍙岄氶亾缃戠粶锛4G 浼樺厛锛學iFi 鍏滃簳锛 diff --git a/V1.5/鐗堟湰璇存槑.md b/V1.5/鐗堟湰璇存槑.md index c49edbd..9ac26fd 100644 --- a/V1.5/鐗堟湰璇存槑.md +++ b/V1.5/鐗堟湰璇存槑.md @@ -100,7 +100,8 @@ 甯у悓姝(0x55/0xAA/0xFx + 0x5A)+鏍¢獙鍜岄獙璇侊紱鍙彇 PF 鑴夊啿绱鎹㈢畻绱鐢甸噺 - 鐢甸噺鎸夋墜鍐屽叕寮忔崲绠楋細kWh = 鎬昏剦鍐裁楀姛鐜囧弬鏁懊楃數鍘嬬郴鏁懊楃數娴佺郴鏁/(10^9脳3600)锛 PF 16 浣嶆孩鍑洪潬鏁版嵁鏇存柊瀵勫瓨鍣 bit7 缈昏浆璁℃暟锛50ms 涓甯т笉浼氭紡锛夛紱鑺墖鏂數閲嶅惎鑷姩閲嶆柊鍩哄噯 -- 绯绘暟瀹 `HLW_U_COEF`(2.0)/`HLW_I_COEF`(0.5) 鍦 main.h锛屽搴 ZMPT107-1(100K/50R)+CT 1000:1(2R) +- 绯绘暟瀹 `HLW_U_COEF`(2.004)/`HLW_I_COEF`(0.5) 鍦 main.h锛屽搴 ZMPT107-1(100K/49.9R)+CT 1000:1(2R) +- 鑺墖鍦ㄧ嚎鏃舵瘡鍒嗛挓鏃ュ織鎵撳嵃鐢靛帇/鐢垫祦/鍔熺巼/鐢佃兘锛堣皟璇曟牎鍑嗙敤锛 - 绱鑴夊啿(uint64)鎸佷箙鍖 EEPROM 鍋忕Щ 164锛氭瘡鏀掔害 0.1kWh 鍐欎竴娆 + 鏂數棰勮鏃剁珛鍗冲啓锛堟硶鎷夌數瀹圭画鑸唴锛 - 骞冲彴涓婃姤鏍囪瘑绗 `energy`锛坘Wh 涓や綅灏忔暟锛夛紝MQTT 灏辩华涓旇姱鐗囧湪绾挎椂姣忓垎閽熶竴娆★紝4G/WiFi 鍙岄氶亾 - UART5 甯 ORE 鑷剤锛涚‖浠讹細B0505S 闅旂鐢垫簮 + 鍏夎︼紝鑺墖 TXD 鎺 PD2