diff --git a/V1.5/STM32F103_App1/HardWare/ADC/adc.c b/V1.5/STM32F103_App1/HardWare/ADC/adc.c index 7c9c772..56df094 100644 --- a/V1.5/STM32F103_App1/HardWare/ADC/adc.c +++ b/V1.5/STM32F103_App1/HardWare/ADC/adc.c @@ -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; diff --git a/V1.5/STM32F103_App1/HardWare/NETWORK/network.c b/V1.5/STM32F103_App1/HardWare/NETWORK/network.c index c363697..55bc89e 100644 --- a/V1.5/STM32F103_App1/HardWare/NETWORK/network.c +++ b/V1.5/STM32F103_App1/HardWare/NETWORK/network.c @@ -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: 上次联网方式为 WiFi,WiFi 优先"); + 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; diff --git a/V1.5/STM32F103_App1/HardWare/SYSINIT/system.c b/V1.5/STM32F103_App1/HardWare/SYSINIT/system.c index f3bf24d..8a66349 100644 --- a/V1.5/STM32F103_App1/HardWare/SYSINIT/system.c +++ b/V1.5/STM32F103_App1/HardWare/SYSINIT/system.c @@ -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); diff --git a/V1.5/STM32F103_App1/Inc/main.h b/V1.5/STM32F103_App1/Inc/main.h index ada39da..99590fa 100644 --- a/V1.5/STM32F103_App1/Inc/main.h +++ b/V1.5/STM32F103_App1/Inc/main.h @@ -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 diff --git a/V1.5/STM32F103_App1/README.md b/V1.5/STM32F103_App1/README.md index 087918c..7b91176 100644 --- a/V1.5/STM32F103_App1/README.md +++ b/V1.5/STM32F103_App1/README.md @@ -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 妯″紡锛坆le_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 妫娴嬶級 -- APP锛歅A0 鐢甸噺妫娴嬭繛缁 3 娆 <10%锛=澶栭儴 12V 鏂紑锛夆啋 涓婃姤 `pow:0` 鈫 绔嬪嵆鎶"澶栭儴鏂數"璁板綍锛堝惈绮剧‘杩愯鏃堕暱锛夊啓鍏 W25Q64 鈫 澶嶄綅銆傜數閲忕櫨鍒嗘瘮鍋氫簡 0~100% 闄愬箙锛堢數瀹规斁鐢垫椂 3.3V 鍩哄噯涓嬭穼浼氬け鐪燂級 +- APP锛歅A0 鐢甸噺妫娴 <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 鍗虫仮澶 diff --git a/V1.5/鐗堟湰璇存槑.md b/V1.5/鐗堟湰璇存槑.md index 1d8a42b..60955c5 100644 --- a/V1.5/鐗堟湰璇存槑.md +++ b/V1.5/鐗堟湰璇存槑.md @@ -135,3 +135,5 @@ - OLED 娆㈣繋椤垫寜浜у搧妯″紡鏄剧ず鏍囬锛涜繍琛屾椂闂存敼 澶:鏃:鍒 鏍煎紡 - 鏂板 SIM 鍗″彿涓婃姤锛4G 鍒濆鍖 SIM 灏辩华鍚 AT+ICCID 璇诲崱鍙凤紝MQTT OK 鍚庨殢 pow 涓婃姤骞冲彴 锛堟爣璇嗙 iccid锛屽瓧绗︿覆锛涘钩鍙扮墿妯″瀷鍔犲瓧绗︿覆瀛楁鍗冲彲锛屼究浜庣墿鑱旂綉鍗″椁愬埌鏈熸煡璇㈢即璐癸級 +- 4G 杩愯鏃跺叧闂 WiFi 妯″潡锛欵SP_EN(PA6) 榛樿浣庣數骞筹紝鍒 WiFi 鎵嶆媺楂樸佸垏鍥 4G 鎷変綆鏂數锛堢渷鐢/寤堕暱娉曟媺鐢靛缁埅锛 +- 鏂數娑堟伅鎻愰燂細鐢甸噺 <10% 鍒ゅ畾浠 3s 鍘绘姈鏀逛负 100ms 蹇熷鏍革紝纭鍚庝紭鍏堝彂 pow:0銆佸啀鍐欒褰曘佺暀 500ms 璁╂ā缁勫彂瀹屽啀澶嶄綅锛5.5F 鐢靛涓嬪師閫昏緫鏉ヤ笉鍙婁笂鎶ワ級