【新提醒】介绍我家的智能家居系统(原理细节详细介绍,关键部分开源)

 本帖最后由 fryefryefrye 于 2021-3-21 10:51 编辑

我家这套智能家居系统已经运行了很多年了,自我感觉不错,给大家分享一下。
也是断断续续开发了很多年,一下子不可能讲的很清楚,有兴趣的同学可以提问,我继续回答。

早年买了一些所谓的智能家居硬件设备,最后得到的是手机里一大堆APP,以及薛定谔状态的可用性。最后决定全部自己开发。

现在这套系统的优点:
1:全部自己开发,需要新功能,实现新想法,只要是可行的,就能做出来。
2:大部分功能通过局域网实现,不依赖互联网。只要家里有电,就能正常运行大部分功能(外网控制除外)
3:控制界面就一个,一眼看清所有设备状态,一键即可控制所需设备,无需在一堆APP中,一大堆页面中翻来翻去。

整套系统主要结构如下:

1:用ESP8266作为节点,每秒发一个UDP包到树莓派服务器,包含节点采集到的数据和状态(比如:温度,湿度,灯已开,灯已关)。
2:树莓派服务器收到节点更新后,回复一个UDP命令包,包含发送给节点的控制命令(比如:开灯,关灯),并缓存节点的IP地址信息。
3:树莓派另开web服务,手机电脑均可访问,可以查看状态,也可以控制,在家通过局域网访问,不依赖互联网,在外需要做一个端口映射(申请公网IP)。
4:收到web的控制命令后,立即给节点发送命令UDP包(之前已经缓存了节点IP信息),可以做到灯一按就亮,几乎无延时。

控制界面是这样的:

控制界面的实现原理(使用Ajax更新网页里的部分文字):
上图所示的控制界面是一个html文件,只需要加载一次。但是表格中的数据和状态都是每秒使用Ajax更新的。
流程大概是这样
a)浏览器请求 http://192.168.0.17/index   树莓派服务器直接返回一个html文件
b)html文件里面有脚本,每秒执行一次,发起请求  http://192.168.0.17/update
c)树莓派返回一串用“,”隔开的字符串。脚本会按照“,”分割,形成一个字符串数组。
d)把这个数组填个表格的相应部分。

这是html文件的一个简单的例子,我用来显示天气预报的。
https://github.com/fryefryefrye/ ... n/weatherindex.html

树莓派服务器实现原理(web服务):

上一段已经介绍了如何使用Ajax更新网页里的部分文字,其中重要的一点就是服务器需要自动生成一串用“,”隔开的字符串。
这个就需要在树莓派上编程实现。
由于我不喜欢使用现成的web服务软件,我就自己实现了一个最简单的web服务器。
流程大概是这样
a)创建一个socket,在80端口上监听。
b)连接建立之后,一般会收到一个类似“GET /index HTTP/1.1”的请求。
c) 根据请求内容,给予适当的回复,在回复实际内容之前,发送一个http回复的head就行了
const char HttpResponseHeadSimple[]   ="HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n";
d)上面那个头部,最后两个回车之后,就可以发送实际数据了,不管是一个html文件,还是“,”隔开的字符串,都可以。
e)发完就可以关闭socket,等待下一个连接请求。

树莓派服务器实现原理(UDP数据交换):
为了定义节点与服务器交换的数据格式,我写了一个共用h文件,即被Arduino节点的程序包含,也被服务器的程序包含。
这个h文件里定义数据格式,例子如下。
struct tMeterData
{
        unsigned long DataType; //data type = 5
        unsigned long Mac[6];
        unsigned long Power;                //xx.xxxx W
        unsigned long TotalEnergy;                //xxxxxx.xx kWh
        unsigned long Volt;                        //xxx.x v
        unsigned long Current;                //xxx.xxx A

};

struct tMeterCommand
{
        unsigned long Triger;
        unsigned long On
};

这是一个交流电功率计的数据格式的例子,所有的数据都是用的4字节长整型,以免不同的平台的字节对齐问题。
上传数据的第一组是数据类型,用来检测是哪一种设备发来的,其他的就是数据更新。
下发的命令是每秒都会回复的,当作心跳包。但是没有实际操作请求的时候,triger = false。
如果真的要操作,就设为True,表示这是一个需要执行的命令,节点就会根据下发的数据执行相应的操作。

不同功能的节点,其实很多,我介绍几个大家比较能用的着的:

1:房间灯光控制器
双控一盏灯,既能传统的手动控制,也能用网络控制的方法。
用ESP8266+继电器做一个控制器,就可以通过网络控制这个继电器。
然后单片机一个引脚接出来,接一个普通墙壁开关。单片机程序写一下,这个开关的状态变化一次,就把继电器的状态变一下(不用管开关到底是开,还是关,只检测开关的变化)。这样不仅仅可以传统手动控制,而且手动控制之后的状态,也可以通过网络看到。

2:房间空调控制器
改造已有的空调,让其能继续使用普通遥控器遥控,也能使用网络控制。而且使用遥控器控制的结果,也能通过网络查询到.

a)通过单片机控制空调:买一个2毛钱的红外发光二极管,接在ESP8266的一个引脚上,另一脚接地。用Github上的库,即可发送命令控制空调。
b)监控空调的工作状态:找到空调遥控接收板上的红外接收管,找出数据线,焊接出来,接在ESP8266的一个引脚上,在这个脚上打开外部中断,用Github上的库分析即可。不管是通过网络控制,还是遥控器控制,这样都能取得空调工作状态。
c)监控空调的当前功率,可以更加确切的查看当前空调。而且可以查看累计耗电量,参考下一节。

3:用电功率监视器
淘宝购买“交流功率测量盒”。这个测量盒可以测量一台空调的功率,也能测量整个家庭的功率。 买三个组合起来,还能测量三相动力电的功率。上节所介绍的空调控制器,每台空调都配备了一个功率计。

测量结果通过TTL串口读取出来,功率,电流,电压,电量这些信息都有。

为了统一节点的代码,上传的数据中还包含了ESP8266的MAC地址,这样每个测量节点的代码都是一样的,只要在树莓派里做个MAC地址列表,就能判断从那个节点发来的。

4:挂在家里的天气预报/时钟(有人有兴趣的话,再详细写吧。)

5:电动车充电控制器(有人有兴趣的话,再详细写吧。)

不同功能的界面:

1:家门口控制器(有人有兴趣的话,再详细写吧。)

2:挂在公司的天气预报(有人有兴趣的话,再详细写吧。)

(0)

相关推荐