手机怎么控制空调,如何用手机控制空调 ——简单实用的智能家居教程

发布于 2021-06-26 02:15:32

手机怎么控制空调,如何用手机控制空调 ——简单实用的智能家居教程

查看更多

关注者
0
被浏览
3
1 个回答
admin
admin 2021-06-26
This guy hasn't written anything yet

手机怎么控制空调【首发少数派:如何用手机控制空调 ——简单实用的智能家居教程】

我家有三个单体空调,型号比较老,每次要在各自的控制面板上调节开关和温度,也没有定时控温功能。
如果想实现远程操控(比如在手机上),最简单的方案就是 Nest Thermostat 。
然而抠门如我一看每个售价$169,三个要五百多美元,便萌生自己改装的念头。

可行吗?根据电路常识推测,空调各部分工作应该是由相应 IO(Input / Output)的高低电位触发,那么只要找到控制面板所连结的 IO,就可以取而代之。
换个角度,即使空调结构是黑盒子,既然 Nest Thermostat 能用于大部分空调型号,这说明:1,空调的 API(操控界面)是高度统一的;2,只要能模拟 Nest 的行为,就可以实现从空调 API 到 Nest API 的转换;3,网上一定有许多通用的 DIY 开源项目。

在这个课题上,我花了一半时间找合适的开源项目。
你需要综合评价:对方解决的问题是否和你一致,交互界面你是否喜欢,配件是否经济实惠,软硬件系统是否强健,是否有后续开放性,可否融合到更广的智能家居平台等等。
由于是第一次改装家电,后两个因素暂时不考虑。
因为我手头有多余的树莓派 Zero,在定制的 Linux 系统下可以轻松安装 Web App,通过 ssh 编程也极为简便,于是就以 thermostat + raspberry pi + web 为关键词搜索,最终选中了 这个方案 :PyStat。

PyStat 的用户界面是一个网页:

用户界面非常直观:第一行显示室温和目标温度。
第二行的三个圆圈表明相应部件是否工作。
比如,在制热时,制热和风扇同时工作,所以第1、3个圆圈是亮的,中间代表制冷的不亮。
第三行的三个方块是用户选择的工作模块,最多可选一个。
注意无论选制冷还是制热,风扇始终是工作的。
第四行是温度选择。
选好模式和温度后点击 Submit Changes 即可传送指令。
最下方是由 Weather API 提供的天气预报。

因为是 Web App ,就可以在家里任何浏览器上操作,比如手机和 Tablet 上:

(打折时淘的 Fire Tablet 重获生机,可以嵌到墙里)

因为是内网页面,你只能在联入家里 Wifi 的设备上操控,即不能在回家路上事先打开空调——这是这个方案的缺点之一。
我会在以后的系统智能家居方案中探索这个需求。

如果你喜欢这个界面,就可以下载 代码库 ,撸起袖子干了:

购买配件

树莓派 Zero W $10 + shipping

Micro SD 卡 (至少8G) $8

4 Channel Relay $7

DS18B20温度探头 $6

一个4.7k~10k欧姆的电阻

导线若干、Micro USB 充电线一根

总价:$31+。
除了树莓派以外的配件在 AliExpress 上买便宜得多,只是要等2-3周。

此外,你可能还需要用于测试的 LED 灯若干、面包版、电焊工具、micro HDMI 线、micro USB hub、USB 鼠标键盘等辅助配件,以上都不算在耗材里。

预备树莓派

1,在树莓派上安装 Rasbian 系统, 参考这里 。
建议安装 这个 带图形桌面的版本。

2,通过 Micro HDMI 连显示器,在图形界面里连上家里的 Wifi。

3,如果选择 ssh 联入,记得在 raspi-config 设置里 enable ssh。

4,下载代码: https://github.com/zhaozhichen/PyStat

设置温度探头

我先扯开一点,讲一下空调是怎么控制温度的。

纠正一个许多人都有的错误印象:(以制热为例)温度调得越高,空调功率越大,室温升温越快。
事实上,对大部分普通空调,制热制冷功率是恒定的,和所调温度无关。
比如室温是10度,制热目标温度设为20度,在制热过程中室温逐渐升高,当到达目标温度加容错值(比如2度),也就是22度时,空调停止工作。
此后,室温逐渐回落,当落到目标温度减去容错值,也就是18度时,制热再次开启,如此往复保证室温在设定温度周围(18~22度)震荡。
所以,设定温度高低只能决定最终稳定的室温,而不能改变初始升温的速度。

说这个原理,是因为我们要在程序里复现以上逻辑,也就是说除了控制制热/制冷/风扇的输出信号,我们还需要测量室温的输入信号。

