洗衣机的泄漏保护系统



引言


我认为每个房子都有洗衣机。 通常,它通过软管连接到供水系统。 但是用软管可能会造成很大的麻烦:有时它们会破裂,这将导致您的公寓和邻居中的洪水。 因此,洗衣机通过特殊的水龙头连接到供水系统,该水龙头必须在洗涤前打开,然后再关闭。 我不认识你,但是我把这台起重机放在一个非常不方便的地方。 是的,我更喜欢在下班前开始洗衣服,这样,一天中的大部分时间软管都会承受压力,并且有时在我不在家时会破裂。 如果起重机在正确的时间自动关闭,那就太好了!

在我看来,这个想法很强大,因此我决定将其实现:在微控制器上并通过电动阀实现。

首先,我制定了开发系统的要求:

  • 监视洗衣机的状态:开始时打开水,结束时关闭水;
  • 手动控制阀门的能力;
  • 电池操作并在电池放电时关闭阀门;
  • 存在泄漏传感器:如果检测到泄漏,则关闭阀门。

然后,他弄清楚了它的组成部分:安装在洗衣机中的监视器和一个控制器,该控制器从监视器接收信号并控制电动阀。 监视器和控制器之间的通信是通过单向无线电信道进行的。

看来这足以完成技术任务。 让我们开始吧!

MCU选择


由于整个系统由两个设备组成,因此应该有两个微控制器。 我仔细检查了一下,发现了两个Atmega8:一个在DIP软件包中,另一个在TQFP中。 DIP中的一个-进入监视器,TQFP-进入控制器。 后来发现,杂草丛生的控制器固件不再适合8KB Atmega8,因此我不得不升级到Atmega328(完整的模拟产品),但是现在程序的内存增加了四倍。
顺便说一句,我从事此类项目的动机之一是处置电子垃圾,这是我多年来积累的。 没错,在项目结束时,垃圾不会变小。 它变得更大!

第一部分 监控器


与洗衣机的互动


第一个问题:如何确定洗衣机现在在做什么? 在项目开始时,这部分任务对我来说很简单。 所有要做的就是确定清洗开始和结束的时间。 机器的前面板上有一个LED,该LED会在需要时点亮并熄灭。 我希望通过微控制器的脚将GPIO焊接到其上,因此在调试期间,我只是使用按钮在监视器上模拟了必要的事件。 我按下按钮-LED亮起,开始洗涤。 放手-相反。 但是,在解析完洗衣机之后,事实证明该LED是动态显示的一部分,而且,确定它是打开还是关闭并不是那么容易。

转动控制面板(几天),我发现它是在PIC控制器上实现的。 此外,它通过响应硬件I2C的支脚连接到主板。 是的,我想,您可以嗅探I2C总线,从而确定现在要做什么洗衣机。 我在互联网上找到了Atmega的I2C嗅探器代码。 当然,我必须玩一些东西。

坦率地说:我无法完全弄清协议(并且我没有尝试太多),但事实证明,它可以非常准确地确定洗涤开始和结束的方式(以及打开和关闭电源)。 我花了大约一个星期的时间。

型号: Candy GC4 1072 D. 计算机会定期将一系列的五个字节序列发送到人机界面。 前四个序列的格式为:

12 A7 00 – NN – X0 X1 X2 X3 X4 X5 X6 X7 – CS
其中:12 A7 00-标头,NN-序列号,X [0..7]-8字节数据,CS-校验和。 第五个顺序是一些大小不一的垃圾,对我来说,其本质仍然是个谜。

我设法解决了以下模式:

开机

12 A7 00 – 01 – X0 X1 X2 X3 X4 X5 X6 X7 – CS
12 A7 00 – 02 – X0 X1 X2 X3 X4 X5 X6 X7 – CS

其中X [0..7]至少一个不等于0

开始

12 A7 00 – 03 – X0 X1 X2 X3 01 01 01 01 – CS
X [0..3]是任意数字

停止

12 A7 00 – 03 – X0 X1 X2 X3 00 00 00 00 – CS
X [0..3]是任意数字

可以看出,这些不是严格的序列,即模板,因此我不得不修改解析器。

工作逻辑大致如下:如果我们获得了POWER ON序列,但是没有START,则我们开始广播状态为0的数据包。如果出现START序列,则将状态更改为1。在其他情况下,没有头盔。

