From: snickersun Date: Wed, 20 May 2026 09:43:36 +0000 (+0800) Subject: 电池曲线更新,优化电量获取机制。充电时不上报新电压。 X-Git-Url: http://git.snicker.com.cn/?a=commitdiff_plain;h=7bf8be0ccea5bdb84ed38b4c2e8a646a0b2fe583;p=mirrors%2FASR1603_G5.git 电池曲线更新,优化电量获取机制。充电时不上报新电压。 更新文档及调换存放位置。 --- diff --git "a/1.doc/K8_diaozhui/ZCV\346\224\276\347\224\265\346\225\260\346\215\256502631-510 4.35V.xlsx" "b/1.doc/K8_diaozhui/ZCV\346\224\276\347\224\265\346\225\260\346\215\256502631-510 4.35V.xlsx" new file mode 100644 index 00000000..60671837 Binary files /dev/null and "b/1.doc/K8_diaozhui/ZCV\346\224\276\347\224\265\346\225\260\346\215\256502631-510 4.35V.xlsx" differ diff --git "a/1.doc/AI\345\220\212\345\235\240LED\347\212\266\346\200\201\344\274\230\345\205\210\347\272\247\347\212\266\346\200\201\346\234\272.md" "b/1.doc/K8_diaozhui/design/AI\345\220\212\345\235\240LED\347\212\266\346\200\201\344\274\230\345\205\210\347\272\247\347\212\266\346\200\201\346\234\272.md" similarity index 100% rename from "1.doc/AI\345\220\212\345\235\240LED\347\212\266\346\200\201\344\274\230\345\205\210\347\272\247\347\212\266\346\200\201\346\234\272.md" rename to "1.doc/K8_diaozhui/design/AI\345\220\212\345\235\240LED\347\212\266\346\200\201\344\274\230\345\205\210\347\272\247\347\212\266\346\200\201\346\234\272.md" diff --git "a/1.doc/AI\345\220\212\345\235\240\357\274\210\345\217\214\346\214\211\351\224\256+\344\270\211\350\211\262\346\214\207\347\244\272\347\201\257\357\274\211\344\272\244\344\272\222\350\247\204\350\214\203-\346\226\260\346\227\247\345\217\230\346\233\264\350\257\264\346\230\216.md" "b/1.doc/K8_diaozhui/design/AI\345\220\212\345\235\240\357\274\210\345\217\214\346\214\211\351\224\256+\344\270\211\350\211\262\346\214\207\347\244\272\347\201\257\357\274\211\344\272\244\344\272\222\350\247\204\350\214\203-\346\226\260\346\227\247\345\217\230\346\233\264\350\257\264\346\230\216.md" similarity index 100% rename from "1.doc/AI\345\220\212\345\235\240\357\274\210\345\217\214\346\214\211\351\224\256+\344\270\211\350\211\262\346\214\207\347\244\272\347\201\257\357\274\211\344\272\244\344\272\222\350\247\204\350\214\203-\346\226\260\346\227\247\345\217\230\346\233\264\350\257\264\346\230\216.md" rename to "1.doc/K8_diaozhui/design/AI\345\220\212\345\235\240\357\274\210\345\217\214\346\214\211\351\224\256+\344\270\211\350\211\262\346\214\207\347\244\272\347\201\257\357\274\211\344\272\244\344\272\222\350\247\204\350\214\203-\346\226\260\346\227\247\345\217\230\346\233\264\350\257\264\346\230\216.md" diff --git "a/1.doc/AI\345\220\212\345\235\240\357\274\210\345\217\214\346\214\211\351\224\256+\344\270\211\350\211\262\346\214\207\347\244\272\347\201\257\357\274\211\344\272\244\344\272\222\350\247\204\350\214\203.md" "b/1.doc/K8_diaozhui/design/AI\345\220\212\345\235\240\357\274\210\345\217\214\346\214\211\351\224\256+\344\270\211\350\211\262\346\214\207\347\244\272\347\201\257\357\274\211\344\272\244\344\272\222\350\247\204\350\214\203.md" similarity index 100% rename from "1.doc/AI\345\220\212\345\235\240\357\274\210\345\217\214\346\214\211\351\224\256+\344\270\211\350\211\262\346\214\207\347\244\272\347\201\257\357\274\211\344\272\244\344\272\222\350\247\204\350\214\203.md" rename to "1.doc/K8_diaozhui/design/AI\345\220\212\345\235\240\357\274\210\345\217\214\346\214\211\351\224\256+\344\270\211\350\211\262\346\214\207\347\244\272\347\201\257\357\274\211\344\272\244\344\272\222\350\247\204\350\214\203.md" diff --git "a/1.doc/AI\345\220\212\345\235\240\357\274\210\345\217\214\346\214\211\351\224\256+\344\270\211\350\211\262\346\214\207\347\244\272\347\201\257\357\274\211\344\272\244\344\272\222\350\247\204\350\214\203_new.md" "b/1.doc/K8_diaozhui/design/AI\345\220\212\345\235\240\357\274\210\345\217\214\346\214\211\351\224\256+\344\270\211\350\211\262\346\214\207\347\244\272\347\201\257\357\274\211\344\272\244\344\272\222\350\247\204\350\214\203_new.md" similarity index 100% rename from "1.doc/AI\345\220\212\345\235\240\357\274\210\345\217\214\346\214\211\351\224\256+\344\270\211\350\211\262\346\214\207\347\244\272\347\201\257\357\274\211\344\272\244\344\272\222\350\247\204\350\214\203_new.md" rename to "1.doc/K8_diaozhui/design/AI\345\220\212\345\235\240\357\274\210\345\217\214\346\214\211\351\224\256+\344\270\211\350\211\262\346\214\207\347\244\272\347\201\257\357\274\211\344\272\244\344\272\222\350\247\204\350\214\203_new.md" diff --git "a/1.doc/AI\345\220\212\345\235\240\357\274\210\345\217\214\346\214\211\351\224\256+\344\270\211\350\211\262\346\214\207\347\244\272\347\201\257\357\274\211\344\272\244\344\272\222\350\247\204\350\214\203_\351\231\204\345\275\225-\345\267\245\347\250\213\344\270\216\344\273\243\347\240\201\345\256\241\346\237\245.md" "b/1.doc/K8_diaozhui/design/AI\345\220\212\345\235\240\357\274\210\345\217\214\346\214\211\351\224\256+\344\270\211\350\211\262\346\214\207\347\244\272\347\201\257\357\274\211\344\272\244\344\272\222\350\247\204\350\214\203_\351\231\204\345\275\225-\345\267\245\347\250\213\344\270\216\344\273\243\347\240\201\345\256\241\346\237\245.md" similarity index 100% rename from "1.doc/AI\345\220\212\345\235\240\357\274\210\345\217\214\346\214\211\351\224\256+\344\270\211\350\211\262\346\214\207\347\244\272\347\201\257\357\274\211\344\272\244\344\272\222\350\247\204\350\214\203_\351\231\204\345\275\225-\345\267\245\347\250\213\344\270\216\344\273\243\347\240\201\345\256\241\346\237\245.md" rename to "1.doc/K8_diaozhui/design/AI\345\220\212\345\235\240\357\274\210\345\217\214\346\214\211\351\224\256+\344\270\211\350\211\262\346\214\207\347\244\272\347\201\257\357\274\211\344\272\244\344\272\222\350\247\204\350\214\203_\351\231\204\345\275\225-\345\267\245\347\250\213\344\270\216\344\273\243\347\240\201\345\256\241\346\237\245.md" diff --git "a/1.doc/AI\345\220\212\345\235\240\357\274\210\345\217\214\346\214\211\351\224\256+\344\270\211\350\211\262\346\214\207\347\244\272\347\201\257\357\274\211\350\257\246\350\256\276-\345\234\272\346\231\257\344\270\216\345\215\217\350\256\256\346\265\201\347\250\213.md" "b/1.doc/K8_diaozhui/design/AI\345\220\212\345\235\240\357\274\210\345\217\214\346\214\211\351\224\256+\344\270\211\350\211\262\346\214\207\347\244\272\347\201\257\357\274\211\350\257\246\350\256\276-\345\234\272\346\231\257\344\270\216\345\215\217\350\256\256\346\265\201\347\250\213.md" similarity index 100% rename from "1.doc/AI\345\220\212\345\235\240\357\274\210\345\217\214\346\214\211\351\224\256+\344\270\211\350\211\262\346\214\207\347\244\272\347\201\257\357\274\211\350\257\246\350\256\276-\345\234\272\346\231\257\344\270\216\345\215\217\350\256\256\346\265\201\347\250\213.md" rename to "1.doc/K8_diaozhui/design/AI\345\220\212\345\235\240\357\274\210\345\217\214\346\214\211\351\224\256+\344\270\211\350\211\262\346\214\207\347\244\272\347\201\257\357\274\211\350\257\246\350\256\276-\345\234\272\346\231\257\344\270\216\345\215\217\350\256\256\346\265\201\347\250\213.md" diff --git "a/1.doc/AI\345\220\212\345\235\240\357\274\210\345\217\214\346\214\211\351\224\256+\344\270\211\350\211\262\346\214\207\347\244\272\347\201\257\357\274\211\350\257\246\350\256\276-\345\257\271\347\205\247\344\270\216\345\206\263\347\255\226.md" "b/1.doc/K8_diaozhui/design/AI\345\220\212\345\235\240\357\274\210\345\217\214\346\214\211\351\224\256+\344\270\211\350\211\262\346\214\207\347\244\272\347\201\257\357\274\211\350\257\246\350\256\276-\345\257\271\347\205\247\344\270\216\345\206\263\347\255\226.md" similarity index 100% rename from "1.doc/AI\345\220\212\345\235\240\357\274\210\345\217\214\346\214\211\351\224\256+\344\270\211\350\211\262\346\214\207\347\244\272\347\201\257\357\274\211\350\257\246\350\256\276-\345\257\271\347\205\247\344\270\216\345\206\263\347\255\226.md" rename to "1.doc/K8_diaozhui/design/AI\345\220\212\345\235\240\357\274\210\345\217\214\346\214\211\351\224\256+\344\270\211\350\211\262\346\214\207\347\244\272\347\201\257\357\274\211\350\257\246\350\256\276-\345\257\271\347\205\247\344\270\216\345\206\263\347\255\226.md" diff --git "a/1.doc/RVC Service WebSocket V3 API \345\274\200\345\217\221\346\226\207\346\241\243.md" "b/1.doc/K8_diaozhui/design/RVC Service WebSocket V3 API \345\274\200\345\217\221\346\226\207\346\241\243.md" similarity index 100% rename from "1.doc/RVC Service WebSocket V3 API \345\274\200\345\217\221\346\226\207\346\241\243.md" rename to "1.doc/K8_diaozhui/design/RVC Service WebSocket V3 API \345\274\200\345\217\221\346\226\207\346\241\243.md" diff --git "a/1.doc/RVC Service WebSocket V3 API \345\274\200\345\217\221\346\226\207\346\241\243.pdf" "b/1.doc/K8_diaozhui/design/RVC Service WebSocket V3 API \345\274\200\345\217\221\346\226\207\346\241\243.pdf" similarity index 100% rename from "1.doc/RVC Service WebSocket V3 API \345\274\200\345\217\221\346\226\207\346\241\243.pdf" rename to "1.doc/K8_diaozhui/design/RVC Service WebSocket V3 API \345\274\200\345\217\221\346\226\207\346\241\243.pdf" diff --git "a/1.doc/V2.5_to_V3_\345\215\217\350\256\256\345\217\230\346\233\264\345\257\271\347\205\247.md" "b/1.doc/K8_diaozhui/design/V2.5_to_V3_\345\215\217\350\256\256\345\217\230\346\233\264\345\257\271\347\205\247.md" similarity index 100% rename from "1.doc/V2.5_to_V3_\345\215\217\350\256\256\345\217\230\346\233\264\345\257\271\347\205\247.md" rename to "1.doc/K8_diaozhui/design/V2.5_to_V3_\345\215\217\350\256\256\345\217\230\346\233\264\345\257\271\347\205\247.md" diff --git a/1.doc/VC_SESSION_ARCH.md b/1.doc/K8_diaozhui/design/VC_SESSION_ARCH.md similarity index 100% rename from 1.doc/VC_SESSION_ARCH.md rename to 1.doc/K8_diaozhui/design/VC_SESSION_ARCH.md diff --git "a/1.doc/VC_state\350\277\201\347\247\273FSM\345\255\220\347\212\266\346\200\201-\346\224\271\345\212\250\346\270\205\345\215\225.md" "b/1.doc/K8_diaozhui/design/VC_state\350\277\201\347\247\273FSM\345\255\220\347\212\266\346\200\201-\346\224\271\345\212\250\346\270\205\345\215\225.md" similarity index 100% rename from "1.doc/VC_state\350\277\201\347\247\273FSM\345\255\220\347\212\266\346\200\201-\346\224\271\345\212\250\346\270\205\345\215\225.md" rename to "1.doc/K8_diaozhui/design/VC_state\350\277\201\347\247\273FSM\345\255\220\347\212\266\346\200\201-\346\224\271\345\212\250\346\270\205\345\215\225.md" diff --git "a/1.doc/\351\207\221\344\270\211\346\234\215\345\212\241-\350\257\255\351\237\263\345\257\271\350\257\235V2.5.md" "b/1.doc/K8_diaozhui/design/\351\207\221\344\270\211\346\234\215\345\212\241-\350\257\255\351\237\263\345\257\271\350\257\235V2.5.md" similarity index 100% rename from "1.doc/\351\207\221\344\270\211\346\234\215\345\212\241-\350\257\255\351\237\263\345\257\271\350\257\235V2.5.md" rename to "1.doc/K8_diaozhui/design/\351\207\221\344\270\211\346\234\215\345\212\241-\350\257\255\351\237\263\345\257\271\350\257\235V2.5.md" diff --git "a/1.doc/\351\207\221\344\270\211\346\234\215\345\212\241-\350\257\255\351\237\263\345\257\271\350\257\235V2.5.pdf" "b/1.doc/K8_diaozhui/design/\351\207\221\344\270\211\346\234\215\345\212\241-\350\257\255\351\237\263\345\257\271\350\257\235V2.5.pdf" similarity index 100% rename from "1.doc/\351\207\221\344\270\211\346\234\215\345\212\241-\350\257\255\351\237\263\345\257\271\350\257\235V2.5.pdf" rename to "1.doc/K8_diaozhui/design/\351\207\221\344\270\211\346\234\215\345\212\241-\350\257\255\351\237\263\345\257\271\350\257\235V2.5.pdf" diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/default_config.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/default_config.py index d26ea6f3..aefa493d 100644 --- a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/default_config.py +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/default_config.py @@ -81,25 +81,29 @@ VAD_ACTIVE_BLUE_LED = True # ============================================================================= HW_STATUS_PERIOD_MS = 10000 +# 电池电压:全机约每 10s 采样 1 次 getVbatt,10 点滑动平均(见 vc_hw._BatteryCfg) +VBATT_AVG_LEN = 10 +VBATT_PUSH_MIN_MS = 9000 # 同周期内 AI_hw / protocol 去重,避免重复读电压 SIGNAL_WEAK_CSQ = 10 # 0≤CSQ<此值 → signal=weak(REQ-ERR-02) -# SoC 百分比门限(OCV 模式,对齐 REQ-BAT-02/03) -BATTERY_LOW_SOC_PERCENT = 30 -BATTERY_EMPTY_SOC_PERCENT = 10 +# SoC 门限:仅低电提示/LED 空电闪(REQ-BAT-02/03);关机见 VBATT_EMPTY_MV +BATTERY_LOW_SOC_PERCENT = 25 # <25% 低电语音 +BATTERY_EMPTY_SOC_PERCENT = 5 # <5% LED 空电态;不单独触发关机 BATTERY_LOW_WARN_INTERVAL_MS = 300000 # 低电语音间隔 5min BATTERY_EMPTY_FLASH_COUNT = 3 BATTERY_EMPTY_FLASH_PERIOD_MS = 500 # 空电红快闪约 2 次/秒 # 电压门限(mV):充满 / 低电 / 空电(与 get_battery、simple 模式共用) USE_SIMPLE_VBATT_THRESH = False # True 时忽略 BATTERY_OCV_MAP,仅用三档电压 -VBATT_CHARGE_FULL_MV = 4290 -VBATT_LOW_MV = 3699 -VBATT_EMPTY_MV = 3629 +VBATT_CHARGE_FULL_MV = 4320 # 502631 ZCV 100% OCV≈4.322V;CV 4.35V +VBATT_LOW_MV = 3630 # 约对应 ZCV 20%(4G 带载下不宜再抬高) +VBATT_EMPTY_MV = 3400 # 未充电:滑动平均电压 < 此值 → 低电关机(唯一关机条件) -# 开路电压(mV)→SoC(%) 插值表;None 则用 ai_VC 内置默认表 +# 502631-510 4.35V ZCV 放电 OCV 表(mV→SoC);0% 锚定 3400 而非实验室 3262 BATTERY_OCV_MAP = { - 4290: 100, 4237: 95, 4179: 90, 4123: 85, 4070: 80, 4020: 75, 3963: 70, 3919: 65, 3882: 60, 3847: 55, - 3818: 50, 3794: 45, 3772: 40, 3752: 35, 3733: 30, 3716: 25, 3699: 20, 3677: 15, 3652: 10, 3629: 5, 3400: 0, + 4322: 100, 4239: 95, 4177: 90, 4117: 85, 4059: 80, 4006: 75, 3942: 70, 3898: 65, + 3853: 60, 3814: 55, 3781: 50, 3755: 45, 3738: 40, 3724: 35, 3706: 30, 3678: 25, + 3634: 20, 3577: 15, 3522: 10, 3468: 5, 3400: 0, } # ============================================================================= diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/products/configs/7PIN/default_config.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/products/configs/7PIN/default_config.py index bde4de03..a1f7252e 100644 --- a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/products/configs/7PIN/default_config.py +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/products/configs/7PIN/default_config.py @@ -49,21 +49,24 @@ HW_STATUS_DEBUG = True # -------------------- # True 时用三档电压门限估算 SoC,忽略 BATTERY_OCV_MAP USE_SIMPLE_VBATT_THRESH = False -VBATT_CHARGE_FULL_MV = 4290 # USB 在位且电压≥此值视为充满(get_battery / AI_hw_status / AI_dev 共用) -VBATT_LOW_MV = 3699 # 低电电压门限;simple 模式与 AI_dev 低电提示用 -VBATT_EMPTY_MV = 3629 # 空电电压门限;AI_dev 低电关机等 -BATTERY_LOW_SOC_PERCENT = 30 # OCV 模式:soc < 此值 → battery=low(REQ-BAT-02:10%~30%) -BATTERY_EMPTY_SOC_PERCENT = 10 # OCV 模式:soc < 此值 → battery=empty(REQ-BAT-03:<10%) +VBATT_CHARGE_FULL_MV = 4320 # 502631 满电 OCV≈4.322V +VBATT_LOW_MV = 3630 # 约 ZCV 20% +VBATT_EMPTY_MV = 3400 # 未充电:平均电压 < 3.40V → 低电关机(唯一关机条件) +BATTERY_LOW_SOC_PERCENT = 25 # 未充电:soc<25% 低电语音 +BATTERY_EMPTY_SOC_PERCENT = 5 # 未充电:soc<5% LED 空电闪;不触发关机 BATTERY_LOW_WARN_INTERVAL_MS = 300000 # REQ-BAT-02:低电语音每 5 分钟 BATTERY_EMPTY_FLASH_COUNT = 3 # REQ-BAT-03:红快闪次数 BATTERY_EMPTY_FLASH_PERIOD_MS = 500 # REQ-BAT-03:约 2 次/秒 HW_STATUS_PERIOD_MS = 10000 +VBATT_AVG_LEN = 10 +VBATT_PUSH_MIN_MS = 9000 SIGNAL_WEAK_CSQ = 10 -# 开路电压(mV) -> SoC(%),按电压线性插值;None 则用 ai_VC 内置默认表 +# 502631 ZCV OCV 表;0% 锚定 3400mV(实机 4G 场景) BATTERY_OCV_MAP = { - 4290: 100, 4237: 95, 4179: 90, 4123: 85, 4070: 80, 4020: 75, 3963: 70, 3919: 65, 3882: 60, 3847: 55, - 3818: 50, 3794: 45, 3772: 40, 3752: 35, 3733: 30, 3716: 25, 3699: 20, 3677: 15, 3652: 10, 3629: 5, 3400: 0, + 4322: 100, 4239: 95, 4177: 90, 4117: 85, 4059: 80, 4006: 75, 3942: 70, 3898: 65, + 3853: 60, 3814: 55, 3781: 50, 3755: 45, 3738: 40, 3724: 35, 3706: 30, 3678: 25, + 3634: 20, 3577: 15, 3522: 10, 3468: 5, 3400: 0, } # 是否需要初始化蓝牙电源/马达/音频IIS配置等(原先仅 7PIN_1_5) diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/products/configs/jswm/default_config.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/products/configs/jswm/default_config.py index 4360c218..4f65393e 100644 --- a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/products/configs/jswm/default_config.py +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/products/configs/jswm/default_config.py @@ -84,22 +84,22 @@ HW_STATUS_PERIOD_MS = 10000 SIGNAL_WEAK_CSQ = 10 # 0≤CSQ<此值 → signal=weak(REQ-ERR-02) # SoC 百分比门限(OCV 模式,对齐 REQ-BAT-02/03) -BATTERY_LOW_SOC_PERCENT = 30 -BATTERY_EMPTY_SOC_PERCENT = 10 +BATTERY_LOW_SOC_PERCENT = 25 +BATTERY_EMPTY_SOC_PERCENT = 5 BATTERY_LOW_WARN_INTERVAL_MS = 300000 # 低电语音间隔 5min BATTERY_EMPTY_FLASH_COUNT = 3 BATTERY_EMPTY_FLASH_PERIOD_MS = 500 # 空电红快闪约 2 次/秒 # 电压门限(mV):充满 / 低电 / 空电(与 get_battery、simple 模式共用) USE_SIMPLE_VBATT_THRESH = False # True 时忽略 BATTERY_OCV_MAP,仅用三档电压 -VBATT_CHARGE_FULL_MV = 4290 -VBATT_LOW_MV = 3699 -VBATT_EMPTY_MV = 3629 +VBATT_CHARGE_FULL_MV = 4320 +VBATT_LOW_MV = 3630 +VBATT_EMPTY_MV = 3400 -# 开路电压(mV)→SoC(%) 插值表;None 则用 ai_VC 内置默认表 BATTERY_OCV_MAP = { - 4290: 100, 4237: 95, 4179: 90, 4123: 85, 4070: 80, 4020: 75, 3963: 70, 3919: 65, 3882: 60, 3847: 55, - 3818: 50, 3794: 45, 3772: 40, 3752: 35, 3733: 30, 3716: 25, 3699: 20, 3677: 15, 3652: 10, 3629: 5, 3400: 0, + 4322: 100, 4239: 95, 4177: 90, 4117: 85, 4059: 80, 4006: 75, 3942: 70, 3898: 65, + 3853: 60, 3814: 55, 3781: 50, 3755: 45, 3738: 40, 3724: 35, 3706: 30, 3678: 25, + 3634: 20, 3577: 15, 3522: 10, 3468: 5, 3400: 0, } # ============================================================================= diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/products/configs/k8/default_config.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/products/configs/k8/default_config.py index d26ea6f3..aefa493d 100644 --- a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/products/configs/k8/default_config.py +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/products/configs/k8/default_config.py @@ -81,25 +81,29 @@ VAD_ACTIVE_BLUE_LED = True # ============================================================================= HW_STATUS_PERIOD_MS = 10000 +# 电池电压:全机约每 10s 采样 1 次 getVbatt,10 点滑动平均(见 vc_hw._BatteryCfg) +VBATT_AVG_LEN = 10 +VBATT_PUSH_MIN_MS = 9000 # 同周期内 AI_hw / protocol 去重,避免重复读电压 SIGNAL_WEAK_CSQ = 10 # 0≤CSQ<此值 → signal=weak(REQ-ERR-02) -# SoC 百分比门限(OCV 模式,对齐 REQ-BAT-02/03) -BATTERY_LOW_SOC_PERCENT = 30 -BATTERY_EMPTY_SOC_PERCENT = 10 +# SoC 门限:仅低电提示/LED 空电闪(REQ-BAT-02/03);关机见 VBATT_EMPTY_MV +BATTERY_LOW_SOC_PERCENT = 25 # <25% 低电语音 +BATTERY_EMPTY_SOC_PERCENT = 5 # <5% LED 空电态;不单独触发关机 BATTERY_LOW_WARN_INTERVAL_MS = 300000 # 低电语音间隔 5min BATTERY_EMPTY_FLASH_COUNT = 3 BATTERY_EMPTY_FLASH_PERIOD_MS = 500 # 空电红快闪约 2 次/秒 # 电压门限(mV):充满 / 低电 / 空电(与 get_battery、simple 模式共用) USE_SIMPLE_VBATT_THRESH = False # True 时忽略 BATTERY_OCV_MAP,仅用三档电压 -VBATT_CHARGE_FULL_MV = 4290 -VBATT_LOW_MV = 3699 -VBATT_EMPTY_MV = 3629 +VBATT_CHARGE_FULL_MV = 4320 # 502631 ZCV 100% OCV≈4.322V;CV 4.35V +VBATT_LOW_MV = 3630 # 约对应 ZCV 20%(4G 带载下不宜再抬高) +VBATT_EMPTY_MV = 3400 # 未充电:滑动平均电压 < 此值 → 低电关机(唯一关机条件) -# 开路电压(mV)→SoC(%) 插值表;None 则用 ai_VC 内置默认表 +# 502631-510 4.35V ZCV 放电 OCV 表(mV→SoC);0% 锚定 3400 而非实验室 3262 BATTERY_OCV_MAP = { - 4290: 100, 4237: 95, 4179: 90, 4123: 85, 4070: 80, 4020: 75, 3963: 70, 3919: 65, 3882: 60, 3847: 55, - 3818: 50, 3794: 45, 3772: 40, 3752: 35, 3733: 30, 3716: 25, 3699: 20, 3677: 15, 3652: 10, 3629: 5, 3400: 0, + 4322: 100, 4239: 95, 4177: 90, 4117: 85, 4059: 80, 4006: 75, 3942: 70, 3898: 65, + 3853: 60, 3814: 55, 3781: 50, 3755: 45, 3738: 40, 3724: 35, 3706: 30, 3678: 25, + 3634: 20, 3577: 15, 3522: 10, 3468: 5, 3400: 0, } # ============================================================================= diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/products/configs/k8s/default_config.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/products/configs/k8s/default_config.py index 682df73c..2567a6e2 100644 --- a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/products/configs/k8s/default_config.py +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/products/configs/k8s/default_config.py @@ -84,22 +84,22 @@ HW_STATUS_PERIOD_MS = 10000 SIGNAL_WEAK_CSQ = 10 # 0≤CSQ<此值 → signal=weak(REQ-ERR-02) # SoC 百分比门限(OCV 模式,对齐 REQ-BAT-02/03) -BATTERY_LOW_SOC_PERCENT = 30 -BATTERY_EMPTY_SOC_PERCENT = 10 +BATTERY_LOW_SOC_PERCENT = 25 +BATTERY_EMPTY_SOC_PERCENT = 5 BATTERY_LOW_WARN_INTERVAL_MS = 300000 # 低电语音间隔 5min BATTERY_EMPTY_FLASH_COUNT = 3 BATTERY_EMPTY_FLASH_PERIOD_MS = 500 # 空电红快闪约 2 次/秒 # 电压门限(mV):充满 / 低电 / 空电(与 get_battery、simple 模式共用) USE_SIMPLE_VBATT_THRESH = False # True 时忽略 BATTERY_OCV_MAP,仅用三档电压 -VBATT_CHARGE_FULL_MV = 4290 -VBATT_LOW_MV = 3699 -VBATT_EMPTY_MV = 3629 +VBATT_CHARGE_FULL_MV = 4320 +VBATT_LOW_MV = 3630 +VBATT_EMPTY_MV = 3400 -# 开路电压(mV)→SoC(%) 插值表;None 则用 ai_VC 内置默认表 BATTERY_OCV_MAP = { - 4290: 100, 4237: 95, 4179: 90, 4123: 85, 4070: 80, 4020: 75, 3963: 70, 3919: 65, 3882: 60, 3847: 55, - 3818: 50, 3794: 45, 3772: 40, 3752: 35, 3733: 30, 3716: 25, 3699: 20, 3677: 15, 3652: 10, 3629: 5, 3400: 0, + 4322: 100, 4239: 95, 4177: 90, 4117: 85, 4059: 80, 4006: 75, 3942: 70, 3898: 65, + 3853: 60, 3814: 55, 3781: 50, 3755: 45, 3738: 40, 3724: 35, 3706: 30, 3678: 25, + 3634: 20, 3577: 15, 3522: 10, 3468: 5, 3400: 0, } # ============================================================================= diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/protocol.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/protocol.py index 499b3411..8e8a3e88 100644 --- a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/protocol.py +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/protocol.py @@ -1648,10 +1648,8 @@ class SockMangager(Abstract): else: charge_state = '0' - #temp = Power.getVbatt() - temp = EventMesh.publish("get_curr_battery_level") - vbat = EventMesh.publish("get_battery",temp) - if vbat == None: + vbat = EventMesh.publish("get_battery") + if vbat is None: vbat = 100 # EventMesh.debug_log("vbat",vbat) # if temp != None : @@ -1694,20 +1692,19 @@ class SockMangager(Abstract): self.public_report_event_cb() #上报心跳 上报设备状态 检查闹钟 日程 def public_report_event_cb(self): - """电池平均值""" - temp = Power.getVbatt() - if self.bat_count < 10: - self.vbat_buf.append(temp) - self.bat_count += 1 - else: - for i in range(9): - self.vbat_buf[i] = self.vbat_buf[i+1] - self.vbat_buf[9] = temp - curr_count = len(self.vbat_buf) + """电池平均值:与 vc_hw._BatteryCfg 共用 10 点滑动平均,避免重复 getVbatt。""" bat_total_value = 0 - for i in range(curr_count): - bat_total_value += self.vbat_buf[i] - bat_total_value = bat_total_value//curr_count#一分钟更新一次电量 10个平均值 + try: + from vc_hw import _BatteryCfg + bcfg = _BatteryCfg.instance() + try: + usb_st = EventMesh.publish("GET_USB_STATE") + except Exception: + usb_st = 0 + bcfg.push_vbatt_sample(usb_status=usb_st) + bat_total_value = bcfg.soc_now() + except Exception: + bat_total_value = 0 # EventMesh.publish("AI_schedule_open")#读取闹钟数组 # print("AI_schedule_open!!!") if EventMesh.publish("get_sos_flag") != None: diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/vc_buttons.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/vc_buttons.py index bf7ac804..b9f5c38f 100644 --- a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/vc_buttons.py +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/vc_buttons.py @@ -25,7 +25,7 @@ try: except Exception: vc_config = None from vc_common import dev_type -from vc_hw import set_ipv4_datacall +from vc_hw import set_ipv4_datacall, _BatteryCfg from vc_uart import AI_UART audio_buf = ['chaobingfatis', 'chenggong', 'didianguanji', 'IMEIhao', 'jianquancuowu', 'key_prompt', 'liuliangtishi', 'Low_power_warning', 'R_CHARGE_FULL', 'R_CHARGE_IN', 'R_CHARGE_OUT', 'R_READ_TIME_0', 'R_READ_TIME_1', 'R_READ_TIME_2', 'R_READ_TIME_3', 'R_READ_TIME_4', 'R_READ_TIME_5', 'R_READ_TIME_6', 'R_READ_TIME_7', 'R_READ_TIME_8', 'R_READ_TIME_9', 'R_READ_TIME_A', 'R_READ_TIME_B', 'R_READ_TIME_C', 'R_READ_TIME_D', 'R_READ_TIME_E', 'R_READ_TIME_F', 'R_READ_TIME_G', 'R_READ_TIME_H', 'R_READ_TIME_I', 'R_READ_TIME_J', 'R_READ_TIME_K', 'R_READ_TIME_L', 'R_READ_TIME_M', 'R_READ_TIME_N', 'R_READ_TIME_O', 'R_READ_TIME_P', 'R_READ_TIME_Q', 'R_READ_TIME_R', 'R_READ_TIME_S', 'R_READ_TIME_T', 'R_READ_TIME_U', 'R_READ_TIME_V', 'R_READ_TIME_W', 'R_READ_TIME_X', 'R_READ_TIME_Y', 'R_READ_TIME_Z', 'send_tone', 'shouhou', 'xinhaoruo1', 'zhengzaiguanji'] @@ -279,6 +279,10 @@ class AI_dev(Abstract): EventMesh.publish("hw_usb_state", state) except Exception: pass + try: + _BatteryCfg.instance().on_usb_change(1 if state == 1 else 0) + except Exception: + pass EventMesh.publish("publish_AI_btnInfo",{"func":self.usb_event,"data":state}) def usb_event(self, state): @@ -914,14 +918,14 @@ class AI_dev(Abstract): voice_record_satrt_flag = EventMesh.publish("get_voice_record_flag")#获取静默或者语音留言是否在运行 if voice_record_satrt_flag == None: voice_record_satrt_flag = 0 - Vbatt = Power.getVbatt() + _bcfg = _BatteryCfg.instance() + Vbatt = _bcfg.get_vbatt_mv_charge() if self.usb_status == 1 else _bcfg.get_vbatt_mv() if self.usb_status == 1 and VC_satrt_flag == 0 and voice_record_satrt_flag == 0: try: if not ("vc_config" in globals() and vc_config and vc_config.get_bool("USE_MIN_HW_STATUS", True)): EventMesh.publish("set_led_state", {"charging": "charging"})#充电红灯常亮 except Exception: pass - _bcfg = _BatteryCfg.instance() if self.usb_status == 1 and Vbatt >= _bcfg.charge_full_mv and VC_satrt_flag == 0 and voice_record_satrt_flag == 0: try: if not ("vc_config" in globals() and vc_config and vc_config.get_bool("USE_MIN_HW_STATUS", True)): @@ -934,9 +938,8 @@ class AI_dev(Abstract): self.usb_charge_flag = 1 try: low_soc = int(_bcfg.low_soc) - empty_soc = int(_bcfg.empty_soc) except Exception: - low_soc, empty_soc = 30, 10 + low_soc = 25 warn_interval_ms = 300000 try: if "vc_config" in globals() and vc_config: @@ -948,18 +951,17 @@ class AI_dev(Abstract): soc = self.get_battery() except Exception: soc = None - if self.usb_status == 0 and soc is not None: - empty_by_soc = soc < empty_soc - empty_by_mv = Vbatt is not None and Vbatt < int(_bcfg.empty_mv) - if empty_by_soc or empty_by_mv: + if self.usb_status == 0: + if _bcfg.should_shutdown_empty(Vbatt): if getattr(self, "_empty_shutdown_done", 0) == 0: self._empty_shutdown_done = 1 try: - print("[BAT] empty shutdown soc={} vbatt={}".format(soc, Vbatt)) + print("[BAT] empty shutdown vbatt={} soc={} empty_mv={}".format( + Vbatt, soc, _bcfg.empty_mv)) except Exception: pass EventMesh.publish("publish_AI_btnInfo", {"func": self._battery_empty_shutdown_seq}) - elif soc < low_soc: + elif soc is not None and soc < low_soc: if voice_record_satrt_flag == 0: try: now = utime.ticks_ms() @@ -991,19 +993,11 @@ class AI_dev(Abstract): self.pwk_key_Long_Press() def get_battery(self, event=None, msg=None): - # 返回 int 型 SoC(0~100):便于 TTS/上报/比较,且 OCV 插值本身比裸电压稳;不做小数避免频繁跳变 + # SoC 基于 _BatteryCfg 10 点滑动平均电压,与 protocol 心跳/AI_hw 一致 try: - Vbatt = Power.getVbatt() + return _BatteryCfg.instance().soc_now() except Exception: return 0 - soc = _BatteryCfg.instance().soc_from_vbatt(Vbatt) - if soc is None: - return 0 - if soc < 0: - return 0 - if soc > 100: - return 100 - return int(soc) def _audio_is_battery_priority(self, msg): try: for i in (msg or []): diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/vc_hw.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/vc_hw.py index 0c48038c..a72b0c2e 100644 --- a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/vc_hw.py +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/vc_hw.py @@ -18,10 +18,11 @@ except Exception: from vc_common import dev_type def _default_battery_ocv_map(): - # 与 mgr.py BATTERY_OCV_TABLE nix_coy_mnzo2 默认一致;可被 default_config.BATTERY_OCV_MAP 覆盖 + # 无 BATTERY_OCV_MAP 配置时的兜底(502631 ZCV;0% 锚定 3400mV,适配 4G 带载) return { - 4290: 100, 4237: 95, 4179: 90, 4123: 85, 4070: 80, 4020: 75, 3963: 70, 3919: 65, 3882: 60, 3847: 55, - 3818: 50, 3794: 45, 3772: 40, 3752: 35, 3733: 30, 3716: 25, 3699: 20, 3677: 15, 3652: 10, 3629: 5, 3400: 0, + 4322: 100, 4239: 95, 4177: 90, 4117: 85, 4059: 80, 4006: 75, 3942: 70, 3898: 65, + 3853: 60, 3814: 55, 3781: 50, 3755: 45, 3738: 40, 3724: 35, 3706: 30, 3678: 25, + 3634: 20, 3577: 15, 3522: 10, 3468: 5, 3400: 0, } @@ -88,7 +89,7 @@ def _soc_from_vbatt_mv(volt_mv, ocv_map, ocv_volts, vbatt_simple=None): class _BatteryCfg(object): - """从 vc_config(default_config) 加载电池参数,供 AI_hw_status / get_battery / AI_dev 共用。""" + """从 vc_config(default_config) 加载电池参数;全机唯一 Power.getVbatt 采样点 + 10 点滑动平均。""" _inst = None def __init__(self): @@ -97,16 +98,26 @@ class _BatteryCfg(object): self.charge_full_mv = 4290 self.low_mv = 3699 self.empty_mv = 3629 - self.low_soc = 20 + self.low_soc = 25 self.empty_soc = 5 self.vbatt_simple = None + self._vbat_buf = [] + self._vbat_avg_mv = 0 + self._vbat_chg_last_mv = 0 + self._soc_frozen = None + self._usb_chg = 0 + self._vbat_last_push_ms = 0 + self._vbat_avg_len = 10 + self._vbat_push_min_ms = 9000 try: if "vc_config" in globals() and vc_config: - self.charge_full_mv = int(vc_config.get_int("VBATT_CHARGE_FULL_MV", 4290)) - self.low_mv = int(vc_config.get_int("VBATT_LOW_MV", 3699)) - self.empty_mv = int(vc_config.get_int("VBATT_EMPTY_MV", 3629)) - self.low_soc = int(vc_config.get_int("BATTERY_LOW_SOC_PERCENT", 30)) - self.empty_soc = int(vc_config.get_int("BATTERY_EMPTY_SOC_PERCENT", 10)) + self.charge_full_mv = int(vc_config.get_int("VBATT_CHARGE_FULL_MV", 4320)) + self.low_mv = int(vc_config.get_int("VBATT_LOW_MV", 3630)) + self.empty_mv = int(vc_config.get_int("VBATT_EMPTY_MV", 3400)) + self.low_soc = int(vc_config.get_int("BATTERY_LOW_SOC_PERCENT", 25)) + self.empty_soc = int(vc_config.get_int("BATTERY_EMPTY_SOC_PERCENT", 5)) + self._vbat_avg_len = int(vc_config.get_int("VBATT_AVG_LEN", 10)) or 10 + self._vbat_push_min_ms = int(vc_config.get_int("VBATT_PUSH_MIN_MS", 9000)) or 9000 _ocv_cfg = _parse_battery_ocv_map(vc_config.get_attr("BATTERY_OCV_MAP", None)) if _ocv_cfg: self.ocv_map = _ocv_cfg @@ -122,9 +133,147 @@ class _BatteryCfg(object): cls._inst = cls() return cls._inst + def _push_vbatt_raw(self, raw_mv): + """与 protocol.py 一致:滑动窗口求算术平均(mV)。""" + try: + v = int(raw_mv) + except Exception: + return self._vbat_avg_mv + n = int(self._vbat_avg_len) or 10 + buf = self._vbat_buf + if len(buf) < n: + buf.append(v) + else: + for i in range(n - 1): + buf[i] = buf[i + 1] + buf[n - 1] = v + total = 0 + for x in buf: + total += x + self._vbat_avg_mv = total // len(buf) + return self._vbat_avg_mv + + def _usb_is_charging(self): + try: + if self._usb_chg: + return 1 + st = EventMesh.publish("GET_USB_STATE") + return 1 if st == 1 else 0 + except Exception: + return 0 + + def on_usb_change(self, plugged_in): + """插拔 USB:充电电压偏高,与放电 OCV 不可混用;清空滑动窗并冻结/恢复 SoC。""" + try: + plug = 1 if plugged_in else 0 + self._usb_chg = plug + if plug: + if self._vbat_buf and self._vbat_avg_mv > 0: + s = self.soc_from_vbatt(self._vbat_avg_mv) + self._soc_frozen = max(0, min(100, int(s) if s is not None else 0)) + elif self._soc_frozen is None: + self._soc_frozen = 0 + self._vbat_buf = [] + self._vbat_avg_mv = 0 + self._vbat_last_push_ms = 0 + else: + self._vbat_buf = [] + self._vbat_avg_mv = 0 + self._vbat_chg_last_mv = 0 + self._vbat_last_push_ms = 0 + except Exception: + pass + + def push_vbatt_sample(self, force=0, usb_status=None): + """采样一次 getVbatt:充电只记瞬时电压(判满);放电才进滑动平均(算 SoC/关机)。""" + try: + now = utime.ticks_ms() + chg = self._usb_chg if usb_status is None else (1 if usb_status == 1 else 0) + if not force and self._vbat_last_push_ms: + if utime.ticks_diff(now, self._vbat_last_push_ms) < int(self._vbat_push_min_ms): + if chg: + return self._vbat_chg_last_mv or self._vbat_avg_mv + return self._vbat_avg_mv + self._vbat_last_push_ms = now + raw = Power.getVbatt() + except Exception: + if self._usb_is_charging(): + return self._vbat_chg_last_mv + return self._vbat_avg_mv + try: + chg = self._usb_chg if usb_status is None else (1 if usb_status == 1 else 0) + if chg: + self._vbat_chg_last_mv = int(raw) + return self._vbat_chg_last_mv + except Exception: + pass + return self._push_vbatt_raw(raw) + + def get_vbatt_mv(self): + """放电路径滑动平均电压(mV);充电时不混用充电偏高电压。""" + if self._usb_is_charging(): + return self._vbat_avg_mv if self._vbat_avg_mv > 0 else 0 + if self._vbat_buf and self._vbat_avg_mv > 0: + return self._vbat_avg_mv + return self.push_vbatt_sample(force=1, usb_status=0) + + def get_vbatt_mv_charge(self): + """充电时最近一次采样(判充满);未采样则触发一次。""" + if self._vbat_chg_last_mv > 0: + return self._vbat_chg_last_mv + return self.push_vbatt_sample(force=1, usb_status=1) + def soc_from_vbatt(self, volt_mv): return _soc_from_vbatt_mv(volt_mv, self.ocv_map, self.ocv_volts, self.vbatt_simple) + def soc_now(self): + """放电:OCV 表 + 滑动平均;充电:冻结插 USB 前的 SoC,避免充电电压算成 100%。""" + if self._usb_is_charging(): + if self._soc_frozen is not None: + return int(self._soc_frozen) + return 100 + v = self.get_vbatt_mv() + s = self.soc_from_vbatt(v) + if s is None: + return 0 + if s < 0: + return 0 + if s > 100: + return 100 + return int(s) + + def should_shutdown_empty(self, vbatt_mv=None): + """产品定义:仅未充电且平均电压 < VBATT_EMPTY_MV 时低电关机。""" + if self._usb_is_charging(): + return False + try: + v = int(vbatt_mv if vbatt_mv is not None else self.get_vbatt_mv()) + except Exception: + return False + return v > 0 and v < int(self.empty_mv) + + def led_battery_level(self, soc=None, vbatt_mv=None): + """未充电时 LED 用电位/SoC;充电时由 charging 灯态接管,返回 normal。""" + if self._usb_is_charging(): + return "normal" + try: + s = int(soc if soc is not None else self.soc_now()) + except Exception: + s = -1 + try: + v = int(vbatt_mv if vbatt_mv is not None else self.get_vbatt_mv()) + except Exception: + v = 0 + if v > 0 and v < int(self.empty_mv): + return "empty" + if s >= 0 and s < int(self.empty_soc): + return "empty" + if s >= 0 and s < int(self.low_soc): + return "low" + if v > 0 and v < int(self.low_mv): + return "low" + return "normal" + class AI_hw_status(Abstract): # 精简硬件状态采集:仅维护 LED 状态机所需的 charging/battery/signal @@ -209,6 +358,10 @@ class AI_hw_status(Abstract): if self._usb == 0: self._charge_full_latched = 0 self._charge_full_streak = 0 + try: + self._bcfg.on_usb_change(self._usb) + except Exception: + pass except Exception: pass try: @@ -234,9 +387,15 @@ class AI_hw_status(Abstract): def _update(self): # 每次刷新都“同步推送一次”当前硬件基础态到 LED(不依赖变化检测) # 目的:保证 10 秒轮询和 USB callback 都能及时刷新充电/电量/信号的基础态显示 - # charging/battery + # charging/battery(本周期唯一 getVbatt;充电/放电分流) try: - v = Power.getVbatt() + usb_status = self._usb + if usb_status is None: + try: + usb_status = EventMesh.publish("GET_USB_STATE") + except Exception: + usb_status = 0 + v = self._bcfg.push_vbatt_sample(usb_status=usb_status) except Exception: v = None soc = None @@ -255,12 +414,17 @@ class AI_hw_status(Abstract): usb_status = 0 except Exception: usb_status = 0 - # charging:插入后先红灯;勿用瞬时 vbatt≥满电阈值直接判满(充电器接入电压即偏高) + # charging:用充电通道电压判满(勿用放电 OCV 平均) if usb_status == 1: + v_chg = v + try: + v_chg = self._bcfg.get_vbatt_mv_charge() + except Exception: + pass if getattr(self, "_charge_full_latched", 0) == 1: chg = "full" else: - if v is not None and v >= int(self._charge_full_mv): + if v_chg is not None and v_chg >= int(self._charge_full_mv): self._charge_full_streak = int(getattr(self, "_charge_full_streak", 0)) + 1 need = int(getattr(self, "_charge_full_streak_need", 2) or 2) if self._charge_full_streak >= need: @@ -271,14 +435,12 @@ class AI_hw_status(Abstract): else: self._charge_full_streak = 0 chg = "charging" - # battery level for LED table - if usb_status != 1 and v is not None: - soc = self._bcfg.soc_from_vbatt(v) - if soc is not None: - if soc < int(self._empty_soc): - bat = "empty" - elif soc < int(self._low_soc): - bat = "low" + soc = None + try: + soc = self._bcfg.soc_now() + except Exception: + pass + bat = self._bcfg.led_battery_level(soc=soc, vbatt_mv=v if usb_status != 1 else None) self._chg = chg self._bat = bat except Exception: diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/vc_session_io.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/vc_session_io.py index 185997d7..b0266837 100644 --- a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/vc_session_io.py +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/vc_session_io.py @@ -1254,7 +1254,11 @@ class VCSessionIoMixin: self.AI_TTS_str = "电量剩余百分之{}".format(battery) return 0 if it == "query_voltage": - Vbatt = Power.getVbatt() + try: + from vc_hw import _BatteryCfg + Vbatt = _BatteryCfg.instance().get_vbatt_mv() + except Exception: + Vbatt = Power.getVbatt() self.AI_TTS_str = "当前电池电压{}".format(Vbatt) return 0 if it == "query_iccid":