Arduino上的“智能家居”,用于更衣室



没有什么不同寻常的,只是另一个Arduino控制器。 带有传感器,卷轴和网页。 但是,由于其自​​身的特点和非常具体的实际应用,尽管很平庸-在该国偏远地包含了电暖气。 标头中的引号不是随机的,控制器在当前版本中不是智能家居,但可以作为一个良好的基础。 (请注意-该短语是根据评论于04/12/18添加的)。

主要特点:

  • 电网参数传感器-符合RS-485的电表“ Neva”;
  • 远程修改SD卡上的控制网页;
  • 长线可靠地包含一组达拉斯温度传感器;
  • 不涉及云服务的参数变化图;
  • 故障安全解决方案(外部看门狗,UPS,路由器自动重启);
  • 保护互联网屏蔽层免受功率继电器干扰时的冻结;
  • 在DIN导轨外壳中的完整设计。

我作为娱乐系统慢慢地做了这个系统,时不时地将项目投入数月的时间……从构思到实施大约花了一年半的时间:)

从那时起,我就不再从事微控制器的业务了,所以我开始使用带有速卖通的入门套件,玩弄LED,按钮和传感器,了解到什么,然后开始构建用于远程控制和监视的控制器。 好吧,“智能家居”不是直接的,而是类似的东西。

首先设定了实际目标-远程打开该国的暖气。 我还没有盖房子(双手没伸,呵呵),但是我有一个舒适的夏日小屋 ,里面有用电子对流器加热的碎肉。 对更衣室进行热身,在星期五星期五的一周中,这些更衣室已经冷却下来-在寒冷季节这是一个非常诱人的机会。

但是,事实证明,远程负载控制的任务相当琐碎。 Arduino加上Internet防护罩,来自Internet的现成草图,并且卷轴已经从网页上的选中标记中单击。 实际目标是通过某种方式快速,简单地实现的。 真无聊。 我想要一些更有趣的东西。

我为自己设定了第二个实际目标-监视夏季小屋网络中的电流消耗。 我得到了毫不客气的电流传感器进行测试,在周围玩。 一切正常,但此选项不适用于战斗工作。 我找不到比5A更强大的传感器,但我至少需要25A。

我想到了将电表用作功率传感器的想法。 这是一个好主意! 我创建了这样的设备,发现它很好! 并非没有困难,但是我感到非常满足,因此我完美地完成了此任务,下面我将告诉您:)。

功能性

“智能家居”控制器的第一个(也是最后一个)实战版本具有以下功能:

  • 通过浏览器远程手动控制功率继电器激活并监视其当前状态;
  • 远程监视三相电源网络的参数(电压,电流,频率以及更多不必要的垃圾,我稍后将其关闭);
  • 远程监控两价电表的读数;
  • 远程监控一组温度传感器;
  • 在存储卡上记录数据并记录事件;
  • 在浏览器中以图形形式显示所选日期所有传感器的数据。

意识形态

构建整个系统的原理-无需使用第三方云服务以及数据收集和显示服务器。 这既不是好事也不是坏事。 在“智能建筑”的初始阶段,这种方案是足够且简单的。 尽管它对使用施加了某些限制。

具有Internet防护的Arduino是系统中唯一的Web服务器。 具有管理界面的网页存储在Internet存储卡上,并在通过指定IP地址访问时将其传输到浏览器。 用户界面与Arduino的进一步交互是通过Java脚本进行的,该脚本的主体未嵌入网页中,而是通过Internet访问存储在我的家庭文件存储中。 这种方法减轻了网页的重量,从而加快了从SD卡的读取速度,并使您可以更快,更轻松地修改脚本代码。

根据请求(按浏览器中的按钮),从存储卡读取用于显示图形的数据日志。 数据仅显示在浏览器页面的当前会话中,不会保存在任何位置,并且当您重新加载页面时,必须再次读取它。 这是一种思想上的缺点,因为从存储卡中读取数据的速度相当慢,并且每天获取数据量可能需要一到两分钟的时间(有一种想法是重新设计数据存储格式以减小其大小并加快读取速度)。

传感器的当前值显示在页面上,并以环路周期频率实时更新,我所拥有的约为1 Hz。

现在,算法中没有“智能”。 我是否将来会建议使用该算法-我不知道,目前我对当前版本完全满意。

网络拓扑