温度是模拟量。
不同于 Arduino,树莓派只支持数字输入,于是需要 DS18B20 这样的 1-Wire 设备将模拟信号转换为脉冲数字信号,然后解码为模拟量,保存在 /sys/bus/w1/devices 中。
请参考 这个 教程 ,并将你的温度探头序列号复制到 这里 。
注意:我们用4号接口。

安装 Web App

我自己不会做网站,尤其不懂前端,对 LAMP 结构的 web server 敬而远之。
直到发现基于 python 的 flask,三行代码写 Hello World,真是找到了救命稻草,一见钟情。
Flask 的 web server 教程请 参考这里 。

这个系统的主代码是 ThermostatMain.py,初次运行时开启三个线程,分别是 :

ThermostatService

从 current.set 读取指令(模式:制热/制冷/风扇,目标温度);

通过温度探头读取室温;

通过 GPIO 输出制热/制冷/风扇的开关。

ThermostatWeb

web server,通过温度探头读取室温显示在网页上;

(可选)从指定的天气信息服务商 API 读取所在地气候、天气预报等信息。
推荐 Weather 提供的 API;

将用户在网页上做的指令保存于 current.set。

ThermostatScheduler

定时开关,这个没有用户界面,我也没有用上。

然后循环运行以下任务:

记录室温、指令、天气情况等信息,通过 sqlite3 保存到数据库中;

检测各进程,及时报错。

运行主程序:

$ Python3 ThermostatMain.py

然后在其他设备上访问:192.168.X.X:5000(填写树莓派的 IP 地址),应该可以看到用户界面。

这是 web app 的单元测试(unit test)。

树莓派电路

如果你没有在树莓派上用过 python 的 GPIO 库,可以参考 这个教程 。
我们用的树莓派的 GPIO 针脚排布在 这里 ,此外可以在 这里 看到更详细的参数。
我们用到了4个接口,除了用于前文提到的用于温度探头的4号口,其他三个输出口分别是:

制热开关:17

制冷开关:27

风扇开关:22

除此之外,还需要用到3.3伏电位和地线(ground)。
所以,焊接后的电路如下(温度探头的焊接方式在前文提到的 教程 里):

(由于我用的是树莓派 Zero,不带 Wifi 功能,所以需要外接 USB Wifi 模块。
如果你买的是我推荐的树莓派 Zero W,就可以忽略这个模块。

在接空调之前,建议用 LED 灯模拟空调,检测制热/制冷/风扇在网页提供的指令下是否工作正常。
比如,在17口和地线之间串联进一个 LED 灯加一个大于1k的电阻(防止 LED 灯电流过载而烧毁),如果空调应该处于制热模式,灯应该亮。

这是树莓派的单元测试。

注意:由于我们用到的 Relay 的开关和树莓派 GPIO 的输出是相反的,所以你在用 LED 灯测试时需要在 这里 将输出指令掉转过来。

空调电路

尽量获得空调的手册(至少是比较接近的型号),了解遥控模式的使用方式。
比如,这个是和我家空调型号比较接近的控制板布局(摘自 手册 ):

注意 C、E、F 区。
E 区中的 Remote 必须调至 ON,这意味着你将通过 C 区针脚操控空调,同时也意味着你放弃了控制面板的操作权。
C 区的针脚布局如下:

每个空调的布局不尽相同,但一般都至少含有 R、G、W、Y、C 五个接口。
含义如下:

R:24伏高电位

C:地线 Ground

G:风扇

W:制热

Y:制冷

当 W 和 R 相连,W 就获得了高电位,制热模式开启。
风扇和制冷同理。

这种通用接口称为 Thermostats C Wire,可以参考 这篇介绍 。

在连入空调前,建议你先测试遥控模式下针脚是否工作正常。
拿一根导线,将 R 和 G 连上,应该可以触发风扇工作。
如果不行,将空调电源拔掉再接上试试。

这是空调遥控模块的单元测试。

注意,我们在树莓派上也连出五根线,分别对应以上五个接口。
但是,树莓派的电位是3.3伏,而空调面板使用24伏,不能直接对接,需要用转换电压的 Relay,电路示意图如下(摘自 这里 ):

(空调地线不用接,因为它们最终连到同一个 Ground:地面——字面意思,非冷笑话。

实物图(我用的是8通道 Relay,其实只用了其中三个通道):

最后,连入空调电路:

最后运行主程序,进行端到端成品测试(End to end test)。

祝你成功!

后续

1,设置静态IP:

sudo vi /etc/dhcpcd.conf

加上(第二行自选IP):

interface wlan0 static ip_address=192.168.X.X/24 static routers=192.168.0.1 static domain_name_servers=192.168.0.1

2,开机启动程序:

sudo crontab -e

加上:

@reboot sh /home/pi/PyStat/launch.sh >/home/pi/logs/cronlog 2>&1

3,我在做这个的过程中发现一个很棒的全栈方案,是下一个探索方向:

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览