我们将讨论软件包以及下一步的状态。

这很有趣,但是当我监视I2C数据包时,我没有机会连接到嗅探器计算机。 我使用了具有铝制外壳的Raspberry Pi c powerbank'om。 因此,一旦该建筑物与洗衣机的主体接触,RCD就从防护罩中拔出,公寓里的灯熄灭了,我开始寻找带有matyuki的手电筒。 :)为什么会发生这种垃圾-对我来说仍然是一个谜。

广播频道


最初,我不希望多余的电线来自洗衣机。 也就是说,该连接应该是无线的。 从这里开始,有三种可能的解决方案:WiFi,蓝牙和Arduino的RF模块。 我通过选择FS1000A模块解决了后者。

当然,在哈布雷(Habré),会有很多人以此选择责备我。 他们暗示在Ali-Express上可以以便宜的价格购买带有完整WiFi的ESP模块。 但是我认为这会使该项目变得更加复杂,因此决定简化工作。

如您所知,FS1000A射频模块不能直接连接到RS232接口:较长的零或一序列会中断接收机同步。 已创建VirtualWire库来解决此问题。 但是,该库是为Arduino编写的,我只能在Atmega下使用C进行本机编程。幸运的是,Arduino的代码与纯C非常相似,并且进行了较小的修改就成功移植了该库。

存在一些困难:首先,数据包不想到达接收者。 我将一切归咎于弯曲的手,但是通过直接连接接收器和发送器控制器的端子,我确信一切都可以在软件部分中完成。 从中国订购的变送器被证明是有故障的。 我不得不买另一个套件。 然后我修复了旧的,现在有两组收发器。 还记得我写的关于减少垃圾的文章吗?