在小屋中,移动互联网Yota(usb调制解调器+ wifi路由器)。 没有固定的IP地址,即使有钱也无法获得。 甚至没有动态的白色IP地址,因此DynDNS不适用。 只有Yota内部网络的灰色IP地址。 IPota Yota不支持(至少在2017年是这种情况)。 因此,我发现只有一种从外部到达乡村路由器的方法-VPN。

在家里(在城市中)具有白色固定IP地址的有线互联网。 路由器,然后是网络存储。 在此家庭路由器上已建立了一个VPN服务器。 国家路由器配置为提升到本地路由器的PPTP VPN隧道。

Arduino上的控制器连接到国家路由器的LAN端口,并位于NAT后面,第80个端口转发给它。 因此,我只能从我的VPN访问Arduino。 因此,我拥有的家庭局域网和VPN是同一子网的两个网段,直接访问那里。 在工作的办公计算机和智能手机上,他建立了VPN连接,还可以访问Arduino。 使用不是很方便,但是可以。 是的,并且提供了相对安全性-未经我的VPN的授权,没有其他人可以进入控制器管理页面。

瓶颈是通往国家路由器的VPN隧道。 定期下降。 而且,是PPTP连接被拆除,互联网访问仍然存在。 最令人讨厌的是,当PPTP连接断开时,它不再自行上升。 即使重启路由器也无法保存。 仅使用USB调制解调器完全重启其电源,然后不立即重启。 您需要将其关闭,等待10分钟,然后再次打开。 幸运-很好,不-下一次迭代。 根据Zyxel的技术支持,原因是蜂窝运营商阻止了PPTP数据包,因为一侧正确发送,另一侧正确侦听,但数据未到达(我在VPN隧道的两端都有Zyxel路由器)。 尤塔(Yota)似乎应该受到指责,但要从他们身上获得可理解的目标是不可能的。 也许不是Yota。

看门狗

为了确保VPN能够相对平稳地运行,我使用了拐杖程序看门狗-乡村路由器通过Arduina控制的电源继电器供电,并且VPN服务器停止ping(也可以ping Arduina)后,在10分钟后路由器的电源断开了10分钟,然后再次路由器它将打开,并有望在5分钟内建立PPTP连接。 如果没有连接,则进行下一次迭代。 有时,这种化合物可以稳定工作数周甚至数月,有时它几乎每天都开始破裂。 根本没有其他解决问题的方法。 正如我已经说过的,Yota不支持IPv6,它不向物理学家提供白色IP,也不会向其出售白色IP,没有其他提供商具有正常的关税,当然也没有无限的流量。 但是,这个决定虽然是拐杖,但执行任务却很好。 现在,到重新启动时,除了很少的例外,我一直都有连接。

除了软件,我还实现了硬件看门狗。 以防万一。 在没有我的情况下,控制器应该工作数周甚至数月,并且不要挂起。 我不知道所有这些经济如何表现出很大的缺点,所以我很安全。 Atmega内置的看门狗对我不起作用,因为我根本没有“开箱即用”在Arduino Mega上工作,要使其正常工作,我必须有很多乐趣。 这个问题在这里很好地描述 。 此外,他的最大间隔为8秒,在我看来这还不够。 因此,我使用了专用的看门狗芯片TPL5000DGST,其间隔由三个引脚组合设置,可以达到64秒,非常适合我。 对于这个芯片,我买了一块小面包板,焊接了它,并用Arduina的IO端口将其固定在连接器上(照片在组装部分下面)。 测试显示了该看门狗的可靠运行,我想知道它在现实中会运行多久。 为此,我在程序代码中添加了一个变量,该变量存储了程序启动的时间和日期,并且此信息显示在控制网页上。 实践证明,与VPN不同,该控制器可以长时间正常运行,并且看门狗定时器从未有用(在撰写本文时,它确实是第一次工作,但没有白费)。 连续运行时间超过3个月,如果我不需要不时更正代码中的某些内容并重新刷新控制器,则可能需要更长的时间。

供电网络参数传感器-Neva电表


如上所述,我认为没有什么比带有外部数据访问接口的现代数字电表更好,更精确的了。 我选择了带有RS-485接口的圣彼得堡公司Taypit的Neva计数器。

