树莓派/继电器DIY朴素的远程空调遥控器

时间:2024-10-21 16:35:14

这篇文章是事后所作,由于今天下午老婆和小小已经回来,所以我便不再需要远程空调遥控了,但不管怎样,我假装我仍然需要这个东西,毕竟这是我在她们回来之前亲自做出来的,并且真的可用。
  当她们刚回到家里的时候,我第一时间演示了这个遥控器,并且演示成功。
  除此之外,本文与智能家居无关,因为我的这个DIY一点都不智能,与编程也无关,因为我基本上只写了几行脚本,所有的功劳都是Linux内核sysfs机制贡献的。这个DIY除了在成功后并且给老婆演示成功后觉得稍有成就感之外,它几乎不可用,因为太难看了,而且一个遥控器后面要用毛线绑两块电路板…谁会用这个?
  提前剧透一点有点不可思议的,以让你可以有看完本文的欲望。你知道蒸汽机驱动的马车吗?嗯,没错,蒸汽机提供了动力,但是依然没有放弃那匹马,这很有趣,真的很有趣…本文我所设计的这个远程遥控器正是这么一架蒸汽机驱动的马车!
PS:今天是周日!下午去深圳北站接了老婆和小小回到家之后,就没有再去加班,因为到家后就已经4点多了,我也累了,实在是比较累,中午的时候有点中暑,我想休息一下,所以本文是占用了工作时间写的,这段时间,我本应该在工位上上班的,然而我心怀内疚地请了假;对我的身体和内心而言,我很累,然而我却也没有休息,既然请了假,我本来把这时间用来休息,我却没有休息,所以本文是占用了休息时间写的…
  且作且珍惜!

动机

最近老婆经常带小小出去各地旅游,留下我和家里的嘟嘟狗,这是深圳最热的季节,湿热的亚热带夏季!
  为了避开高峰期和大太阳或者大雨,同时为了下班能早点回家,我一直都是六点多就去上班了,然而问题来了,我那么早到公司,就意味着公司的空调必须由我来打开,在我第一个进入公司,打开灯和空调前,这种玻璃幕墙的写字楼是超级闷热的,夏天里的温室,有谁每天体验吗?!好吧,这个我已经忍了将近5年!从上海忍到深圳!每当我早上进入公司的时候,我是愤怒的,我当时第一个想法就是,请假回家!
  问题更加严重了,现在我连请假回家都不可以了。因为家里也成了一样的情况,家里没人会帮我提前把空调打开,这意味着如果我由于不堪忍受公司的环境而选择了回家,在进入家门的那一刻,我将面临同样的问题!好吧,于是我默默坐在自己工位上,喝一口冰水,苦苦等待那破空调的制冷效果显灵。

  公司的空调超级不给力,天天坏不说,根本就不制冷,我头顶还挡了一个灯,完全挡住了那本来就很微弱的冷风,严重影响工作效率!好不容易熬到了下班,我终于可以离开了,坐在班车或者地铁上是幸福的,因为空调很给力!然而进入家门的那一刻,我彻底崩溃了!我住的房子朝西,如果是晴天多云天气,西晒热别严重,本来就闷热的房间又被加热了一个下午,在我回到家时温度几乎达到了最不可饶恕的地步…天啊!
  跟早上到公司的情况一样,可能还会更糟!
  不能再忍耐了!我要动手做点什么试图改变这个令人悲伤的局面。当然,我无权触动公司的空调,那是公共财产,但我可以偷偷地Touch一下房东的空调(这要在上海我自己的家,我肯定早就动手了,然而我自己的家没有西晒…)。我要DIY一个远程空调遥控器,在我下班离开公司的那一刻,就把家里的空调打开(当然,前提是我早上上班时要把门窗关好,毕竟我没有那么多预算去DIY远程关门关窗的装置)!

风格

当我讲述我的故事给其他人听时,他们的态度是冷漠的,这显示了人们事不关己时秉性。以下是别人提的“简单”方案:

1.雇一个保姆或者钟点工每天到点去家里开空调…
2.家里装一套智能家居系统,或者简单的买一个智能插座…
3.买一个树莓派,再买套红外发射和接收模块,然后远程控制树莓派…

