数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 23087|回复: 166

[Arduino] 10块钱 建立自己的智能家居服务器,再也不用担心公司跑路倒闭了。

    [复制链接]
发表于 2021-4-4 19:30:31 | 显示全部楼层 |阅读模式

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

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

x
上次写了一个帖子,介绍了我家智能家居系统。
https://www.mydigit.cn/forum.php?mod=viewthread&tid=243315

其中自己搭建的服务器使用的是树莓派平台。由于树莓派确实有点贵,而且开发编译环境稍微复杂了一点,有网友提出是否可以用ESP8266或者ESP32作为服务器。我觉得这是一个好主意,于是我就重写了一套基于ESP单片机的服务器,并且将服务器代码和物联网节点端的代码全套开源了。

源代码在此:
https://gitee.com/fryefryefrye/O ... tomation/ESP8266Web

整套物联网系统的原理和架构,还是和上一个帖子里写的一模一样,想了解的同学去看上一篇帖子。唯一的区别就是树莓派被换成了ESP8266。

下面讲一下这次开源的这套代码的系统结构和使用方法。

1:操作面板的界面,是用一个html文件,放在了服务端代码下面的一个data文件夹。ESP8266自身带有文件系统,可以保存平时运行时所需要的文件。data文件夹的中文件,可以通过Arduino开发环境的一个插件上传到单片机的文件系统中。

可以参考下面网址的办法,安装文件上传插件,将html文件上传进ESP8266.

http://www.taichi-maker.com/home ... piffs/upload-files/

2:服务端的web服务。
a)如果请求主页,就把index.html发给客户端。
b)如果请求数据更新,根据节点发来的数据,返回一串用“,”隔开的字符串。
c)如果请求控制灯的开关之类的,就把控制结果发给客户端。

3:服务端的UDP数据处理就简单一点。接收节点发来的数据,存储之后,再发给需要发给这个节点的命令。

4:节点每秒上传一次自己的状态,并接受服务器发来的命令,如果有命令需要执行,就去执行以下。开源代码的节点功能是控制两个灯,只需要在ESP8266上再接一个双路继电器模块,就可以实现了。

5:服务器和节点共用的struct.h文件,这里面定义了两部分代码都需要的数据结构,常量等。


有了自己的物联网服务器,就可以发挥自己的想象力,实现各种各样自己DIY的物联网终端了。


打赏

参与人数 8家元 +178 收起 理由
2545889167 + 20
sbfqmq + 50 優秀文章
jf201006 + 20 謝謝分享
aardvark911 + 28
pcbboy1991 + 18 優秀文章
kkdkj + 20 謝謝分享!高大上,可惜水平有限弄不了.
懒虫包子 + 20 虽然看不懂,但感觉很高大上,顶一个,活了或.
kamp + 2 優秀文章

查看全部打赏

本帖被以下淘专辑推荐:

  • · MCU|主题: 24, 订阅: 19
 楼主| 发表于 2021-4-6 09:03:05 | 显示全部楼层
本帖最后由 fryefryefrye 于 2021-4-6 09:19 编辑
ploestar 发表于 2021-4-5 19:37
有点复杂啊,需要绑定MAC地址,如果添加新设备,要修改服务器端程序?缺一个文件#include "D:\GitHub\Private\w ...

那个配置文件里面写的是我自己家wifi的用户名和密码,你不需要的,注释掉这一行就行了。

如果你有多个“灯光控制器”,比如我给的这个例子,有三个。为了维护和扩展的方便,每个控制器的固件是完全一模一样的。怎么才能让服务器区分它们的序号,而不用在节点上配置数据呢? 在服务端维护一个MAC地址列表我觉得是最简单的方法。除非你愿意给每一个节点单独配置一个序号,上传数据的时候包含这个序号,这样服务器就不用搞MAC地址列表了。
根据我的经验,服务器的代码是需要经常修改的,比如想定时打开一个灯,我就会去修改服务器代码,而不是修改节点的代码。比如增加“灯全开”,“灯全关”的命令,也是只需要修改服务器代码就可以实现。

不过你都运行起来了,说明你都搞定了。这是我第一次见到别人把我的代码跑起来,有点小开心呢。

打赏

参与人数 1家元 +10 收起 理由
wenxueroom + 10 精彩回帖

查看全部打赏

回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-6 14:50:03 | 显示全部楼层
flishmen 发表于 2021-4-6 14:02
内网穿透,固定IP有解吗?