我强调指出,正式禁止将带有第485接口的电线永久连接的电表用作电表( 更新他们评论中建议允许使用)。 因此,在山寨电网中,我串联了两个计数器。 第一个是位于街道入口面板中的经过密封并注册的官方电表。 第二个是我的电源传感器,没有密封也没有说明,这是能源销售公司不关心的,因为它并不关心在计量设备之后安装的所有设备。 该电表已经位于更衣室内部的面板中,并且在同一面板中,Arduino上也有一个控制器,但稍后会介绍更多。

在平房里,我有一个三相电源网络。 在城市中,我只能在单相上进行调试。 因此,我购买了两台电表,即三相Neva MT-324和单相Neva MT-124。 控制器的初始调试是在桌上的三相计数器上进行的,三相计数器连接了一个单相,然后按作战模式将其定期安装在dacha防护罩中。 桌子上便宜的单相计数器已经完成了对后续软件修改的调试:



要将仪表连接到Arduino,需要一个RS-485到TTL电平转换器:


另外,要使用计数器,您需要在Arduino上有一个免费的串行端口。 不幸的是,Arduino Uno只有一个串行端口,如果将其放在柜台下,您将不得不丢失文本信息的调试输出(端口监视器),否则,将无法编写草图。 因此,我使用具有多个串行端口的Arduino Mega。 可以通过Arduino的数字端口实现第二个串行端口softovo,但是我没有找到合适的库来更改速度以外的其他端口设置。 计数器端口设置与默认设置不同:9600比特率,7个数据位,1个停止位,奇偶校验控制-甚至。 幸运的是,Arduino中的标准Serial对象允许您进行这些设置。

与计数器交换协议相对容易- 公共领域的计数器制造商提供了一个用于在Windows下读取参数的程序,该程序还具有端口监视器。 要将仪表连接到计算机,我使用了MOXA 232/432 / 485USB接口转换器。 需要一些时间来对软件包进行可视化分析-我选择了主要命令。

但是,这对我来说似乎还不够,因此我通过电子邮件与制造商联系。 在与Typit进行了一个月的通信之后,我终于设法获得了带有解释的命令的完整列表:

参数编码MT3XX E4S
参数编码NEVA MT124 AS OP(E4P)

更新10.28.2019 :命令说明。 表中的命令以文本字符表示。 也就是说,它的成本为0(零),您需要发送0x30。 点和星号是美丽的分隔符,它们毫无意义,您无需发送它们。 在命令末尾,将添加一个校验和字节,该校验和字节是在考虑了表中未显示的命令前缀和后缀的情况下计算出来的。 所有读取命令的前缀为0x01 0x52 0x31 0x02。 此后缀为0x28 0x29 0x03。 但是,没有必要发送前缀,并且后缀似乎是必需的。 示例:日期读取命令09.09.02 * FF。 实际上,您需要传递文本字符代码000902FF。 即0x30 0x30 0x30 0x39 0x30 0x32 0x46 0x46。 添加前缀和后缀,我们得到的集合是0x01 0x52 0x31 0x02 0x30 0x30 0x30 0x39 0x30 0x32 0x46 0x46 0x28 0x29 0x03。 我们将所有字节减去1的校验和读取为xor,并在末尾添加接收到的字节。 前缀被丢弃为可选。 结果,我们将此发送到计数器-0x30 0x30 0x30 0x39 0x30 0x32 0x46 0x46 0x28 0x29 0x03 0x68。 交换周期的开始之前必须有交换初始化命令,在下面的草图中,这些命令标记为//开始1、2、3。一旦初始化交换,就可以在周期中任意长的时间内从计数器读取数据,但是会丢失通信,并且也许在由于其他原因长时间缺乏交换之后,需要重新初始化。

此外,技术问题是在Arduino下编写一个参数轮询周期,并在端口监视器中将其显示给启动器。 一个周期的时间大约是一秒钟。 但是,在将数据记录到闪存驱动器并轮询温度传感器的项目的最终版本中,该时间增加到4秒。 这一点根本不适合我,因此不得不投入优化。 结果,我再次获得了第二个间隔而又不失去功能。 顺便说一句,我从头开始草拟了两到三遍草图,直到找到合适的体系结构和经济的算法。

与柜台交换的软件实现

该代码是从我的大型工作图的上下文中剥离出来的。 已编译,但是以这种形式,我从未运行过它。 我仅作为示例,而不作为完成的工作程序。 尽管从理论上讲,一切都应以这种形式工作。