说实话,相对而言,我是比较喜欢方案3的,至少它很geek,方案1和方案2都是给土豪用的,我要有那钱,我至少也是个经理了吧,老婆外出旅游我难道不休假一起去?然而,即便是方案3,成本也太高了,我说的成本不光指钱,更包括学习的曲线,时间,精力,我的设想是,我需要一个朴素的方案!
  请注意,我不是为了学习树莓派或者学习嵌入式硬件开发,我只是为了开空调而已。所以我没有时间和精力去看那些手册,研究那些寄存器,或者听别人扯那些DIY出来的东西多么美妙…
  这些我没有兴趣,我对开发智能硬件也没有兴趣,我只是用它一下,希望能打开我家的空调,仅此而已。有人说,这个很简单,然后给我一大堆代码,画出一大堆原理图,这个我看不懂,我也不想看,隔行如隔山,我需要用我这个门外汉能理解的方式来做一个朴素的方案。
  记得几年前我在搞OpenVPN多处理的时候,我说“我不会编程,但也不是一点也不会,我稍微懂一点”,这句话的含义依然可以促使我完成远程空调遥控器的设计。对于程序员而言,正确地处理OpenVPN多处理的方法应该是修改OpenVPN的源码,把它多线程化,然而我的做法却是,原封不动地保持OpenVPN程序不变,仅仅是多运行几个实例,然后在外部通过脚本将这些实例粘合起来,我的意思是,所谓的朴素方案,就是组装现有的组件,而不是造出一个新的组件。因为造出一个新组件需要专业的技术,我没有,所以我只能组装。

隐喻

打开空调,需要做的动作很简单,就是按一下空调上遥控器上的那个开关按键,最显而易见的方案就是设计一套机械装置,触发器是一个夹子或者锤子,控制器接入到家用路由器或者一台常开的低功耗电脑,当需要触发时,锤子锤一下按键…但这需要机械方面的专业知识。But it’s beyond my ablity.
  回到最本源,按下那个按钮,发生了什么?一定是接通了一个回路。把空调遥控器拆开来确认一下:

这里写图片描述

主音吉他手告诉我胶按钮下面圆点上的涂层是碳化合物,是导电的。这下就简单了,顺着电路找明显的焊点(我的焊工一般般,所以不能是太精细的焊点),天助我也,找到了:

这里写图片描述

于是焊上去两根导线(家里没有导线,我劈开了一条已经很少用的双绞线中的一个线对来使用,粗细正合适!),然后短接一下,遥控屏幕点亮了,再短接一下,屏幕熄灭了。对着空调短接一下,空调打开了,再短接一下,关闭了…简单,就是接通一个回路,仅此而已,现在可以抛开空调遥控器本身了,现在需要看一下如何控制一个回路的闭合。
  继电器是万能的开关。整个世界就是开关的组合!
  继电器可以将控制权从人手导出给一台电脑,进而通过程序来控制开关的闭合。原理非常简单:

这里写图片描述

能控制继电器的程序都很简单,写一个gpio就搞得定。至于说如何在外面接入到家里的设备,这岂不是我的强项,我是忽略这个问题的,我觉得这都不是事儿。

选材

巧妇难为无米之炊,方案有了,该买东西了…
  正巧最近公司进行网络测试时用了一枚树莓派,我也正好在跟进这个事情,简单上手后,觉得挺容易,就用它了!于是我也买了一个:

这里写图片描述

树莓派其实就是一个带有gpio的普通电脑,没有外设配件,它几乎什么也做不了,十分无聊,但它和普通电脑的区别就在于它的gpio,普通电脑只有普通的大众常用接口,比如USB,以太口,串口,VGA等等,要想接入一个传感器,继电器之类的小玩意儿,你得首先在这些小物件上适配一个这些标准接口,而这显得场面有点太宏大,不是很朴素。树莓派的gpio可以很朴素地接入这些小器件,然后针对这些端口的读写实际上就是控制这些小器件了。于是,我只需要买一个几块钱的普通的继电器就好了,继电器是个伟大的东西,它将一个硬开关转换成了一个软开关,它是硬件和软件之间的一座桥梁!
  我买的继电器是这种:

这里写图片描述

京东上买的,接线很简单的,网上一搜到处泛滥。遗憾的是,由于周末才送货,我写的收货地是公司大楼,公司的话快递员周末是不送的,这让我觉得不公道,因为周末这个片区的公司跟平时是没有任何去别的,换句话说,大家都在上班,当然我本周也是在公司的…幸亏有备用,不然这周末就废了。最终我使用的是这种:

这里写图片描述

这种是已经做好的板子,不需要自己手工接线,直接插入即可使用,很方便,当然价格比较贵了,这是一个朋友送的,周五就给我寄来了,所以我才会用它,不然的话,有买这个的钱,我都可以买一个智能插座了。

实测

材料备齐了,开始DIY。
  按照下面的示意图接好线后,就开始编程了:

这里写图片描述

然而懒惰的我又不想折腾代码,如果按照网上的教程来做这个,我就不得不在树莓派上安装一系列的库,然后还要写代码,调库函数…
  反正就是程序员的那套流程。我倾向于用脚本来完成一些事情,这样显得很朴素。幸运的是,树莓派将gpio导出到了sysfs里了,参考继电器板自带的示例程序,以下脚本是可用的:

#!/bin/bash

# 示例程序的注释里说的,如果使用中间那一路继电器,就是用21号
ch=21

echo $ch > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio$ch/direction
# 先短接导出的那两根导线
echo 0 > /sys/class/gpio/gpio$ch/value
# 模拟短暂碰触短接
sleep 0.3
# 再断开短接的那两根导线
echo 1 > /sys/class/gpio/gpio$ch/value

保存为并给予执行权限,就这样,非常之简单!执行便可以点亮或者熄灭遥控器屏幕了,对准空调,可以通过执行开关空调了。接下来终于该我轻车熟路地纵横驰骋了。不就是在路由器上加一条端口转发或者配一条DNAT嘛…

失落

树莓派接入到我家的极路由WiFi,得到了IP地址192.168.199.216,打开我家的极路由管理界面,查看了公网IP地址addr,一切OK,我使用超级端口转发这个插件配置了一个条目,即访问addr:600的请求转发到192.168.199.216:22,这是为了在外面的时候登录我放在家里的树莓派从而执行来开空调,因为我并不想写也不会写什么Android客户端,所以朴素的做法就是直接用ssh,我还下载了手机上的ssh工具ConnectBot:

这里写图片描述

好吧,现在开始从外面接入树莓派…
  断开手机的WiFi,接入4G网络,在ConnectBot中添加一个条目,即ssh pi@$addr:600,然后连接…
  等待,等待…
  …
  没有成功!But why?
  于是我试着用4G网络去ping这个addr,竟然不通!我怀疑是电信的光猫在捣鬼,是不是有可能电信的天翼宽带光猫上做了二级路由呢?赶紧登录光猫看看。
  听说这个电信光猫是可以索得超级管理员权限的,我也搞到了一个,用户名是telecomadmin,密码是nE7jA%5m(也许你家的就是这个,我这个也是从朋友那里拿到的),登录进去后并没有发现有做路由,而是Bridge配置:

这里写图片描述

既然是Bridge还不通,原因就难缠了,毕竟我也做过不是那么纯粹的Bridge,那么也好办,我直接让光猫拨号,然后光猫上添加NAT或者DMZ,换句话说,不用极路由了,直接用光猫,这总行了吧!于是我删除了Bridge配置,添加了Route模式的配置(保持VLAN ID和其它配置不变,将Bridge改为Route,并且正确填入运营商卖给你的账号和密码),让其自动拨号,拨号成功,然而我注意到我得到的公网IP地址:100.64.149.28
  这是个100.64打头的保留地址啊!是电信为了节省地址空间所采用的权宜之计NAT444。换句话说,N个租户共享一个公共IP地址来上网。说的也是,电信的用户协议里说了,只提供宽带接入的服务,也就是说能让你上网就行,没说让你提供服务啊,没说让你反向连接啊,鉴于大多数人都不懂这个同时也不需要公共IP地址反连回家里,电信那边怎么搞都行,只要你能上网看网页看片玩游戏就好了,至于像我这种需求,电信貌似并不特殊对待。
  这可怎么办?硬件上的无米之炊可以瞬间花钱买东西,软件上缺了东西怎么补?任凭网络技术再牛逼,没有IP地址也是扯淡啊!大半夜11点了,于是打客服电话10000,语音提示说夜间只受理紧急故障,只好等到次日了。

