笔记本电池修复校正

news/2024/10/30 23:22:55/

前言

拿着笔记本去教室上课的时候突然发现电池很快就没电了。
原来电池坚持 4 个小时都没啥问题,现在刚过 5 年为什么不到 1 小时 30 分就没电了?

查一下电池损耗,难道我的电池 G 了?

查看电池报告(需要管理员权限):

powercfg /batteryreport

在这里插入图片描述
(当时忘了截图,反正就剩26000+了)
经过一顿研 (zhe) 究 (teng),终于把电池容量搞上去了。
在这里插入图片描述

观前提醒:本文方法仅适用于 系统显示容量 小于 电池实际可用容量 导致的可用时间缩短,本质是对系统放电曲线的校正过程。
对于电池已经产生物理损坏(给他一锤子)的情况不适用。

网上的几大方法

1、冰箱冷冻法
简单来说就是把电池包起来扔冰箱里冻上 3 天 3 夜。
(学校并没有冰箱,感觉应该是对付那种长时间电池真的要 G 了的才有用)

2、BatteryMon 软件校正法
我还真的下载测试了,不过似乎只有监控作用 (Mon = Monitor)
官网介绍如下,基本上就是说它主要是用来 诊断,比较,记录 之类的,并没有修复校正功能。
在这里插入图片描述
3、放电校正法:电脑自放电直到自动关机。
没有办法的办法,明知道这种断电对硬件不好也不得不试一试。
试了一下之后发现系统显示的容量竟然真的更新了,但是估计用这方法我电池还没修好电脑先 G 了。

思路 & 解决方案

为了防止放电到 0%之前自动关机,需要在高级电源选项的关键级别电池操作和低电量操作中选择 “不采取任何操作”。
在这里插入图片描述

然后考虑能否通过 计量电池放电量 判断电池是否快要放空了,这样就可以在电脑自动关机前手动关机。
通过观察 Battery Monitor 可以看到一个有意思的参数 Discharge Rate
在这里插入图片描述

利用简单的公式 W = P t W = Pt W=Pt 和积分思想,只需要每 Δ t \Delta t Δt 秒进行一次采样,就可以得到 :
t 0 t_0 t0 秒时已消耗的电能为: ∫ 0 t 0 P ( t ) d t \int_0^{t_0} P(t) dt 0t0P(t)dt

然后就是想办法获取 Discharge Rate
起初找了一堆 API GetSystemPowerStatus BatteryChargeStatus 发现并没有需要的参数。
后来发现可以用 wmi 查询到有用的信息 DischargeRate RemainingCapacity ,甚至还能顺便把电压拿上。
在这里插入图片描述
实际进行测试时发现 wmi 获取到的数据每秒只会更新一次,所以减小 Δ t \Delta t Δt 的值并不会提高精度,只能近似计算。
然后写个程序用来记录近似数据, ∑ i = 1 n P Δ t i \sum_{i=1}^n P\Delta t_i i=1nPΔti

使用前需要安装 wmi 的库:

pip install wmi

代码说明

  • 以下代码适用单电池情况,多个电池需要进行相应修改(一般不会有电脑能插 2 个电池吧)
  • 不要放电到电脑自动关机,应在自动关机前手动关机或插上电源。
  • 可以根据需要修改代码实现到达放电到指定容量自动关机等功能。
  • 使用时在电脑接入电源时打开脚本,然后拔掉电源,自动开始计量。
  • 等到你认为应该没电了的时候关机或插上电源。

注意事项

  • 当电量为 0% 时,插电源 / 睡眠 / 关机 时电池容量会立即更新且后续放电不再更新。
  • 电池放电全过程 不要运行耗电量大的程序,例如 DX,Opengl 渲染的安卓模拟器等。(看视频,看课件,听音乐,idea 打代码不影响)。
from time import sleep
import wmi
import sysc = wmi.WMI()
t = wmi.WMI(moniker = "//./root/wmi")total=0
samples=0
isBegin=Falsedef getBatInfo():full=0percent=0batts = t.ExecQuery('Select * from BatteryFullChargedCapacity')for i, b in enumerate(batts):full = b.FullChargedCapacitybatts = c.ExecQuery('Select * from Win32_Battery')for i, b in enumerate(batts):percent = b.EstimatedChargeRemainingbatts = t.ExecQuery('Select * from BatteryStatus where Voltage > 0')for i, b in enumerate(batts):return (b.DischargeRate,b.Voltage,b.RemainingCapacity,full,percent)beginCapability=0
oriFullCapability=0
while True:sleep(1)res=getBatInfo()if isBegin:if res[0]<0:breaksamples=samples+1total=total+res[0]/3600sys.stdout.write("\r Sample: #%d  (%d%%)  \033[36mEC:\033[0m %.2f mWh  \033[32mDR:\033[0m %d mW  \033[33mV:\033[0m %.3f v  \033[34mSC:\033[0m %d/%d mWh \033[35mCC:\033[0m %.2f/%d mWh     " % (samples,res[4],total,res[0],res[1]/1000,res[2],res[3],beginCapability-total,res[3]))sys.stdout.flush()elif res[0]>0:isBegin=TruebeginCapability=res[2]oriFullCapability=res[3]
print()
print("A/C Adapter detected, Wait 5s for capacity update...")
sleep(5)
res=getBatInfo()
print("Full Charge Capacity: %d -> %d mWh" % (oriFullCapability,res[3]))