该代码是同时为两种类型的计数器(单相MT-124和三相MT-324)编写的。 计数器的类型是通过初始化命令的响应字在程序中自动选择的。

我按原样引用该代码,没有任何美化,除了我自己写的注释之外,没有其他注释。 是的,我不是程序员,我甚至都不学习它,因此您不应该因为代码的质量而踢我,但是您可以学习编码方法: EnergyMeterNeva.ino

电表的一大额外优点是可靠,准确的实时时钟。 我不必为系统提供额外的模块,无论如何,仍然需要找到高质量的模块。 当前时间精确到我从计数器获得的秒数以及其他数据。 是的,相对于原子时间,计数时间略有偏移(几秒钟),我不知道它的含义是什么,或者工厂设置不佳或其他原因,但是精度很高,只是有一点偏差。

在极少的情况下,当小屋的电源关闭并且电表不可用时,我会从Arduina的内部计时器获取当前时间。 当电表工作并且其数据可用时,我将每个循环回路中电表的值重写为Arduina的内部计时器。 当计数器下降时,当前时间将继续在Arduina计时器上计时。

除了读取参数外,当然还可以对计数器进行编程。 也就是说,该接口可用于读取和写入。 但是,由于这样的困难,我试图获得一种协议来读取命令,而我什至没有向制造商暗示过有关记录协议的要求。 首先,我只需要一点时间就可以移动它。 其次,我怀疑该数据不再公开,因为它可以用于欺诈目的。

温度传感器

我已经较早的时候通过一个草图示例对温度传感器进行了测试。 现在只剩下将调查嵌入到主项目中了。 这并不困难。 当我并行接通1-Wire时,我使用的所有九种传感器都没有问题。 它们之间的读数范围约为0.5度,这表明以0.0625度的最大精度使用它们毫无意义。 我将用于测试的传感器收集在一个包装中,然后将其包裹在几层粘性聚乙烯中。 为了获得更高的精度,我将包装垂直放置并等待一天以完全平衡温度。 并非所有传感器的读数都相同。

但是,我并没有开始破坏转换传感器本身温度的准确性。以编程方式对读数进行四舍五入比较容易,而且由于我想出了一种算法,该算法的转换超时不是一个无用的延迟(750),所以我从调查时间中也无法获得好处。与传感器配合使用的通常逻辑是,首先发出命令以开始温度转换,然后等待转换完成(最小相同的750 ms),然后读取数据。我做了相反的事情,这使我可以排除一个空的等待间隔-首先,我从传感器读取数据,然后立即开始转换。尽管在LOOP周期中所有其他代码都将起作用,但是数据只是有时间准备在下一轮读取。及时地,在这种情况下,我从传感器那里获得了数据-循环周期大约为1-1。5秒,但这绝对不是关键。

有时我从所有传感器收到数据“ 85”或“ 0”。我不知道这是什么类型的门,所以我检查了代码,并从结果中排除了此类数据。在其中一个传感器上发现另一个门框-电源关闭时他没有保持设置。他的内部闪存驱动器已坏,或者其他原因。因此,在设置中,我注册了传感器的设置,现在,当电源打开时(如果仍然消失),可以保证配置了所有传感器。

我使用一个草图示例获取了特定传感器的地址,在某个地方进行了挖掘并进行了一些修改:DS18x20_Temperature.ino

之后,我用数组中的常量对地址进行了评分,然后在主程序中,我立即将传感器转到其地址:TempSensors_DS18B20.ino

为了使1-Wire总线上的传感器正确工作,必须在数据线和电源之间安装一个4.7kΩ的上拉电阻。对我来说,在接线端子的引脚之间焊接一个SMD电阻很方便,但是在合适的情况下,我发现只有5.1 kOhm的电阻就可以放了(在电路板底部组装部分的照片中可以看到)。一切正常。

我的温度传感器在一根长线上(+5,接地和数据)并联电连接,全部9根,但是比较棘手。物理上,双绞线电缆通过星形连接,以方便在对象周围布线传感器。我在每个电缆臂中使用两对电缆。一对是传感器电源。第二对是一条数据线,它通过一根导线到达传感器,然后通过第二根导线从传感器返回。因此,可以将带有星形的电缆与屏蔽层分开,但从电气上讲,它仅是星形的电源,根据数据,它是一条线。事实证明,此连接选项在处理长线路时更为可靠,而通过简单的并行连接,读取数据时会出现很多故障。这是这种方案的示意图:



我没有缩短传感器本身的三线电缆的半米长尾巴,而是按原样连接了它们,事实证明这并不重要。

机舱总共有三根电缆,两根用于外部传感器,每根各一根,其余所有七个内部电缆。这七个内部传感器以相同的方式连接,但在一根长电缆中且从中有短分支(请参见草图中的下部T形)。在某个地方,传感器的标准半米尾巴足够分支,而在同一对双绞线的帮助下,它分支出来。

两线制传感器开关电路,具有所谓我没有使用寄生电源(当传感器通过数据线接收电源时),因为...为什么?无论如何,我都会选择四对电缆,因为我有它们。将电缆放置在机舱中没有问题。而且,寄生电源电路对于某些工作模式下消耗的电流量至关重要,可能会引起不必要的问题。

机舱中双绞线的总长度约为25米。用于外部传感器的部件-5和10米,以及一个十米的内部部件,带有用于七个传感器的分支。一切都几乎完美。仅偶尔出现破折号而不是温度值。这意味着未正确读取来自特定传感器的数据。但这很少发生(我可能每月注意到一次),不会引起任何问题。购买了

远程访问

以太网防护罩,用于远程访问Arduino。有了一个内置库,就像Arduino中的其他所有库一样,使用它很简单。

从功能上讲,我的工作方案如下。在Arduino上提出了一个Web服务器,当客户端(浏览器)访问它时,它会生成一个包含各种信息的网页。页面上的数据自动更新是通过使用JavaScript通过计时器轮询服务器来实现的。

该页面还具有一组控件,用于控制连接到Arduino的执行器-切换负载的功率继电器-电加热器和照明设备。

我对网页的设计并没有费劲,尤其是因为需要最少的文本数据来更快地加载它,因此,最原始的html就是这样:



我将数据而不是数据嵌入到html代码中,当服务器生成页面时,这些标签会实时替换为实际数据。当应javascript请求自动更新数据时,会将数据直接以JSON格式从微控制器传输到浏览器。

页码位于存储卡上的文件中,并在访问服务器时从中加载。为了更快,更方便地修改页面代码,我建立了自己将其更新到其中的机制。在基本控件块下方,有一个文本框和一个Submit按钮。我将新的html代码复制到文本字段中,按一下按钮,然后Java脚本将数据发送到控制器的网络服务器,然后将其首先保存到假脱机文件中。如果传输成功,则将主文件替换为缓冲区,页面将自动更新。仅此而已。接受更改。

我引用了该机制实现的代码片段。
在html页面中,我们嵌入了表单:

<script type="text/javascript" src="http://domain/send_HTM.js"></script></pre> <pre style="font-size: 14px;"><form> <br><br> CONTROL.HTM:<br> <textarea cols="100" rows="20" wrap="off" id="htm"></textarea><br> <input type="button" value="" onclick="send_HTM();"><br> <div id="progress" style="display:none"> <div id="label">  :</div> <div style="width:800px;border:1px solid #000"> <div id="bar" style="background:#00f;height:10px;width:0px"></div> </div> </div> </form> 

“发送”按钮将启动以下Java脚本: send_HTM.js

在用于通过请求'CONTROL.HTM'(开始发送文件),'htmlineN'(发送行号)和'END_CONTROL.HTM'(发送文件结束)中的前缀处理Web服务器请求的功能中的草图中,我们确定以下操作:

 File acceptHtmFile; ................ if (fl_accept_htm) //  'CONTROL.HTM' { SD.remove(CTRL_HTM); acceptHtmFile = SD.open(CTRL_HTM, FILE_WRITE); //     if (!acceptHtmFile) //      -    { #ifdef DEBUG_SD Serial.println("SD-card not found"); #endif client.print("FAIL"); client.stop(); } else client.print("OK_OPEN_FILE"); acceptHtmMode = true; break; } if (fl_htmline) //  'htmlineN' { int b = acceptHtmFile.println(tag); if (b == 0) { client.print("FAIL"); acceptHtmMode = false; cntHtmModeIteration = 0; } else { client.print("OK"); } cntHtmModeIteration = 0; break; } if (fl_endhtm) //  'END_CONTROL.HTM' { SD.remove(CONTROL_HTM); acceptHtmFile.close(); File htmlFile = SD.open(CONTROL_HTM, FILE_WRITE); //    acceptHtmFile = SD.open(CTRL_HTM); //    for (int i = 0; i < acceptHtmFile.size(); i++) { digitalWrite(PIN_WATCHDOG_DONE, 1); htmlFile.write(acceptHtmFile.read()); digitalWrite(PIN_WATCHDOG_DONE, 0); } acceptHtmFile.close(); htmlFile.close(); client.print("OK_CLOSE_FILE"); acceptHtmMode = false; cntHtmModeIteration = 0; break; } 