解决

第二天依然要加班,到了公司之后,第一时间打了10000转接人工服务,我告诉她说我需要公网公共IP,我需要网络支持智能家居(我怕我说自己在家做实验的话,对方不理我,就只能这么说),没想到对方秒回,反问我的账号,绑定手机,我告诉她就是这个手机时,对方回答:已经给您切回了公共IP地址,请重启光猫。请问还有别的咨询吗?…
  就这么简单就搞定了?我打客服电话时是在公司,我并不能马上去试验以验证是不是问题解决了。但可想而知,这是一个多么普遍的问题啊,我能做的,也只有为了相信而相信了,再怎么也要等下班了回家才能确认。

  确认,问题解决,我得到了一个公网公共IP地址:

这里写图片描述

值得注意的是,配置Route模式拨号的时候,一定记得勾选使能NAT,这个我不用再解释了,不然数据包会有去无回的,使能NAT的意思是,出去的数据包在经过光猫时,源地址都会转换为电信分配的公网公共IP,而不是继续保留自己的私有IP地址。
  能通过打客服电话解决的事情就不去炫技搞隧道,代理,VPN这些玩意儿,再次重复,我的目标只是打开空调。

使用

既然不用极路由了,我也就只能在电信光猫上折腾了,虽然我知道最终还是要切换回极路由,但就现在,我不用折腾超级端口转发插件了,因为我在电信光猫上发现了一个好东西,即DMZ自动转发:

这里写图片描述

请注意,上图中的192.168.1.3这个地址就是树莓派的IP地址,在此之前,我的树莓派已经接入到了电信光猫的WiFi网络中了:

这里写图片描述

出门买只遥鸡去,临走先确认空调是关闭的,然后把这套装置摆在一个对准空调的地方,锁门走人:

这里写图片描述

出了小区的时候,打开手机ConnectBot,用电信分配的公有IP地址的22端口登录树莓派:

这里写图片描述

登录以及执行yk脚本均成功!直接去买遥鸡,然后去买了一瓶真露烧酒。
  等回到家时已经半小时以后了,依然汗流浃背,打开门的那一瞬间,一股清凉扑来:

这里写图片描述

空调遥控器已经点亮,空调已经打开,坐下来,吃鸡,喝酒!留下了一些没吃完的鸡肉,给嘟嘟改善下伙食!

评价