电信宽带,最简单,打10000号申请公网IP。然后自己搞个动态域名。
其他宽带运营商,自己想办法搞穿透吧,我不大懂。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-6 15:24:22 | 显示全部楼层
jjbboox 发表于 2021-4-6 15:10
没用的,现在公网IP地址是稀缺资源。
电信不会无缘无故免费给的。

至少4-5年前,本地的电信打个电话,就给公网IP。不知道现在怎么样了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-11 09:46:28 | 显示全部楼层
一缕阳光 发表于 2021-4-10 20:17
如果可以把不用的手机作为服务器就好了    现在家里都有换下来的手机 ...

手机充电/供电的问题就挺头疼的。还是一片15元的ESP32最适合。

而且Android编程比Arduino复杂多了。

不用的手机,是有屏幕的,适合作为控制面板,挂在墙上的。

本帖子中包含更多资源

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

x
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-4-30 12:05:30 | 显示全部楼层
本帖最后由 fryefryefrye 于 2021-4-30 12:55 编辑
muyan 发表于 2021-4-30 08:45
楼主server端代码可能有点问题,1个node没问题,然后测试接了2个node,结果第二个node怎么点击都没反应(节 ...

找到bug了。在服务器代码的269行。要改成:
m_WiFiUDP.write((const char*)(LightCommand + MacAddressId), sizeof(tLightCommand));

gitbee上的代码已更新。
https://gitee.com/fryefryefrye/O ... tomation/ESP8266Web

回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-30 15:51:09 | 显示全部楼层
本帖最后由 fryefryefrye 于 2021-4-30 15:57 编辑
muyan 发表于 2021-4-30 14:16
楼主好人做到底,再来一段显示客户端电量之类数据的代码吧

没懂你需要什么?
节点如果有更多的信息需要上传后在网页里面显示,
1:数据结构里面加变量,节点填充好之后上传。
2:在服务器的240行,把数据转成字符串,加进去,就可以显示了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-30 15:52:54 | 显示全部楼层
muyan 发表于 2021-4-30 14:13
本来想改成有开关指令再发送会更省带宽,否则一直在发送,但是同样多了些判断 ...

反正需要心跳包,服务器需要知道节点是否在线。 节点需要知道网络是否正常。所以干脆就一秒一次,一来一回。

我有的设备是GPRS在线的,就是10秒来回一次,有命令就立即发送。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-30 21:22:31 | 显示全部楼层
muyan 发表于 2021-4-30 17:11
就是你采集电压电流电量的,想着你已经做成模块了,就不想自己写了
无论这个项目是否完整化,总之还是要感 ...

你是说测量220交流电的电流电压的吗?  已经上传了。

https://gitee.com/fryefryefrye/O ... 66Web/node/ac_meter
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-1 13:25:54 | 显示全部楼层
本帖最后由 fryefryefrye 于 2021-5-1 13:37 编辑
muyan 发表于 2021-4-30 22:52
我用INA226测直流电流和电压,取得的数值是带小数的,回传过去变成整数了,哎,只能抄作业了
...

DC啊,你说清楚啊。我也有啊。不过我是INA219的,不知道协议是否兼容。

https://gitee.com/fryefryefrye/O ... 66Web/node/dc_meter

xxxxxx.xx 表示数据精确到两位小数,传输的时候 乘以100, 显示的时候除以100。

虽然现在ESP8266之类的计算能力挺大的了,但这是以前玩51的习惯。51如果引入一个float值,固件大小能翻2-3倍。计算性能估计也不怎么样。

其实这种电流电压表的数据读取之后,记录log,然后绘图才是最佳使用方式。用web也是可以实现的。
比如下图,就是电流曲线和电量曲线。



本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-1 22:18:17 | 显示全部楼层
muyan 发表于 2021-5-1 15:47
居然传的是整数的,不过我保留位数太多就没想到
219和226相通的,精度不同

有时候,我的一个物理节点,一片ESP8266,但是实现了两种节点的功能,就是像你这样,直接每秒发送两个UDP包就行了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-1 22:21:55 | 显示全部楼层
muyan 发表于 2021-5-1 15:47
居然传的是整数的,不过我保留位数太多就没想到
219和226相通的,精度不同

界面上的数据,还是全部写到表格里面,比较清晰。

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-1 22:28:32 | 显示全部楼层
muyan 发表于 2021-5-1 15:54
我有个并网光伏,还有一路离网的小玩具,并网的有采集器,离网的看不到数据,所以看到你这套东西觉得挺有 ...

我的服务端程序是运行在树莓派上的,树莓派可以把NAS挂载上去了,可以读写NAS上的文件。所以我的log记录是直接写进NAS文件系统的。

不知道ESP32能不能访问windows共享文件夹,打开文件之类的操作。

不过我前两天刚在ESP32上弄了个ftp上传文件,往NAS上上传文件,我看到上传的选项有append功能,应该可以记录log,就是可能速度有点慢。

短期的话,可以考虑直接记录在ESP自己的那个文件系统里。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-2 07:53:51 | 显示全部楼层
muyan 发表于 2021-5-1 23:18
写文件的方式,一开始考虑SPIFFS,但是刚才编译加了蓝牙串口,结果超容量了,一想这每秒记录的数据,就放 ...

https://gitee.com/fryefryefrye/O ... 66Web/node/esp32cam
这是我用带摄像头的esp32模块做的。拍照后储存TF卡,每1个小时上传一张到ftp。

问题是ftp上传一个文件,不管文件大小,整个流程至少要好几秒的,就算局域网,0字节文件,也要10秒左右。

你这一秒一记录,除非先存spiffs,然后一分钟上传一次发ftp。估计上传过程还会打断记录。

还是挂个tf卡算了,全部测试结束后,再把整个文件上传ftp。

其实我就算用树莓派往NAS里面写log数据,也就1分钟写一次,没必要一秒一次吧?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-2 09:06:04 | 显示全部楼层
muyan 发表于 2021-5-1 16:04
arduino第一次接触,直接库下载,还真方便,无论219和226都有现成的,直接拿来用就好了,所以主要还是在 ...

有了这套系统,你那种小液晶显示器,用处就不大啦,所有的数据都可以到电脑上或者手机上看。

我甚至连电动车上的电压电流电量,都用GPRS模块(10元的SIM800),上传到自己的服务器,也不用在车上搞个显示器了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-2 16:57:29 | 显示全部楼层
muyan 发表于 2021-5-2 10:17
我刚测试完,可以一直写,但是不关闭文件,又没法读,所以必须缓存再一次性写入,就是写入时会delay ...

我在树莓派上,用Windows共享的方式,每次打开文件,就写入一行,然后关闭。

所以不会影响其他进程的读取。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-2 22:51:53 | 显示全部楼层
muyan 发表于 2021-5-2 21:21
GPRS是2G的吧,上海这里联通2G关掉,导致以前买的儿童手表都没法用了,以后都会逐步关掉了吧 ...

联通是关了,移动的不敢关啊,所有的物联网设备都靠它呢,共享单车不算什么,自动售货机也可以无所谓,但是挖掘机,混凝土车,塔吊,这些都是贷款购买,每月正常还款,设备收到银行每月的指令才能运行。

回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-3 06:24:26 | 显示全部楼层
muyan 发表于 2021-5-2 23:14
原来如此
不过移动的套餐不如电信的,都办了电信的套餐了

这些设备,我都是上淘宝买小流量物联网卡啊,10-20元/年。每月几十兆流量。10秒发一个UDP包,够用了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-8 08:54:19 | 显示全部楼层
本帖最后由 fryefryefrye 于 2021-5-8 09:03 编辑
civilization 发表于 2021-5-7 23:28
楼主描述light节点的功能就是控制两盏灯。我买的ESP8266是8脚的ESP-01S模块+单路继电器模块。今天试着编译 ...

第1行到12行,就是注释,不用改。
ESP8266的开发板,有的板子是用GPIO号码标注的,有的是用Dx来标注的,这只是个对应表,方便查看。

你说的8脚模块,我没用过,我在网上查的,引出脚只有两个,分别是GPIO 0,GPIO 2.
好像是把14,15行改成 :
#define LIGHT_1_PIN 0
#define LIGHT_2_PIN 2
仅供参考。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-11 10:48:57 | 显示全部楼层
本帖最后由 fryefryefrye 于 2021-5-11 10:51 编辑
civilization 发表于 2021-5-10 18:55
今天开发板到货了。试着运行,发现个诡异的事。一开始light灯带节点发送给server的MAC地址居然对不上。宽带 ...

果然,我查了一下我的所有的节点,所有的ESP8266,代码读取出来的MAC地址  和  在WiFi网络上呈现出来的MAC地址的第一个字节,相差了 2 . 之前一直都没注意到。

ESP8266上,我是用这个函数取得MAC地址的。
WiFi.softAPmacAddress(mac);

再查查资料,这个取得的是软AP的MAC地址,作为客户端的时候,MAC地址是不一样的。应该用WiFi.macAddress() 获得真正的客户端MAC地址。我暂时没条件测试。你可以试试看。

感谢提醒。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-22 01:41 , Processed in 0.483601 second(s), 15 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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