数据已发送,但是此数据中到底包含什么? 这是传输的数据包是:

 typedef struct { uint32_t dst; uint32_t src; #define WMP_MSG_STATUS_ALIVE _BV(0) #define WMP_MSG_STATUS_VALVE _BV(1) uint8_t status; } wmp_msg_t; #define WMP_ADDR_MONITOR 0x4d504d57 #define WMP_ADDR_CONTROLLER 0x43504d57 

前两个双字是接收器和发送器的物理地址。 就我而言,它们是严格固定的:0x43504d57-接收器(控制器)和0x4d504d57-发射器(显示器)。 实际上,前8个字节是此数据包签名。 重要信息仅在最后一个字节-位标志中找到。 该标志的置零位置表示监视器处于打开状态并且正在工作-它应始终为1。第一位是阀的状态:0-阀必须关闭,1-处于打开状态。 仅此而已。

假定监视器应定期将数据包发送到控制器,以确认其操作和数据通道的可维护性。 如果失去通讯通道,控制器必须紧急关闭阀门。

VirtualWire库使用CRC32监视传输数据的完整性。 我没有朝这个方向做更多的努力。 美女!

建筑施工


显示器在结构上是一块小板,粘在洗衣机前面板内部的热胶“廖叔叔”上,并通过连接器连接到计算机和显示板之间的间隙。 机器本身未经任何修改:可以随时将其恢复为原始状态。

第二部分 控制者


广播频道


一切都很简单:已经安装了FS1000A套件的接收器和VirtualWire库的接收器。 对该包进行解析,并将其状态传输到输出。 VirtualWire接收器在微控制器中占据TIMER1。

阀门控制


在中国的在线商店中,选择了3/4英寸电动阀,该阀带有5伏电源,并且终端传感器连接到电缆。 该阀安装在球阀和洗衣机的软管之间。 为了控制该阀,在同一中文站点上,L9110驱动器上订购了一个低功率步进电机驱动器。 我将其连接到控制器,如下所示:



从软件的角度来看,没有特别的困难:通过输入VALVE_CLOSE和VALVE_OPEN,我们可以确定阀门的当前状态。 如果需要更改此状态,请打开电动机以进行打开或关闭,直到在相应的输入上将其设置为逻辑0为止,但是由于打开或关闭需要一些时间,所以我不想在那一刻失去对一切的控制权设备。 因此,在Atmega计时器上,建立了原始的调度程序,并将阀门的控制权转移到了特殊任务上。 同时,特殊的WatchDog软件模块会测量阀门切换所需的时间,如果时间太长,则会生成有关其故障的信号。 后来,其他有趣的事情挂在了此调度程序上,例如闪烁的LED和轮询泄漏传感器。 但是稍后会更多。

而且,三色状态LED和三位手动控制拨动开关属于阀门控制电路。 在拨动开关的中间位置,根据洗衣机和其他传感器的信号激活自动控制。 阀门故障时,红色和绿色交替亮起。

LED和声音指示


使用LED,一切都很简单:它们通过限流电阻器直接固定在I / O端口上。 那里的电流不大,并且Atmega上的端口非常强大。

但是声音必须修补。 首先,我没有找到大而响亮的压电发射器。 看起来这些人自然存在,但是当我参加这次购买时,结果发现选择根本就不算什么。 我设法得到的最酷的声音听起来很安静。 我不得不上网浏览食谱。

我选择了一个带有一个晶体管和一个自耦变压器的电路,该电路将声压从5V摆动到50V。 然后结果就比较大声了。 当然,并非在所有频率上,而是更接近共振。

只是在产生声音的过程中,LED的亮度(带电源的卡爪)才略有下降,但微控制器没有冻结,控制程序也没有中断。 我认为这是调试布局的功能,并且在最终板上一切正常。 我弄错了-情况没有变好。 但是,更糟糕的是。



另一个问题是我用完了计时器,在后台我无法产生声音。 我不得不问吱吱的睡眠时间。 因此,在产生声音的过程中,Atmega除中断外也无能为力,必须禁用,否则音调不清晰。 但是事实证明这并不是很可怕,因为声音输出不会与其他关键任务相交,例如控制阀门或通过无线电接收数据。

此外,我选择了睡眠常数,使它们与注释相对应,并提出了几种或多或少的和谐组合:“阀门打开”,“阀门关闭”,“洗涤完成”和“泄漏”。 稍后,我将分别告诉您“洗完”信号。

检漏仪


泄漏检测器最初计划在微控制器的内置ADC上完成。 实验表明,这是一个完美的解决方案。 但是,我遇到了有时将带有接触点的电容器添加到传感器,以便连接该电容器,以及某处的导线是否断线的情况。 您可以使用:RC链,比较器和时钟来检查电容器的存在(并测量其电容)。 作为比较器,使用了常规的GPIO输入(它也是一个逻辑输入,并在特定电压下从0切换到1),并且微控制器中有足够的时间。



假定我会不时检查线路上是否存在电容器,然后使用ADC确定传感器触点是否在水中。 事实证明,仅测量电容器的电容就足够了:如果将其降低到水中,则充电时间将增加,而放电将减少。 此外,时间将发生足够的变化,从而可以确定地检测到它。

对于我的系统,我选择测量充电时间:如果未连接电容器,则为零;如果干燥,则相对较小;如果在水中,则充电时间更长。 精确的数值是使用一碟水和一系列实验确定的。

检漏仪有自己的红色指示灯LED。 如果未检测到传感器,则它会亮起,并且将关闭阀门的命令传送到空中。 一个人仅需恢复与传感器的通讯,LED熄灭并且可以打开阀门(当然,如果只有洗衣机处于洗涤状态)。 另一件事是传感器是否检测到水。 在这种情况下,指示灯开始闪烁,听到讨厌的间歇声音,并强制关闭阀门。 但最重要的是,控制器永远不会离开此状态。 泄漏被认为是严重事故,除非强制重启设备,否则供水将无法恢复。

营养学


在这个项目中,食物对我来说是最不可理解的部分。 如果我比较精通数字电路,然后精通模拟,那么我可以稍微说些。 但是,感谢中国人:我可以购买带有电池充电控制器的DC-DC转换器的现成模块,并基于它们可以想到一些可行的方法。

从一开始就计划使设备自供电,以便在断电的情况下确保将水切断。 另外,我有一个9V电源,需要将其连接到某个地方。 总计,介绍性结果如下:

  • 9V来自网络;
  • 3.4〜3.7V来自电池;
  • 为电池充电需要5V;
  • 逻辑和电路供电需要5V电压;
  • 如果电源电压出现故障,请切换电池电源;
  • 必须将电池充电信号,电池上的电压和市电操作信号传输到控制器

框图如图所示。



两个肖特基二极管用作开关元件。 充电控制器具有两个LED:CHARGE和STANDBY。 来自第一个的信号已连接到控制器的GPIO端口,以便监视器可以知道电池正在充电。 同样,来自第一个DC-DC转换器的信号被施加到微控制器端口,以确定设备是在市电还是电池上运行。 为了控制充电水平,电池电压被提供给控制器的ADC。 如果电压太低,监控器将关闭阀门并进入待机模式:直到电源电压出现,它才响应任何命令。

不幸的是,这里存在一些障碍:由于某种原因,阀马达从电池中吸收了一部分能量。 显然,我对网络DC / DC转换器的电源或板上电源线的厚度有误。 结果:打开或关闭阀门后,电池开始充电。

为了监视电源状态,有一个特殊的两色LED。 如果为绿色,则表明设备正在网络上运行。 如果为红色-则来自电池。 如果为绿色,但红色闪烁,则表明电池正在充电。

工作逻辑


好吧,我们拥有所有的硬件及其软件支持,现在我们需要以某种方式使所有这些相互交互。 最初,我以大循环(称为主循环)的形式看到了工作逻辑的实现,其中包含了许多ifs。

在此过程中,需要一个任务调度程序来执行以下简单操作:闪烁LED,轮询泄漏传感器,跟踪阀门切换时间和功率控制,这些已发布在TIMER0上。 调度程序本身不会启动与任务关联的功能,而只会在与任务关联的描述符中将同步位设置为1。 该任务仍在主循环中执行,我们设法摆脱了跟踪时间间隔,这使其非常简单。

在Zoo ifs中,它检查控制器各个子系统的状态并做出决定:有必要拒绝打开或关闭阀门。 调试起来很困难,很容易混淆。 取而代之的是,我喜欢D. Hazerman的那本古老著作中的想法:“如何自己制造机器人”。 该书建议每个模块生成自己的控制信号:前进,后退,旋转等。接下来,从这些信号中仅选择优先级较高的块中的一个。 我做了差不多。

我对块的优先级如下:

  1. 泄漏块
  2. 电池控制单元
  3. 手动阀控制单元
  4. 无线电控制阀控制单元
  5. 气门计时器WatchDog块

每个块生成三个命令:UNDEFINED,OPEN和CLOSE。

泄漏块具有最高优先级,但它没有OPEN命令,但无论其他块怎么说,它的CLOSE命令都肯定会关闭阀门。 手动控制单元可以中断无线电频道单元的任何信号,无论洗衣机向我们显示什么内容,都可以使您控制阀门。 等等。 即,已经出现了易于理解和调试的逻辑层次结构。

现在,让我们回到信号上:“清洗完成。” las,我的洗衣机型号没有机会借助声音通知其工作结束:糖果工程师没有提供这样的机会。 另一方面,我还有一个带有压电发射器的附加设备,并且每时每刻都知道洗衣机在做什么。 为什么不让他报告清洗结束? 好吧,让我们在阀门关闭信号时使控制器大声且讨厌(在共振频率下)。 添加另一个五分钟的保护间隔,以免每次打开和关闭机器时都听到此尖叫声。 阀门打开五分钟-清洗肯定已经开始。

结果


发展使我花了大约一年的时间(非常轻松)。 该设备已经工作了两年。 在操作中,事实证明它是令人满意的。 但并非没有缺陷。 让我们诚实地列出它们:

  1. 我弄乱了电源:阀马达从电池中吸收了一部分能量。
  2. 声音产生电路汲取电源电压。 您可以清楚地看到播放声音时LED如何改变亮度。
  3. 无线电频道不是很稳定。 首先,如果有人站在洗衣机附近,则信号消失。 其次,有时信号会自行恶化。 在这种情况下,您必须使用手动拨动开关,但是这种情况很少发生。
  4. 洗衣机中的监控器挂了几次。 控制器块甚至没有挂过一次。
  5. 压电发射器发出的声音在箱体内被淹没了。 我在koprus上钻了一个洞:它变好了,但不是真的。 我必须从板上焊接发射器并将其粘贴到外壳上,与孔正好相对。

总的来说,我认为开发成功并且非常有用。 我早上启动机器,然后平静地上班:我知道在适当的时候水龙头将关闭。

可以在此处下载包含项目文件的存档。

一些图片。


顶盖已移除的顶视图


,









- «»

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


All Articles