不管是程序员还是硬件工程师,都会觉得我这个DIY超级没有技术含量,算是比较Low的,然而那些非行业内的或者说不懂技术的人不这么想。其实我也知道有很多种方案可以更加“漂亮”地完成这个任务,如果我能在文中贴一些datasheet的截图,那更帅了,然后再配备各种库的安装,编译,源码分析…但那样并不朴素,那不是我想要的。
  我一再重复的是,我的目标不是要学习嵌入式开发,我也无意去玩转树莓派,更不是什么编程高手,我不喜欢用“技巧”而不是“常识”来解决问题,我的目标仅仅就是打开空调。正如我上一篇文章写Geogebra的用法一样,在那篇文章中,我只是用它来画一个泰勒展开的逼近图像,我并不想去深入学习Geogebra的复杂用法,只是为了解决一个特定的小问题,碰到了这个东西,觉得可以适配我的需求,那么拿来用一下,在这些行为的背后并没有什么宏伟的计划。
  在日常生活中,这就是我处理一些问题的风格。我记得老婆说我的一个优点就是能用一切手边的东西解决眼前的问题。曾经用牙签修雨伞,用牛仔裤做手袋,用椅子做桌子,用双绞线输电,用铁钉做分频…总之太多这样的例子了,都不是什么有技术含量的东西,在专业的角度,都是很Low的东西,但是撸起袖子就干,能用,又有什么不好呢?
  人们不喜欢朴素的东西,朴素的东西无法显示自己的与众不同,无法显得很牛逼,但却可以快速直接地解决问题,人们更多的是喜欢在“殊途”竞速,而忽略最终的那个“同归”,人们都想当独门英雄,却很难想象英雄最终都所见略同。
  在职场中,这种现象更加表现的淋漓尽致。能达到同样效果的两个方案,两个人一个人负责一个方案的实现,最终实现越复杂,花的时间越多,场面越宏大的那个人将会得到更多的奖赏,在西装老板和皮鞋经理们看来,复杂意味着工作量,意味着更努力,而简单朴素意味着小聪明,意味着trick。朴素注定是孤独的。
  我跟主音吉他手争辩,我说除了情感,所有的思想都是朴素的,主音吉他手告诉我,那是因为人们只能理解简单的东西。我思考良久,我认同他的观点,虽然人的大脑有逻辑上的缺陷(比如会出现短路,栈溢出等),但人的身体,特别是双手却可以做非常复杂的流程化规程化的事,如果自己做不到,就命令别人去做,如果所有人都做不到,就制造机器去做,所以说,现在的世界上,能用的东西都是复杂的,并且越来越复杂,所有这些都是靠众力完成的,工程学上的成果,天生就不是朴素的,它注定必然是宏大的,复杂的,即便上帝的阻挠,人们依然要造出巴别塔!
  朴素的东西只存在于思想中,欣赏朴素,请看那些孤独的思想者创造出来的一个朴素的原则,一套朴素的道德说教,一个朴素的公式,甚至一个朴素的化学式,一段朴素音乐…

升华

我的DIY最终升华了,因为我终于实现了众生推荐给我的方案1。
  虽然我做出了我的朴素版远程空调遥控器,但或许我再也用不到它了,因为老婆和小小下午的时候回来了!其实仔细想想,我到底想做给谁看呢?我真的要用呢,还是说仅仅想让不懂技术的老婆看看我的成功,然后显得自己很牛逼呢?其实我也不知道…到头来,说不准我的目标不是仅仅想打开空调,而是想在老婆面前炫耀一番而已,唉,哈哈…但这不能保证。
  在我还没有完成这个DIY的时候(当时是堵在了电信的公共IP地址上),我的一个同事朋友就转发了朋友圈,然后在今天早上他告诉我有很多点赞,还特意截屏给我看一个善意的提醒,那就是安全问题。
  这里不得不说说安全问题。
  在仅仅将电脑和屏幕联网以满足人们的视觉欲望的互联网时代,安全问题一直都是令人头疼的,然而在世界进化到了万物联网的物联网时代,安全更是刚需的刚需。我以前的公司就是搞安全的,主要在PKI领域,证书认证。然而考虑到PKI太重了,可能已经不适合物联网了,那么我们的安全问题如何解决。现在病毒入侵,木马入侵只是感染你的电脑,手机,大不了丢失几个文件,泄漏点信息损失点钱啥的,只要你能保持最起码的底线,有陌生人约你你不赴宴,那么攻击永远只能停留在虚拟的世界。然而在物联网时代,要是家里的物件接入网络了,那会发生什么,别人随便都能打开你家的燃气,空调,断掉你家的冰箱电源,甚至都可以开你家的门(考虑联网的电子锁),各种电器被入侵都有潜在的危险。你有旋转升降座椅吗?如果你的椅子被入侵了,当你坐上去的时候,椅子就会爆炸,真的就是菊花残,满地伤,花落人断肠了。这绝不是危言耸听!
  所以说,本文中我所描述的这类DIY,哪怕是你真的买了红外模块做的能显示你实力的有技术含量的东西,你也只是在考虑能不能实现的问题,至于可不可用,那便是一个社会学问题,不单单是工程师能解决的了。