数码之家

 找回密码
 立即注册
搜索
查看: 16367|回复: 107

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

    [复制链接]
发表于 2021-3-17 19:25:39 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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

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

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

整套系统主要结构如下:
1.jpg

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


控制界面是这样的:
2.jpg

控制界面的实现原理(使用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:用电功率监视器
淘宝购买“交流功率测量盒”。这个测量盒可以测量一台空调的功率,也能测量整个家庭的功率。 买三个组合起来,还能测量三相动力电的功率。上节所介绍的空调控制器,每台空调都配备了一个功率计。


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

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

4:挂在家里的天气预报/时钟(有人有兴趣的话,再详细写吧。)
1647323679.jpg
5:电动车充电控制器(有人有兴趣的话,再详细写吧。)

不同功能的界面:

1:家门口控制器(有人有兴趣的话,再详细写吧。)
173557i66g7ff2fhtf56h1.jpg
2:挂在公司的天气预报(有人有兴趣的话,再详细写吧。) 5.jpg













打赏

参与人数 8家元 +143 收起 理由
q__q + 10 謝謝分享
jjbboox + 20 優秀文章
懒虫包子 + 20 虽然看不懂,但感觉很高大上,顶一个,活了或.
tetgrt + 20 優秀文章
q155128 + 15 優秀文章
kkdkj + 20 謝謝分享
jf201006 + 20 謝謝分享
数码家园 + 18 这个太牛了,有技术就是玩的好.

查看全部打赏

本帖被以下淘专辑推荐:

  • · MCU|主题: 24, 订阅: 18
发表于 2021-3-17 19:42:28 | 显示全部楼层
大牛.厉害plus.
墙面的开关面板好像不是86型的.是20型的么求链接
回复 支持 反对

使用道具 举报

发表于 2021-3-17 19:43:51 | 显示全部楼层
能否跑Modbus ,这样就简单点, 跑步Modbus  TCP,无线Modbus  TCP
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-17 19:49:26 | 显示全部楼层
decai 发表于 2021-3-17 19:42
大牛.厉害plus.
墙面的开关面板好像不是86型的.是20型的么求链接

原来图片上是买的86型遥控面板,由于无法查询状态,不能可靠控制,已经被我淘汰。

现在是这样的,挂了一个接线盒,钉在墙上,盖住了86底盒的洞。

盒子里有一块ESP8266+3个继电器。控制3个灯。上面一个普通86开关做手动控制。

盒子角落还有个距离传感器,检测到人靠近后,发消息给平板打开屏幕。

另外还控制平板的充电,保持电量在70-80%之间(平板上有APP发送电量到树莓派服务器)。

3.jpg
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-3-17 19:51:03 | 显示全部楼层
hgq21102 发表于 2021-3-17 19:43
能否跑Modbus ,这样就简单点, 跑步Modbus  TCP,无线Modbus  TCP

懒的弄了,整套系统通信规则很简单,就定义一组合适的数据结构对发就行了,不搞通信协议了。
回复 支持 反对

使用道具 举报

发表于 2021-3-17 20:00:54 | 显示全部楼层
fryefryefrye 发表于 2021-3-17 19:51
懒的弄了,整套系统通信规则很简单,就定义一组合适的数据结构对发就行了,不搞通信协议了。 ...

走通信协议,开发难度降低很多,后期增加功能也很方便
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-17 20:28:11 | 显示全部楼层
hgq21102 发表于 2021-3-17 20:00
走通信协议,开发难度降低很多,后期增加功能也很方便

我本职工作就是干通信协议的,Modbus,T103,T104,DNP.都搞了10多年了。
我不觉得把这些协议栈搞进来有什么好处。
UDP也是一种通信协议啊,而且我就是要这种无连接协议。服务端就不用维持一大堆TCP/IP连接了。
回复 支持 1 反对 0

使用道具 举报

发表于 2021-3-17 21:34:25 | 显示全部楼层
楼主,就是强,非常有难度的。
回复 支持 反对

使用道具 举报

发表于 2021-3-17 21:40:13 | 显示全部楼层
请教一下,
1、你手机端不采用APP,那么如果手机端控制,是否需要用浏览器,来打开网页,来实现控制呢
2、如果在互联网情况下,怎样实现控制呢?
回复 支持 反对

使用道具 举报

发表于 2021-3-17 22:26:17 | 显示全部楼层
高端玩法,学不会
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-17 23:22:50 | 显示全部楼层
本帖最后由 fryefryefrye 于 2021-3-18 08:42 编辑
tetgrt 发表于 2021-3-17 21:40
请教一下,
1、你手机端不采用APP,那么如果手机端控制,是否需要用浏览器,来打开网页,来实现控制呢
2、 ...

Android 和 苹果 手机都可以把一个网址做成一个快捷方式放在桌面上。

所需要的操作就是按一下桌面上的图标,和APP一样。 就能自动打开浏览器打开控制界面。然后就可以操作。另外,操作界面里的每一个按钮,其实就是个不同的网址。其实可以直接将某个操作的网址做成快捷图标放在桌面上,比如“关闭所有空调”。解锁手机后,按一次即可。


互联网的话。电信的宽带打一个10000号,就可以申请公网IP地址。然后自己注册一个动态域名,路由器设置一个端口转发。 就可以在互联网上访问了。
回复 支持 反对

使用道具 举报

发表于 2021-3-18 06:05:38 | 显示全部楼层
这个太牛了,有技术就是玩的好
回复 支持 反对

使用道具 举报

发表于 2021-3-18 10:31:56 来自手机浏览器 | 显示全部楼层
土豪,这么多房间
回复 支持 反对

使用道具 举报

发表于 2021-3-18 12:21:23 | 显示全部楼层
hgq21102 发表于 2021-3-17 20:00
走通信协议,开发难度降低很多,后期增加功能也很方便

只要能连就必然有协议。
回复 支持 0 反对 1

使用道具 举报

发表于 2021-3-18 12:24:44 | 显示全部楼层
对空调控制和功率监测部分有兴趣
回复 支持 反对

使用道具 举报

发表于 2021-3-18 15:54:10 | 显示全部楼层
不是啊,你建个群,我就要搞你这一套!!!树莓派什么的我都有就是没有弄成一套。用别人的服务器终究是别人的。就是想搞成你这样的。
回复 支持 反对

使用道具 举报

发表于 2021-3-18 15:55:03 | 显示全部楼层
sim800的可以试试用2.4G模块呢或者lora模块。
回复 支持 反对

使用道具 举报

发表于 2021-3-18 15:55:35 | 显示全部楼层
太复杂,学不来,:sweat:
回复 支持 反对

使用道具 举报

发表于 2021-3-18 19:39:58 | 显示全部楼层
感觉这个需要不少的编程基础啊,看着楼主娓娓道来,其实工作量不少啊,对于对网络没有基础的人来说入门挺难哦。。。
回复 支持 1 反对 0

使用道具 举报

发表于 2021-3-18 20:59:29 来自手机浏览器 | 显示全部楼层
树莓派服务器所有数据处理用什么语言写的?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-20 01:04 , Processed in 0.327601 second(s), 16 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表