对我来说,编写算法可能是家庭自动化中最有趣的部分。 但是,即使是所有传感器和脚本,也无法应付生活的繁华幻想,您必须添加一种直接控制的方法。 作为手动控制,您可以放置普通的门铃,但是如果您想要更多,该怎么办? 我们遇到了本文的主人公-基于Silicon Labs的SI1143的手势传感器。
SI1143本身:

它看起来真的很未来。
还有多少优势:
- 高灵敏度光电二极管,低噪声ADC
- LED驱动器,电流从6到360毫安
- 电压从1.71到3.6伏
- 和智能I2C-每秒高达3.4兆位
大小只有5毫米乘3毫米。 这不是您第一次看到它。 好吧,这里您需要更多捆扎带。

可以删除吗? 我的美感问。 然后,我将尽力满足我们这个地区难得一见的客人的要求,并将木板隐藏在建筑物中,但是与此同时,您可以通电并查看发生了什么。
评论细心。 确实有比预期更多的细节。 以Enviriot项目中的节点为基础。 除STM32F051微控制器外,该板上还装有德州仪器(TI)的868兆赫兹CC1101收发器,填充固件后,就足以供电,并且该设备将连接到MQTT-SN服务器。
工作原理基于测量来自3个LED中每一个的反射信号的电平。 我将尝试将其打开并查看响应。

由于LED的不对称排列,来自LED 1的信号明显更大,因此必须首先对测量结果进行归一化。

因此,依赖关系已经可以理解。 我将尝试编写以下算法:
当L1 +-来自LED 1的信号增加时,L1> L3-来自LED 1的信号大于来自LED 3的信号。
在纸上很顺畅,但动力学方面开始出现问题。 对于固定在相同高度的白纸,在三分之二的情况下获得了预期的结果。 当我尝试挥动双手时,信号开始跳动,而我奇妙的算法开始使读数混乱。 他看着他的手,但与一张白纸有很多不同。 但是以某种方式它应该工作。 知道了 说服! 我将尝试阅读文档。
针对这种情况,Silicon Labs已发布了AppNote AN580-“红外手势感应”。 描述了确定手势的两种基本方法及其可能的组合。 第一种方法是确定每个时间点的位置,并根据坐标确定手势。 第二种方法确定信号之间的相移。 第一种方法的一种变体已经过测试,效果不佳。 我将尝试实现第二个。
走吧 有必要实施多达两点。 确定输入时刻,然后将此数据传输到状态机。 输入阈值通过实验确定为总信号的1/8。 为了防止噪声,我将添加施密特触发器,将其打开15%,将其关闭10%。
好吧,状态机本身。 状态1到3-向上运动,状态-1到-3-向下运动和状态4,这是两个LED同时工作的不太可能的情况。

现在,让我们尝试所有这些。
var LSt = new Int8Array([-3, -3, -3, 1, 1, 3, 3, 4, -3, -3, -1, -1, 3, 3, 3, 4, -2, -2, -2, 4, 2, 2, 2, 4]); this.r1 = false; this.r3 = false; this.button = new Int8(0); if(n1 > 15) { this.r1 = true; } else if(n1 < 10) { this.r1 = false; } if(n3 > 15) { this.r3 = true; } else if(n3 < 10) { this.r3 = false; } let st = (this.r1?1:0) | (this.r3?2:0); if(st == 0){
变量n1和n3包含相应LED的标准化值。 结果在按钮字段中。
为了进一步使用,状态2-向上和-2-向下很有用。
该程序用JavaScript的子集编写,然后编译为字节码并上传到设备。 由IaIojek同志通过NiL.JS库解析JavaScript并生成AST,为此,他
深表感谢 。

如果状态2持续的时间少于0.3秒,则由A14和A15块负责,则将亮度设置为最大值。 块A01和A13将亮度设置为0,以进行短暂的向下移动。
向上移动并保持时,块A10,A09和A04提供了平滑的亮度增加。 向下移动并保持时,块A12,A11和A08起作用并允许您降低水平。
好吧,也许仅此而已。 客户很高兴,我开始考虑下一个版本。 在必要的更改中:将LED与接收器保持相同的距离,显示操作指示并在单独的控制器上进行轮询,这将缩短轮询间隔。