CONTROL_HTM和CTRL_HTM此处定义的是html文件的名称。 第一个是主文件,第二个是缓冲文件。 从请求中选择接收到的字符串的文本在标记char数组中。 逻辑如下:接收数据时,将它们写入假脱机文件,在接收结束时,假脱机文件在主文件中被覆盖。 我仍然不明白如何简单地重命名文件,SD标准库没有这样的功能,所以逐个字符进行愚蠢的复制会花费很多时间。

将控制网页的代码而不是存储在控制器的存储卡上,而是存储在客户端计算机上,或者从某些外部资源下载,将很方便。 但是禁止跨域请求不允许这样做。 JavaScript只能将请求发送到加载它们的北方。 在这种情况下,可以从任何地方加载javascript的主体,这仅是从其加载调用页面的地方很重要。

资料记录

以太网屏蔽板上有一个micro-SD卡插槽。 由于它的存在,我决定将数据写入日志文件。 要使用存储卡,还有一个内置库,用它来管理文件的读写通常是基本的。

为了节省数据量,我构建了日志记录算法,以便仅在数据变化超过预定阈值时才发生记录。 对于温度为0.1°,对于电压为0.2V。 一天的数据写入一个文件中。 在零时创建一个新文件。 我选择了带分隔符的纯文本格式,以便您可以在调试期间快速控制文件的内容,并且可以轻松地将其加载到Excel中。

设计限制不允许您方便地插入/取出存储卡,因此我使用了大卡。 根据我的计算,它会被填充几年,然后需要拆卸外壳,取出存储卡并清洁它。

我看不到记录代码的意义,那里的一切都微不足道-文件中文本的陈旧记录。 而且此代码分布在整个草图上(不仅记录了传感器的参数,而且还记录了各种一次性事件),很难隔离。

图表

作为制图引擎,我使用了高度灵活的amavart javascript可视化库。 该库是免费的,可以下载和脱机使用。 我还在永久访问Internet的NAS上找到了这个库。 以默认设置连接和使用它并不困难,但是,为了获得所需的视图,我不得不进行很多修改。 该站点上的大量示例以及详细文档的提供帮助。

例如,我将给出进度表绘制的javascript。 就它本身而言,它是无用的,因为它只能与Web服务器和html页面一起使用,并且可能与其他脚本绑定在一起(很久以前,我不记得所有的细节了)。 但是其中包含了我的图表的外观设置,您可以从那里获取它们: get_log.js

amchart库的最大优点是它可以从残破的数据绘制正确的图形。 如上所述,我仅在数据更改时保存日志。 也就是说,这是异步和随机发生的。 可能在几分钟内没有新数据,然后在几秒钟内它们将更改几次。 因此,日志中的条目以任意时间间隔进入。 Amchart在渲染时会自行考虑这一点,我无需在渲染之前对数据进行插值。 我只是按原样发送数据数组,并且看到了一个时间均匀的漂亮图形。

我发现该库只有一个缺点-它不知道如何(好吧,或者我还是不了解)如何人工更新实时图形。 您可以将新数据添加到现有数据中,但是每次完全重绘整个数据阵列时都会进行重绘,这大大降低了浏览器的速度。 但是,从Arduina读取数据以按需从浏览器进行渲染的意识形态因其非最佳性而存在缺陷,因此没有必要争夺实时快速更新。

正确的解决方案是组织一个单独的服务器来存储和可视化数据,其中实时从Arduina那里删除一些数据并将其存储在数据库中,然后可以从那里将其快速发送到浏览器中以进行可视化。