运行界面:
EC:Energy Consumed
DR:Discharge Rate
V:Voltage
SC:System Capacity
CC:Calculated Capacity
在这里插入图片描述

Q&As

1、为什么放电期间不能运行大型程序?
大型程序瞬时功率较大,可能导致电池瞬时功率不足产生意外的提前关机现象,反而会使系统估算的容量更小。

2、我不知道电池实际容量是多少,也不知道什么时候应该结束放电。
首次可以让电脑自动关机观察最大容量,每次放电不要超过最大容量。
如果不希望电脑自动关机可以每次比系统识别的最大容量多放一点,直到你认为该容量够用或者差不多接近电池的当前容量。

3、为什么不把实时容量写入文件,这样可以在自动关机时获得相对精确的实际容量?
断电时执行 I/O 操作可能会对机械硬盘的可靠性造成严重影响,程序尽量避免在意外断电时执行 I/O 操作。

4、我在 关键级别电池操作-使用电池 中找不到 “不采取任何操作” 选项。如下图所示:
在这里插入图片描述
可以通过 powercfg 命令行进行设置:

Step 1.显示电源方案的内容:

powercfg /Q

依次复制下列 GUID:
(1)电源方案 GUID
在这里插入图片描述
(2)电源子组 GUID
(3)电源设置 (关键级别电池操作) GUID:
在这里插入图片描述
将他们连在一起,执行 /Q 查询时应得到以下结果:

powercfg /Q 381b4222-f694-41f0-9685-ff5bb260df2e e73a048d-bf27-4f12-9731-8b2076e8891f 637ea02f-bbcb-4015-8e2c-a1c7b9c0b546

在这里插入图片描述
然后通过 setdcvalueindex 将其设为 000 即可完成电源设置。

powercfg /setdcvalueindex 381b4222-f694-41f0-9685-ff5bb260df2e e73a048d-bf27-4f12-9731-8b2076e8891f 637ea02f-bbcb-4015-8e2c-a1c7b9c0b546 000

在这里插入图片描述
命令行参考:https://docs.microsoft.com/zh-cn/windows-hardware/design/device-experiences/powercfg-command-line-options#option_setdcvalueindex

End

最后附上电池探 (zhe) 索 (teng) 记录在这里插入图片描述
Update 20220322:补一张效果图 + bug fix
(Capacity 打成 Capability 了,程序已修正,应该没人看到吧 )

在这里插入图片描述
Update 20220408:
Discharge Rate 单位应为 mW,程序已更正。


http://www.ppmy.cn/news/170769.html

相关文章

小米pro笔记本2017款BIOS降级0603

自从一次手贱听说了新版BIOS很好就更新了&#xff0c;结果风扇给削了&#xff0c;电脑变得巨烫 最近找了一下发现除了BIOS降级教程 然后花了点时间找到了0603的固件包 按以下步骤操作 1.解压小米pro0603bios解压后如下 2.找一个U盘格式化成FAT32格式 3.将解压后的文件拷贝…

笔记本使用Fiddler对Iphone进行抓包

1、PC上安装和配置Fildder 安装Fiddler 下载地址为&#xff1a;https://www.telerik.com/download/fiddler 配置Filder Tools>>Options 2、PC上安装并开启wifi 比如猎豹免费wifi 注&#xff1a;我家里使用的电信wifi&#xff08;笔记本链接&#xff09;&#xf…

注意你的笔记本包

前天&#xff0c;对我来说是一个不倒霉的日子。早上&#xff0c;随着“碰”的一声&#xff0c;我的HP笔记本包掉在了地上。开始我并没有注意&#xff0c;因为我包里有一些软的东西垫着。单当我打开笔记本准备工作的时候&#xff0c;发现液晶屏碎了。仔细检查没有发现笔记本有任…

OneNote如何修改已有的笔记本为默认的快速笔记?

OneNote如何修改已有的笔记本为默认的快速笔记&#xff1f; 1.软件环境⚙️2.问题描述&#x1f50d;3.解决方法&#x1f421;3.1. 依次打开文件→选项3.2. 在弹出的OneNote选项对话框中找到保存和备份3.3.修改自己的笔记本为默认的快速笔记3.4.关闭多余的笔记本&#xff08;非强…

笔记本配置无线抓包

一、笔记本电脑配置 一台很老的联想笔记本&#xff0c;闲来无线&#xff0c;配置下&#xff0c;用于无线抓包。 a. Celeron双核&#xff0c;32位&#xff0c; 估计很多同学没见过此型号&#xff1b;其它配置更low&#xff0c;就不放了。 b. 无线网络是MTK的 RT5572&#xff0c…

【map和set的封装】

文章目录 前言1 大致框架2 迭代器3 map和set的封装 前言 上篇博客已经讲解了红黑树插入的模拟实现&#xff0c;这篇文章的目的是利用上节课讲解的底层实现来封装map和set.参考代码借鉴的是STL SGI版本3.0 1 大致框架 首先我们来看看源码里面怎么定义的: 从源码中我们不难发现m…

知识图谱涉及技术点分析

文章目录 数据从哪里来为什么通常将知识图谱划分到NLP领域&#xff1f;常用NLP技术点分析只是NLP任务吗&#xff1f;graph embedding知识融合业务还是算法&#xff1f;知识图谱组成 数据从哪里来 是手动提取关系吗&#xff1f;数据很多&#xff0c;关系确难涉及大量NLP技术关系…

【Docker】什么是Docker,它用来干什么

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…