下午好,亲爱的哈布罗维特人! 几年前,我购买了一个色彩丰富的zWave广告,并根据此协议安装了窗户传感器。 USB zWave-Stick连接到充当控制器角色的家庭服务器,编写了一个小的Java模块来接收来自该控制器的数据,并且编写了一个用于Android的小型应用程序,可以精美地显示所有传感器的状态。 插入电池,在控制器上注册传感器,一切正常。 但是几个月后,人们感到非常失望。 首先,这些zWave传感器的工作原理是“发送消息并在不等待确认的情况下入睡”。 就我而言,这导致来自控制器最远传感器的信号根本无法到达控制器。 即使安装额外的zWave中继器也无济于事。 其次,他们很快耗尽了电池电量,以至于大约六个月后所有传感器都停止工作。 原因是他们每个小时醒来,以告知控制器他们的状况。 禁用或更改此选项不起作用,因为标准软件绝对不允许这样做。 在经历了这种原始,不可靠和不友好的技术折磨了两年之后,我认为我已经受够了。 但是,我没有丢掉所有东西然后扔掉,而是想到了丢掉箱子,而是更换其中的电子设备。 该选择取决于相当简单的RFM69收发器(433 MHz),在此基础上,可以制造传感器板和通过USB连接到服务器的控制器。 新系统已经运行了5个月,可靠性接近100%(但是仍然存在一些故障),电池还没有耗尽。 也就是说,已经可以看到基于zWave的旧系统的所有缺陷已被消除,我想分享本文的技术细节,请参见图片。

谁在乎,请在猫下。
在我看来,zWave无法使用的原因有两个:房屋有两层,上面有钢筋混凝土地板,并且面积很大(也就是说,从控制器中大量拆除了一些传感器)。 好吧,专有软件中的缺陷不允许禁用传感器的定期唤醒功能,从而导致电池快速放电。 当我显然不打算使用zWave时,我开始寻找可以推到同一传感器外壳中的其他选项。
我的第一个传感器原型基于ESP8266。 财务负责人-基于我已经
在Habré上写过的付款情况。 该系统甚至可以作为原型,但由于两个原因,我不得不放弃它。 第一个原因是相同的-屋子里的角落里都有很低的WiFi信号电平,这导致ESP8266醒来时的激活时间很长,结果导致电池强烈放电。 尽管我承认我只是不知道如何烹饪这种ESP8266(
类似本文的文章证实了这一论点)。 但是第二个原因更为严重。 由于我决定不但要保留外壳,而且还要保留电池盒,所以只能使用3.0伏的CR123A电池。 即,由于DC / DC转换器的增加,传感器的价格和复杂性增加。 尽管在Habré上
有一篇关于该主题
的精彩文章 。 但是,无论如何,这两个原因已经超过了,我拒绝了ESP8266。
第二个原型是有线的。 我制作了传感器和USB控制器的原型,添加了服务器模块,以便他除了zWave-Stick之外还了解该控制器。 有一种想法是逐渐拉动导线和传感器,然后将传感器逐个更改以将zWave板更改为有线板。 但是最后,他没有挑墙,而且这个原型也被丢弃了。
然后,他决定着眼于433和868 MHz的无线电模块,并订购了几个用于实验的模块:
RFM69HCW ,
A110LR09A和
MRF89XAM8A 。 在模块大小,价格以及库的可用性以及
良好的示例方面,我选择了RFM69HCW,它构成了系统的基础。
该系统只有四个组件:
- 无线传感器(433 MHz,CR123A 3.0V电池),
- 网络控制器(433 MHz,通过服务器的USB供电)
- 服务器(我在本文中已经在Habré 上写过关于它)和服务器程序模块
- 移动客户端(Android应用程序)
下面,我将详细描述每个模块,最后,我将给出运行最后几个月的系统运行统计信息。
感测器
传感器使用
RFM69HCW无线电
模块 。 它具有较宽的工作电压范围(1.8V-2.4V 17dBm,2.4V-3.6V 20dBm),并通过SPI进行控制。 也就是说,您需要一个微控制器。 前一段时间,我熟悉了STM32L系列,并订购了STM32L051进行实验。 它在睡眠模式下以小电流(0.27μA)贿赂我,其工作电压几乎与无线电模块的电压(1.65V-3.6V)相同。 再加上低廉的价格。
原来是以下方案:

微控制器和无线电模块的电源电压都应使它们可以直接由CR123A元件供电。 STM32L051具有连接至ADC通道17的内部基准电压源以及该电源的校准值,可让您测量电源电压VDD的电流值。 无线电模块通过Q1现场设备连接到电源,这使您可以从微控制器控制其电源。
通过将微控制器转换为“待机”来实现睡眠模式。 在这种模式下,STM32L051具有禁用的内核,几乎所有外设和内部稳压器,可确保功耗为0.29μA(禁用实时时钟)。 但是在此模式下,有一个功能-微控制器仅在WKUP引脚(A0)上的信号上升沿唤醒。 由于使用的电磁开关处于打开/关闭(闭合或打开)状态,因此需要一个小模块,在闭合和断开电磁触点时,该模块都会产生持续时间短的脉冲。 该脉冲被馈送到微控制器的输入A0并将其唤醒。 这种转换器在节能型74AUP系列(74AUP1G86)的异或IC3芯片上实现,该芯片在0.8V至3.6V的电压范围内工作,消耗0.2μA电流。 因此,睡眠模式下的总功耗应约为0.5μA,这可通过在完全组装的传感器上进行测量来确认。
当微控制器醒来时,它首先测量电源电压,如果它低于1.8伏,则不是命运-发射器无法启动,微控制器会睡着。
如果电池电压大于1.8伏,则微控制器将打开并初始化无线电模块,将状态传输到网络控制器并等待确认。 数据包包括唯一的32位包(事件)编号,电池电压,温度,磁接触状态,控制字节(CRC7)。 在成功确认的情况下,微控制器会睡着。 如果不是,则再次发送状态,但最多发送10次。 我设置了该边界,以使传感器不会在网络控制器被简单关闭的情况下无限期地等待响应。 最后发送的唯一事件编号存储在微控制器的内部EEPROM中。
在数据传输过程中,微控制器使LED闪烁(没有LED的地方)。 LED通过PWM开启,占空比取决于当前电压值,这使您几乎可以在整个工作电压范围内获得几乎相同的亮度。
这些板是在EagleCAD中设计的
,可在此处获得板设计。 面板是双面的:微控制器及其线束位于面向窗框的上侧,无线电模块和LED位于面向房间的下侧。 我在中国下令,用传统的厨房烤箱(顶层)和吹风机(底层)焊接自己。

无线电模块需要天线。 这只是一条164毫米长的电线。
安装后,必须对每个传感器进行编程,并为其提供SWD连接器。 我将剩下的联系人留在了板上,以备将来进行实验。
该固件用C ++编写,部分代码在相当通用的基类中执行,这些基类封装了对ST HAL库的调用。 源代码
在这里 。 为了进行开发,使用了适用于STM32的System Workbench。 最终二进制固件文件的大小为22 kB。
这是这种情况下的传感器:

根据传感器的位置,对于某些传感器,我将天线留在外面(相对于白框的背景,这是看不见的),对于某些传感器,我将导线弯曲到框架中,并将其完全塞入外壳内。
为了引起兴趣,我计算了一个传感器的组件成本(以Mouser目录的价格,价格和总价(以欧元为单位))
项 | 内容描述 | 价值 | MOUSER编号 | 数量 | 费用 |
集成电路3 | 异或 | 1G86 | 771-74AUP1G86GW-G | 1个 | 0.254 |
IC1 | 微控制器 | STM32L051 | 511-STM32L051K6T6 | 1个 | 2.14 |
SV1 | 连接器 | Swd | 68602-406HLF | 1个 | 0.157 |
发光二极管1 | LED 3毫米 | 3毫米 | 630-HLMP-K155 | 1个 | 0.351 |
Q1 | P-mosfet | BSH205 | 771-BSH205G2R | 1个 | 0.276 |
S1 | 电磁接触 | ORD211-0810 | 876-ORD211-0810 | 1个 | 0.625 |
IC2 | RFM69HCW无线电模块 | RFM69HCW | 474-COM-13910 | 1个 | 5.36 |
C1,C2,C3,C6 | 贴片电容 | 0.1uF的 | 80-C0805C104J5RAC | 4 | 0.1 |
C5 | 贴片电容 | 0.4nF | C0805C471K8HACTU | 1个 | 0.021 |
C4 | 贴片电容(钽) | 47uF | 581-TAJR225K016RNJ | 1个 | 0.334 |
R1 | 贴片电阻 | 10K | 660-RK73H2ATTDD1002F | 1个 | 0.01 |
R10 | 贴片电阻 | 330 | 660-RK73H2ATTDD3300F | 1个 | 0.01 |
R3,R4,R6,R7,R8,R11 | 贴片电阻 | 47K | 660-RK73H2ATTDD4702F | 6 | 0.06 |
R5 | 贴片电阻 | 56 | 660-RK73H2ATTD56R0F | 1个 | 0.013 |
R9 | 贴片电阻 | 56M | 603-RC0805JR-0756ML | 1个 | 0.037 |
| | | | | 9.748 |
顺便说一下,事实证明它比原始的zWave传感器便宜三倍。 尽管这只是零件成本,不包括外壳。 但是,在我看来,zWave传感器在零售中非常昂贵。
网络控制器
对于控制器,使用与传感器相同的无线电模块和相同的微控制器。 这允许重用大多数固件代码。 对于控制器,我选择了该板的外形尺寸,以便使用Raspberry Pi的现成外壳。 与传感器相比,增加了外部天线连接器和基于FT232RL和SI-8621隔离器的USB环路。 当然,取而代之的是可以带一些USB的STM32。 但是,首先,有必要分离固件代码,其次,需要进行USB本身的软件实现。 带有外部FT232RL的选件虽然价格昂贵,但更可靠且实现速度更快。 结果是
以下方案 :

并以组装形式显示如下:


微控制器在这里不会进入睡眠状态,无线电模块可以进行接收,但是在成功接收到来自任何传感器的数据包之后,模块进入传输模式并发送确认。 此外,任何成功接收到的数据包都会通过USB传输到服务器。 软件包格式是一串由“;”符号分隔的值:
GW; 3; 12; -57; 0; 146; 30; 18
其中:
- 第一个位置是数据包标签(始终为“ GW”)
- 第二位置-数据类型(传感器状态或错误代码)
- 第三位置-传感器编号
- 第四位置-网络控制器一侧的信号质量(RFM69HCW可以在接收过程中保持信号质量,并允许您在接收完成后查询信号质量)
- 第五位置-窗口状态(0打开,1关闭)
- 第六位置-来自传感器的数据包(事件)的唯一编号。 此数字使您可以在服务器端控制服务器是否已接收所有事件,或者丢失了一个或多个事件。
- 第七位置-当前电池电压(30对应于3.0V)
- 最后的第八个位置是微控制器内部传感器的温度。 我还没有弄清楚如何使用它
固件的源代码
与传感器位于同一位置 。 它们具有公共的主文件和公共的基类库。 使用main.cpp文件中的define指令选择固件选项(传感器或控制器)。
由于USB电路,天线和附加连接器,网络控制器的成本较高。 但是,由于只有一个控制器,因此可以忽略该添加剂。 但是即使有了这个补充,它也比以前的zWave-Stick便宜三倍。
服务器模块
网络控制器已连接到运行CentOS 7的服务器。该服务器运行用Java编写的程序。 在结构,实施和任务方面,该程序非常简单:
- 使用非常老旧且似乎不再受支持的RxTx库,可以监视配置中指定的USB端口(在我的情况下是/ dev / ttyUSB0)。 目前,这是整个系统中优化程度最差的部分,因为该库会将服务器处理器负载很大。
- 如果从USB端口接收到数据,则将它们记录在日志文件中并存储在传感器状态类中。 重新启动服务器时,状态会丢失。 要恢复它,您需要走动房屋并手动打开和关闭所有窗户。 这可能是我系统的最大缺点,但是我很有意识地拒绝定期轮询传感器以节省电池。
- 该应用程序还是小型TCP / IP服务器,它侦听配置中指定的TCP / IP端口。 在此端口上,它可以接受来自移动客户端的连接。
- 如果移动客户端连接到服务器,它将发送所有传感器的当前状态。 服务器使用定期的心跳消息,还监视连接的活动。
- 服务器和移动客户端以XML格式交换消息。 这些消息以小型Java库的形式实现,可以在服务器端和Android移动应用程序端共享。
- 尽管这没有多大意义,但是出于兴趣的考虑,我添加了通过IMEI授权移动客户端的功能,以及使用缝合到源代码中的密钥(javax.crypto Java包)对服务器和客户端之间的消息进行AES加密的功能。 但这纯粹是为了实验,因为只能从内部网络访问此服务器模块的TCP / IP端口,而从外部看不到它。 虽然,如果我想将此端口开放给大世界,那么现在这样做并不会太吓人。
谁在乎,服务器模块的源代码在
这里 。
移动客户端(Android应用程序)
尽管此应用程序是整个项目的最终结果,但您在这里不会写太多。 这是一个标准且非常简单的Java应用程序,具有三个选项卡:第一层的窗口状态,第二层的状态以及服务器的少量遥测(请参见
此处的
源代码 ):