现在,图表看起来像这样(在当天的例子中,没有人在更衣室里,因此没有能源消耗)。 当出现当前数据时,将自动设置比例尺,以便所有内容都能很好地匹配,并且当前水平的值将显示在垂直轴上:



图表显示在进行控制的同一页面上,就在主控制块的正下方。

由于某些原因,我无意提供完整的项目资源:

  1. 它无法像在我的以外的任何网络上一样启动,因为我没有尝试使该项目具有可移植性,并且它与我的地址和网络拓扑紧密相关。
  2. 我确信该项目的总体思想会遇到很多问题,因为这是我在我不擅长理解的领域中的第一次尝试。 因此,我不会以这种形式向任何人提议重复整个项目。 我只分享那些我不太自信的时刻。
  3. 该项目已经完成了很长时间,而且已经很长时间了,我永远不会记住所有细节,也无法解释许多解决方案。 草图的体积非常大(按照我的标准,大约2千行),有十多种服务于Java的脚本,我没有绘制示意图。 也就是说,我不能不就大多数问题提供咨询。

组装方式

从一开始,我就为自己设定了目标-制造完成的设备,而不仅仅是桌上摆满一堆张贴品的布局:



并立即决定我要将设备放置在电气面板内。 有食品,有柜台,总的来说很方便。

为此,需要一个dinrek案。 起初,我想到了将其开发并在3D打印机上进行打印的想法。 但是我没有自己的3D打印机,而我的同事在使用自组装打印机进行打印时,其外观质量完全不适合我。 我在出售的各种尺寸的DIN导轨上发现了现成的箱子 ,它们看起来不错,使用方便(可折叠),并且还有一个现成的盲卡

我购买了最大的外壳,这样不仅可以将带有Internet屏蔽的Arduino装入其中,还可以使用继电器来切换负载:









接下来是一个漫长而有趣的过程,将所有牛肚安装在表壳中。 在这项业务下,我什至还购买了一款具有睡眠功能的绝妙电烙铁(我以前的烙铁仍然来自苏联时代):



为了安装,我买了一堆各种架子,螺丝,垫圈和螺母。 第一配件装配:





要将电线连接到上部触点,必须使用弯曲的销钉,否则它不适合装入外壳中:



绝缘垫圈必须在以下位置切割:



在某些地方,它会弯曲得更直一些,抬起套筒上的螺钉,并精心修剪套筒:





对于一个单独的循环,没有足够的枢轴点,因此它仅挂在两个点上:



装配有接线端子的组件:



然后工艺开始逐渐成长为金属丝。 该板仅用于电源接线和连接到端子块。 对于信号连接,我使用了MS-16线(我更喜欢它),因为电源没有通过电压(最高100 V),因此MGTF:



我将LED安装在前面板上,将限流电阻器直接焊接到LED的腿上,并通过热收缩将其关闭:



结果,我们得到了这样的胡须填充:



这是一条带有看门狗微电路的围巾,它位于我的创作中,就位于RS-485-TTL电平转换器的上方:





整个结构可折叠,无需焊接即可将其拆下,断开和更换,除了带有猫眼的围巾外,它还焊接在连接器的引脚上,并穿插在Arduina的多个IO端口中。

在框中:



我在外壳的塑料壁上切开了Arduina连接器的开口。 首先,我完全根据连接器的尺寸制作了孔,但是必须对角地开始组装到外壳中(否则,它就无法工作)并且连接器无法通过,我不得不浪费一些时间:



打开桌上的成品,一切立即生效:





在前面板上带来了:

  • 四个红色LED-负载指示;
  • 两个绿色-与计数器和VPN服务器通信;
  • 两个黄色的备用;
  • 一个黄色-表示路由器重新启动;
  • 红色是营养;红色是营养。
  • 和一个重置按钮。

为了从220V中减去5V,我使用了带输出电平调整功能的Dinerey电源,电源直接提供给微控制器,旁路了7-12V至5V的输入转换器。 之所以方便,有几个原因。 首先,内置转换器的功率在某些时候还不够,那里的电流是有限的。 其次,仍然有必要为继电器提供5伏电压。 第三,破折号是方便安装的dinrek尺寸。 因此,这里:




测验

一切都已在桌子上打开,一切都按预期进行,是时候将控制器安装在防护罩中并在战斗模式下进行检查了。

