最近这阵子,老是有人问我,那个「flowerwitch」的小玩意儿,到底什么时候能把功耗优化一下,待机时间短得跟闹着玩似的。上次不是承诺了要彻底重构底层代码吗?就是来交这个更新日志的。
我的初衷很简单,就是受够了。家里那几盆宝贝花,尤其是那个娇气的兰花,我一出差基本就完蛋。商业化的那些智能花盆监测器,价格死贵,精度又差,电量用完了换电池比我写代码还烦。我寻思,自己动手,丰衣足食,起码能把这续航短板给彻底解决了。
最初的折腾:东拼西凑就是一团浆糊
这项目断断续续搞了快一年。我就像无头苍蝇一样,逮着什么用什么,活生生搞成了一锅大杂烩。
- 硬件选择:我当时手上刚好有块吃灰的ESP32,图它便宜,直接就抓过来用了。心想它带蓝牙和Wi-Fi,多方便。
- 传感器接入:最初接入的是一个电容式土壤湿度传感器,这破玩意儿精度飘忽不定,我用了三块,读数都没统一过。我当时还傻乎乎地写了一堆算法去「平滑」那些噪点数据。
- 数据传输:为了图快,我直接用了个免费的第三方IoT平台做MQTT连接。但那平台限制多,延迟高,有时候能卡半个小时不动弹,根本不叫实时监测。
- 应用端:更惨,当时瞎用了一个App Inventor拼出来的简陋App,界面丑得没法看,操作逻辑也是一团乱麻。
小编温馨提醒:本站只提供游戏介绍,下载游戏请前往89游戏主站,89游戏提供真人恋爱/绅士游戏/3A单机游戏大全,点我立即前往》》》绅士游戏下载专区
就这么拼凑了一气,东西是跑起来了,但只要离开电脑,它就各种掉线、各种报错。我人在外地,心心念念着家里的花,结果打开App一看是“离线”,急得我差点直接买机票回去看。没办法,只能是让老妈每天给我拍视频确认。这跟没做不是一个性质吗?
彻底重构:从根子上解决问题
我忍无可忍,就决定把这个「flowerwitch」从头到尾扒皮重写。我坐下来,先把需求捋清楚了:高精度、低功耗、本地化优先。这回我可没再瞎折腾。
这回我可是下狠心了,我扔掉了那个不稳定的电容传感器,换成了更可靠的电阻式传感器,但同时我增加了一个简单的ADC校准机制,用代码来弥补硬件上的差异。这是第一步,解决数据源的问题。
然后是功耗这个老大难。我翻遍了ESP32的官方文档和各种国外论坛,最终确定了使用Deep Sleep(深度睡眠)模式。这玩意儿可不是简单调个函数就行的。我必须把整个程序的逻辑拆开重组,让它只在采集和发送数据的极短瞬间醒过来,其他时间全部躺平。我计算了每一个毫秒的耗电量,优化了Wi-Fi连接和断开的流程,把唤醒->采集->发送->休眠的周期从最初的几秒压缩到了不到500毫秒。
数据传输部分,我也抛弃了那个第三方平台。我自己搭了一个轻量级的本地Web服务(用的Python Flask),ESP32只向我的局域网内的一个指定IP发送简单的JSON数据包。这样既没有了公网延迟,也避免了平台限制。App端我也重写了,虽然还是用原生开发,但至少界面干净了,操作也流畅了。
我花了一整周的时间,每天晚上都是对着代码和万用表盯着看,一点点地抠功耗。最终的效果让我自己都震惊了。最初只能撑一天的电池,现在充满电后,在每小时监测一次的频率下,跑满了接近两个月!
为什么这回能顺利搞定?一个插曲
你可能会问,你之前为啥不这么干?非要等到现在才搞定?
我为啥有时间做这个彻底重构?
事情是这样的。半年前,我不是接了个外包项目嘛说是很简单的一个数据处理脚本,结果对面给的需求文档前言不搭后语,前后矛盾,我光是沟通需求就耗了一个月。我当时就想着赶紧把手头这个破脚本应付过去,把钱拿到手再说,所以「flowerwitch」就一直晾着。
结果?那个外包公司嫌我代码风格“不够简洁”,强行扣了我一半的尾款。我当时就火了,觉得这口气咽不下。我一怒之下,直接把那个外包脚本的代码备份扔进了回收站,彻底拉黑了那家公司。我寻思,既然靠别人挣钱这么费劲,还受气,不如干脆把自己的东西做做精!
这个事情让我彻底醒过来了。我突然有了大把的时间,和一股子一定要把一件事情彻底搞定的倔劲。我就坐在桌子前,重新打开了那个「flowerwitch」的项目文件夹,发誓不解决功耗问题,我就不睡觉。那段时间,家里的花又差点因为我的粗心而挂掉,让我更加坚定了要完成这个项目的决心。
这回的更新日志,不光是技术上的进步,更是我对自己浮躁心态的一次彻底清算。它跑得很稳,我终于可以安心出差了。