图形基于一组SVG文件,这些文件根据传感器的状态相互堆叠。 每个窗口区域均支持长按,根据该提示会显示该窗口打开时间的提示:

原则上,没有什么可以阻止您在此工具提示中添加电池图标,但是您的手还没有伸手。
操作经验
服务器端的日志文件中记录了“每次打喷嚏”。 通过对过去5个月中的这些文件进行分析,我们可以更详细地了解该系统的感觉。
分析非常简单-只需在服务器上的日志文件文件夹中使用grep。
在无线电信道上传输数据时有多少错误? 在5个月的时间内,以错误的大小接收到消息时记录了8个错误,而在错误的CRC中记录了25个错误。 在这两种情况下,您都不能直接说出哪个传感器出了问题,因为这种情况下的数据包已完全损坏。 由于在所有这些情况下网络控制器都不会确认数据接收,因此传感器应以新的方式发送数据,这在大多数情况下可以纠正这些错误。
以下是5个月传感器运行的摘要表。
地板层 | 感应器 | 数量 事件的 | 迷失的 事件的 | 电压等级 电池 | 中位数 威力 讯号 |
1个 | 10 | 105 | 0 | 3.1 | -66 |
1个 | 11 | 52 | 0 | 3.3 | -70 |
1个 | 12 | 122 | 0 | 3.3 | -61 |
1个 | 13 | 89 | 0 | 3.3 | -74 |
1个 | 14 | 2573 | 0 | 3.3 | -68 |
1个 | 15 | 261 | 0 | 3.3 | -60 |
1个 | 16 | 543 | 2 | 3.3 | -70 |
1个 | 17 | 156 | 2 | 3.3 | -74 |
1个 | 18岁 | 177 | 2 | 3.2 | -68 |
1个 | 19 | 384 | 3 | 3.3 | -56 |
2 | 3 | 368 | 2 | 3.3 | -62 |
2 | 4 | 86 | 0 | 3.3 | -71 |
2 | 5 | 521 | 2 | 3.3 | -59 |
2 | 6 | 115 | 0 | 3.3 | -62 |
2 | 7 | 316 | 2 | 3.3 | -63 |
2 | 8 | 419 | 1个 | 3.3 | -60 |
2 | 9 | 89 | 0 | 3.3 | -68 |
10号传感器冻结一次。 这显然导致电池电压明显降低。 冻结的原因尚不清楚。 它再次挂起,您必须弄清楚。
14号传感器安装在前门上,这就是为什么它具有如此众多响应的原因。 但是如此大量的行程尚未影响电池电压。
丢失事件是指传感器尝试发送状态,但服务器未确认状态。 所有丢失的事件都是由于我关闭服务器大约半天来进行清理而造成的。
“中值信号强度中值”列显示中位RSSI值(以dBm为单位),其中每个单独的值在接收到每个数据包后获得。 信号最佳的传感器(No. 19,-56 dBm)位于与网络控制器相距2米的直视距离内,但是该传感器的天线折叠在一起,并在外壳内部装有框架。 网络控制器本身位于一楼。 但是,来自二楼传感器的信号非常好。 这是由于以下事实:在第二层的所有传感器上,天线均已从传感器外壳中卸下。
而不是后记
一方面,我很高兴自己作为一个爱好,从零开始设计,组装和运行了这种级别的系统。 更高兴的是它比基于zWave炒作技术的“专有”系统更好地工作。 还有开发和改进此系统的空间。 我只是被小小的疑问所困扰。 即,没有经过专门电气教育的人的膝盖上收集的东西比在IOT品牌的狭窄圈子中已知的品牌产品更可靠。 可能是进展转向了错误的方向。