宿舍空调遥控器丢了?我花30块搓了个Web智能遥控,顺便给室友上了一课
宿舍空调遥控器丢了?我花30块搓了个Web智能遥控,顺便给室友上了一课
哈喽大家好,我是苏增烨。
熟悉我的老粉都知道,我目前大四,读的是软件工程。学校嘛,广州商学院——对,就是那个正儿八经的民办三本。在这个学历贬值、满大街都是985/211研究生的时代,一个三本生怎么生存?我的答案是:折腾,往死里折腾。
今天不聊我那4.02的GPA,也不灌“如何拿双国奖”的鸡汤。今天咱们聊点接地气的——如何在恶劣的宿舍环境中,靠技术实现“空调自由”。
遥控器失踪案与我的“少爷脾气”
故事的起因非常离谱:我们宿舍的空调遥控器,凭空消失了。
在广州这种一年有十个月像蒸笼、剩下两个月像水煮的城市,空调就是大学生的命。遥控器丢了的第一天,大家翻箱倒柜;第二天,大家开始互相猜忌;到了第三天,我的室友们竟然选择了妥协。
“算了吧烨哥,”我那睡在下铺的兄弟一边擦汗一边说,“没遥控器也能活,你看我的。”
说完,他搬起一把椅子,踩上去,用一把扫把的木柄,精准地捅进了空调主机面板上的那个“应急开关”。“滴”的一声,26度,自动风量。室友露出原始人钻木取火成功般的骄傲笑容。
但我忍不了。
我们这破宿舍条件本来就够感人了:六人间,墙皮动不动就往下掉,宿管阿姨对大功率电器的查处力度堪比朝阳群众,连用个稍微大点的吹风机都会跳闸。现在连开个空调都要像猴子一样上蹿下跳?
我看着那台泛黄的美的空调,心里那个属于工科男的轴劲儿上来了:不就是一个发射红外信号的塑料壳子吗?我今天非得把它给办了。
动机深处:万物皆可“项目化”
看到这里,肯定有弹幕或评论要吐槽了:“淘宝买个万能遥控器9块9包邮,你在这装什么极客?”
确实,9块9能解决问题。但在我看来,这不仅仅是一个遥控器的问题。
经常有人问我:“苏增烨,你一个民办三本的学生,是怎么卷出4.02的绩点,还拿了两次国家奖学金的?是不是天天死记硬背?”
我的回答永远是:把生活中的问题,变成你的项目。
在三本院校,我们没有顶配的实验室,没有带着做国家级课题的院士导师,甚至有时候连学习氛围都要靠自己强行营造。如果我们连自己身边的不爽都懒得动手去改变,那学这一身代码本领干什么?为了期末考试那张卷子吗?
我想要证明自己,不是靠几张奖状,而是靠“我能解决实际问题”的底气。这个空调遥控器,就是送上门来的练手项目。我要的不是9块9的妥协,我要的是把这破宿舍改造成智能家居的爽感。
技术过程:硬刚美的48位私有协议
说干就干。我清点了一下手头的吃灰元件,凑齐了这套“智能遥控”的BOM表:
- 一块NodeMCU ESP8266开发板(约15元)
- 一个红外发射管 + 接收管(约5元)
- 若干杜邦线和一块小面包板(约5元) 总成本不到30块。
硬件连接很简单,难点在于软件和协议。
美的空调的红外协议可以说是业界的一朵奇葩。它不是标准协议,而是一套极其复杂的私有48位指令编码。为了搞清楚这玩意儿,我甚至掏出了网络抓包神器 Fiddler。
你可能纳闷,红外线怎么抓包?我的思路是:先在手机上装了一个声称能控制全网家电的智能家居APP,用Fiddler在电脑端开代理,抓取这个APP在点击“开机”、“调温”时向云端发送的网络请求。顺藤摸瓜拿到Hex数据后,结合我自己焊的红外接收模块,对着现有的旧数据一顿比对逆向,最后终于摸清了这48位数据的结构:引导码 + 逻辑数据(包含温度、风速、模式的按位组合) + 校验码。
协议搞定后,剩下的就是写代码了。我引入了开源界的神器 IRremoteESP8266 库,这玩意儿完美适配ESP8266。
接着,我用C++在ESP8266上跑了一个小型的HTTP Web服务器。只要开发板连上宿舍的路由器,它就会在局域网内广播一个IP地址。我又手搓了一个极简的HTML/CSS前端页面,做了几个巨大的按钮:“开/关”、“温度+”、“温度-”、“制冷模式”。
点击手机网页上的按钮,发送HTTP GET请求到ESP8266,ESP8266解析请求后,调用IR库,把那48位的指令化作红外光波发射出去。逻辑完美闭环。
踩坑实录:理想很丰满,现实很骨感
你以为这就大功告成了?太天真了。硬件不踩坑,那都不叫搞硬件。
第一个大坑:红外发射距离短得令人发指。 代码烧录进去后,我满怀期待地站在宿舍中央,用手机点击“开机”。空调毫无反应。我往前走了一步,点,没反应。我干脆搬起椅子,把ESP8266凑到离空调接收口只有不到10厘米的地方——“滴”,开了。
10厘米?这叫遥控器?这叫贴脸输出! 排查了半天,才发现原来是单片机GPIO口的输出电流太弱鸡了。那点微弱的电流推着红外发射管,简直就像是饿了三天的蚊子在叹气,发出的红外光连空气里的灰尘都穿不透,更别提遥控空调了。
怎么办?得加钱……啊不,得加个放大电路。我在我那个装满电子垃圾的纸箱里翻箱倒柜,终于扒拉出一个几分钱买的S8050三极管。这玩意儿简直就是穷人版的“涡轮增压器”。我把它串进电路里,用单片机的微弱信号去控制三极管的基极,让电源直接给红外管供电。一通电,好家伙!这回红外管的发射功率直接拉满。我站在宿舍阳台,隔着5米远按下手机屏幕上的按钮,“滴——”的一声清脆长鸣,墙上的空调应声启动,冷风呼啸而出。那一刻,我感觉自己手里拿的不是单片机,而是雷神之锤!
硬件搞定了,我以为接下来就是享受科技美好生活的时刻,结果马上就迎来了第二个大坑。
为了方便宿舍几个哥们儿一起用,我写了个Web控制界面,想着只要连上宿舍的局域网,大家打开浏览器就能当遥控器用。我在自己的电脑和手机上测试得丝般顺滑,于是得意洋洋地把IP地址甩到了宿舍群里:“各位义父,以后开空调不用下床了,扫码或者点链接直达!”
对床的室友老李掏出他那身经百战的小米手机,点开链接,然后眉头一皱:“你这写的什么破烂玩意儿?按钮怎么全叠在一起了?开机键都跑到屏幕外面去了!”
我凑过去一看,差点吐血。原本我在电脑上用Flexbox布局写得漂漂亮亮、整整齐齐的九宫格按钮,在他的手机Chrome浏览器上直接变成了惨不忍睹的车祸现场。排查后发现,他手机里那个老旧的WebKit内核对某些Flex属性的兼容性简直是一坨狗屎。为了照顾这位“大爷”的手机,我只能含泪把高大上的Flex布局全删了,换回了上个世纪前端老古董们最爱用的display: table-cell布局。你还真别说,虽然这代码写起来有一股浓浓的千禧年复古味儿,但兼容性是真的香,不管什么破手机打开,按钮都乖乖地待在它们该在的格子里。
说起老李,这哥们儿对这个项目的态度转变,简直就是一部大型“真香”纪录片。
刚开始我在桌子上焊电路板、拉飞线的时候,他每天经过我背后都要吐槽一句:“你在干嘛?又在搞什么电子垃圾?买个万能遥控器才九块九包邮,你在这费这劲干啥?”
直到那天晚上,我们宿舍迎来了历史性的时刻。
在此之前,因为我们宿舍空调的原装遥控器早就在上学期不翼而飞,我们每天开关空调的流程是这样的:先搬一把椅子到空调下面,然后一个人颤颤巍巍地站上去,用一根晾衣杆或者圆珠笔,精准地去戳空调面板上那个比绿豆还小的“应急开关”孔。如果是冬天半夜被热醒,谁去执行这个“刺客任务”简直能引发一场宿舍内战。
而那天晚上,当老李正准备叹口气,认命地去搬椅子时,我躺在被窝里,掏出手机,轻描淡写地点了一下屏幕。
“滴——”
空调导风板缓缓打开,凉风吹了出来。
整个宿舍瞬间安静了三秒。然后隔壁床探出两个脑袋,老李站在椅子旁边瞪大了眼睛,爆出了一句极其朴素的赞美:“卧槽!牛逼啊!”
从那天起,老李从一个冷嘲热讽的旁观者,变成了这个破网页最忠实的用户。每天晚上睡前,他都要把自己裹得严严实实,然后掏出手机在被窝里把空调温度调到最舒适的26度,再美美地睡去。后来他甚至还提需求:“哎,你能不能再加个定时关机的功能?后半夜有点冷。”你看,人类的懒惰,果然是推动科技进步的第一生产力。
看着宿舍哥们儿每天用着我做的小玩意儿,我心里其实挺感慨的。
我们在一所名不见经传的民办三本,没有985/211那种动辄几百万设备的国家级实验室,没有大牛导师带着你做前沿课题,甚至连个像样的科创氛围都得靠自己去凑。在这里,你靠的从来不是什么高大上的平台,而是你自己。
是把生活中每一个微小的痛点、每一个看似不值一提的“小破事”,都变成自己动手的机会。红外距离短?那就学着加三极管放大电路;页面兼容性差?那就去死磕CSS的各种古早写法;不想下床关空调?那就自己从零开始画板子、写代码、搭服务器。
很多时候,拉开人与人之间差距的,不是你掌握了多么高深屠龙之术,而是你愿不愿意为了解决一个真实存在的问题,去弄脏自己的手,去熬夜排查一个又一个愚蠢的Bug。
这个项目的代码虽然糙,但它真真切切地改变了我们宿舍的生活。如果你也受够了半夜爬起来戳空调,或者单纯想折腾一下,源码和电路图我都扔在GitHub上了,欢迎各路神仙来Fork,来提PR(虽然大概率全是Bug):
👉 GitHub: Dorm-AC-Remote-Controller (宿舍空调终结者)
不说了,老李又在群里喊我了,他说网页卡了打不开,我得去重启一下我那台快要冒烟的单片机了。咱们下篇博客见!