但是首先,我将所有部件都“连接在鼻梁上”,将所有的三脚架推入另一个低电流屏蔽中,以实际条件在铺设有220V电源电缆的一个电缆通道中的长线上测试温度传感器:



如您在上面的照片中所见,到目前为止,我一直尝试使用“智能” Senseit插座通过电源控制路由器的重启。 但是,这款设备的成本却高达5,000英镑(2016年),事实证明该设备非常容易出错。 在使用的那一年中,它一再迫使我不合时宜地赶到小屋,以手动从GSM通信的深层缺点中消除这种工程和营销思想的奇迹。 转换为我的Arduino控制器后,事实证明它比示例更可靠,让我很轻松地将这个“专业”垃圾放到一个漂亮的盒子里,然后就忘了。



测试成功,没有失败,并且可以在常规位置进行最终安装:



是的,这是盾牌ABB TwinLine 800x300x225 IP55,价值25,000卢布。 没有填充(并填充约一万五千)。 是的,它安装在6x2的更换屋中。 每个人都有自己的蟑螂。 是的,我自己收集了所有电器 。 而且他也盖了更衣室,是的。 不,我不是电工。 而不是建设者。



在屏蔽层的深处,我找到了一个小型不间断电源Powercom WOW 300 ,其绿色LED点亮,并且在左侧和上方–输入电源插头:



它可以为Arduino设备,带有USB调制解调器和Wi-Fi的路由器以及Full HD IP监控摄像机的电池寿命提供约40分钟的电池寿命。

在这里,您可以看到两个不间断使用者的白色电源插头-Arduino电源单元和低电流屏蔽,室外监控摄像头的路由器和电源单元位于此处。 这条线突破了由Arduino控制的接触器,仅适用于同一软件看门狗,该软件看门狗在VPN掉落的情况下重新启动路由器(摄像机同时重新启动,尽管它不需要它)。 来自温度传感器的双绞线的顶线连接到控制器:



我必须说,尽管这些继电器的参数似乎允许这样做,但我永远不会相信将强大的负载切换到小型的蓝色中国继电器。 因此,立即放弃了使用带有手动控制功能的标准模块化接触器Legrand 4125 01号接触器的使用。 即,控制器主体内部的继电器控制接触器,并且接触器已经控制了负载。 这是可靠的。 但是路由器和摄像机的电源只能通过这个小的蓝色中文继电器来实现,因此电流很小,因此是可能的。

在第一次战斗发射中,我感到非常失望。 在桌子上,我经历了除了负荷之外的所有事情。 怎么了 接触器会发出咔嗒声,因此很显然它们将切换负载。 但是不,有必要体验。 强大的电对流器在打开触点时将干扰引入了系统,从而确保了互联网屏蔽层的冻结。 要使他摆脱困境,只能通过断开电源来实现,简单的重置无济于事。 Googled-是的,这个中国人有这样的问题。 而且该库无法处理这种情况。 也就是说,一块铁很不好,软件也不是很好。

我已经以为一切都消失了。 我什至订购了固态继电器,但浮渣的高度较大,因此不适合我的设计。 但是后来我认为仍然有可能抑制干扰。 再次用Google搜索,发现了特殊的降噪电容器(所谓的X型电容器)。 只需将它们与接触器的控制绕组并联,就可以了! 挂断完全消失。 在过去一年的运营中,没有记录到以下任何一个案例:







但是您可以通过这种方式查看框内的内容:





好了,带plast片的遮阳板的完整视图(套件中未提供插头):



为了进行调试和闪烁,将USB电缆连接到控制器并存储在关闭门后面的防护罩内(暂时不会连接到此照片):





该系统已经工作了将近一年,可以在高达20度的霜冻中生存,没有任何问题。

总的来说,我对结果感到满意。 但是,对于或多或少的功能性任务,Arduino显然很弱。 我不止一次遇到内存不足的问题,不得不削减和优化。 而且工作速度(特别是使用存储卡)根本不适合我。 因此,我想以更强大的功能为基础,对此类技术的未来实现(如果有)。 我想同事们给我提供了一个Raspberry Pi。

有人可能会说:“为了这样一个原始的任务,有多少困难?”也许是正确的。 对我来说,这整个工作是一种业余爱好,没有什么意义。 因此,我一直在寻找一切可能的娱乐方式:)

Source: https://habr.com/ru/post/zh-CN411141/


All Articles