前言
最近折腾了一些家里的路由器,给路由器上挂了一个固态,用做微型NAS,给电视机共享一些影视文件。此前我都是开着windows的SMB文件共享然后使用电视机放映本地文件,但是这样每次看电视之前都需要给电脑开机才行十分麻烦。
使用路由器做文件共享确实方便许多,但是在硬盘有读写的情况下,路由器的CPU占用率会被拉满,随之而来的问题就是温度暴涨,AC88U作为一个已经服役了6年的老将,CPU拉满之后温度直接飙到80+,并且此时已经不是夏天,室温只有20°左右,我都不敢想当35°的室温它会怎么样。
于是开始了降温行动,最开始的方案就是在某宝上买了一个带底座的USB风扇,正好AC88U有USB接口,直接插上就能用,并且效果相当的不错,可以将温度降到50+,但是这个风扇运行的声音有点吵。
作为一个有点小强迫症的人,有点忍受不了风扇常开的噪音,所以我又有了新的点子,我在又在某宝上淘了一个温控开关,只要温度达到额定值,开关就会闭合。当然这也是有点问题的,我把温度开关贴在散热鳍片上,但是我买的温度开关不是很灵敏,并且额定温度是60°,导致风扇几乎一直在运行。所以这个方案也被我pass掉。
知道我看到了这篇帖子https://www.52asus.com/thread-15067-1-1.html,让我有了新的方向。
曲折的构思过程
我在别人的帖子中了解到,华硕固件可以用跑Linux 命令的脚本,并且可以用固件自带的一些命令来控制路由器的硬件。
上述的这篇帖子中主要提到:
- 用命令控制USB口是否供电
- 使用Linux命令定时启动脚本
- 用命令控制路由器指示灯
- 免责声明(狗头)
1、2点,再加上USB风扇是可以绝杀这个问题的,可以在脚本中判CPU的温度是否达到阈值,如果达到就开启USB供电,反之则关闭,非常简单。
但是,作者使用这个方案的时候用的并不是RT-AC88U,经过我的一番测试,和查阅一些资料。RT-AC88U的固件可以执行USB端口的控制命令,但这些命令并不会生效。
不过有个好消息是,路由器的指示灯控制命令是可以响应的。这让我又想到了一个点子,只要我在外部有一个开关电路,然后在将指示灯开关的信号引出到开关电路,那么不就可以实现在脚本中控制风扇的开关了吗。
温控风扇实现方案
- 将路由器指示灯信号引出到外部的开关电路,使得风扇的开启关闭与路由器指示灯同步
- 编写Linux脚本,获取CPU温度,判断CPU温度是否超过阈值,如果超过那么开启路由器指示灯,否则关闭路由器指示灯。
- 使用Linux命令,定时启动脚本。
这里既然已经用到了外部的开关电路,所以干脆风扇的驱动也由外部电路来实现,因为路由器的USB口供电似乎只有500ma,如果长期满载使用不是一个好的方案。
那么要使用外部电路驱动风扇,就需要在两套电路之间做隔离(路由器和外部的驱动电路),我最先想到的是继电器,但是我并不想听到它每次闭合都“哒”的一声,所以我选择了光耦合器,一种用发光二极管触发光敏器件的元器件。
然后驱动电路使用开关三极管或者可控硅都可以。
电路实现
驱动电路最开始我是打算用三极管的,不过我在购买元器件之前翻找了一下大学的时候使用的工具箱,想着能找到一些电阻,杜邦线啥的就可以少买点了,不过实在有点巧合,我找到了我所需要的所有元器件(没有三极管,只有可控硅)。
然后这是电路图:
我这里可控硅用的是TB136,光耦用的是MOC3022,他们的正向导通电流都是10ma
所以我这里R6 的值都是取的300Ω。
路由器是3.3v供电,并且需要考虑发光二极管的内阻,所以这里取了250Ω(大概?用600、600、1000并联)。
其实还有一件更巧合的事情,本来我是打算用AD画个电路图模拟一下输入输出结果的,但是一件六七年没有碰过这些东西了,显然早就已经忘得一干二净了,在电脑里翻找AD相关的资料的时候,我翻到了实习的时候为那家公司画的电路板,好巧不巧,正好用到了了这么一块控制+驱动的电路,太巧了。
路由器指示灯信号引出
经过测量,路由器指示灯的控制信号是从GND端出来的,所以只需要在电路板上找个3.3V的VCC,然后在将指示灯的接地端印出来,然后分别接到外部电路的MOC3022器件的1脚和二脚就可以了。
正好左边被圈出来的地方这里有个没有使用的VCC插座,然后右边圈出来的是指示灯,这里我使用的是USB2.0口的指示灯。
这些做好了之后再和外部电路连接好,硬件改造部分就完工了。
风扇控制脚本
echo " CPU temperature is: $(cat /proc/dmu/temperature | grep -oE '[0-9]+')" if [ $(cat /proc/dmu/temperature | grep -oE '[0-9]+') -ge "70" ]; then led_ctrl 1 1 echo "call cmd led_ctrl 1 1" else led_ctrl 1 0 echo "call cmd led_ctrl 1 0" fi
- cat /proc/dmu/temperature 命令用于获取CPU温度
- grep -oE '[0-9]+' 截取命令中输出的值中的温度数值
- led_ctrl 1 1 开启信号灯
- led_ctrl 1 0 关闭信号灯
cru a CTRLUSB "*/5 * * * * /jffs/.koolshare/scripts/fengshan.sh"
设置5分钟启动一次脚本
注意事项:
- 新建的脚本需要执行权限才可以执行
- 脚本路径,我用的是梅林官改的固件,所以我把脚本放在/jffs/.koolshare/scripts/下,这样才不会在路由器重启之后被清理掉。如果是官方的固件我不确定是不是也有这个路径。
文章评论