当我非常专注于项目(比如这个项目)时,我经常会忘记我的环境。突然坐在黑暗中或没有意识到需要新鲜空气的情况并不少见。以前,我购买了一个知名品牌的智能传感气象站,我真的很喜欢它的传感器。我喜欢他们提供的数据量。但是我意识到,我意识到,我没有在一个该死的设备上本地访问我的个人数据,而这个设备就在我旁边。该设备仅适用于互联网连接,我的所有数据都存储在他们的服务器上。
将传感器/设备连接到互联网并不能使其变得智能!
作为一名修补匠,我认为我也可以做到这一点,甚至可能做得更好,获得相同的传感器数据,向其添加通知和统计数据,但略有不同的是,我的数据和逻辑将在本地存储和处理。
所以这就是我所做的:我带着我的 Raspberry Pi 并在上面安装了传感器,用于测量温度、湿度、空气质量、环境光和气压。我决定使用我最喜欢的物联网中间件 nymea,并为传感器编写插件。Nymea 提供了一堆开箱即用的东西,例如日志记录、统计信息、通知和规则,因此我可以轻松地在我的环境中添加一些实际的智能行为。
我使用了几个从亚马逊购买的 I²C 传感器。我一直在寻找 I²C 空气质量传感器,但找不到价格合理的传感器,所以我将一个便宜的模拟空气质量传感器连接到模数转换器(简称 ADC)。我使用的是 Raspberry Pi 3B+,但支持 I²C 接口的类似硬件平台就可以了。
SHT30
适合我的用例。它很便宜,并且注意湿度和温度之间的物理影响。使用数据表读取值非常简单。BMP180
。使用此传感器,我还可以获得温度和湿度,因为正确测量需要这些值。传感器在出厂时已经校准,校准数据存储在芯片中,我觉得非常整洁。数据表为我提供了有关如何获得压力的所有必要步骤。如果你愿意,你也可以计算海拔高度,但我的用例并不需要它TSL2561
,它给我全光谱的光强度测量,此外,还单独给我红外光强度光谱。这真的很方便,因为它允许我从全光谱中减去红外光谱测量,从而得到适合人类的光测量。
由于 I²C 是并行总线,每个 I²C 设备都有不同的默认寄存器地址,因此无需更改地址,所有设备都可以直接连接。空气质量传感器具有模拟输出,因此需要一个 ADC。为此,我使用了ADS1115
ADC,它也连接到 I²C 总线,允许我读取模拟值作为数字表示。仍然有三个免费输入,将来我可能会用额外的传感器扩展站点。我将温度传感器放置在尽可能远离空气质量传感器的位置,因为空气质量传感器包含一个会变热的加热元件。
连接后,我检查了i2c-detect
所有设备是否根据 Raspberry Pi 上的相应数据表正确显示。
$ i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- 39 -- -- -- -- -- --
40: -- -- -- -- 44 -- -- -- 48 -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- 77
0x39
光传感器TSL25610x44
温湿度传感器SHT300x48
ADC ADS1115(MQ-135 连接到 AI0)0x77
压力传感器BMP180作为我的 Raspberry Pi 的基本操作系统,我使用了最新的Raspbian 。使用蚀刻机将图像闪存到 micro SD 卡后,我直接进行布线和开发。
首先,我从官方存储库安装了nymea (我最喜欢的开源物联网平台)。
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-key A1A19ED6
sudo apt update
sudo apt install nymea nymea-plugins nymea-cli libnymea1-dev git libi2c-dev
传感器站的插件不适合主存储库,因为这是一个 DIY 项目,但您可以从我的github 帐户获取源代码并为您的系统构建它:
# Clone the source code on the Raspberry Pi
git clone https://github.com/t-mon/nymea-sensorstation-plugin.git
cd nymea-sensorstation-plugin
# Build the plugin against the current libraries
mkdir build
cd build
qmake ../
make -j$(nproc)
# Finally install the plugin and restart nymea
sudo make install
sudo systemctrl restart nymead
在我的设置中,我有飞利浦 Hue灯、Kodi 媒体中心、LG 智能电视、我居住地的天气信息以及一些其他集成的设备和服务。我还启用了远程连接,以便在我的手机上拥有推送通知服务(数据将保留在本地,我只使用云连接进行远程连接并接收推送通知)。根据我从新传感器站获得的数据,这些是我想要控制的设备。
现在它还包含我的新传感器站!
插件开发完成后,我在我的系统上安装了插件,并通过使用nymea:app作为系统客户端将传感器站添加为“事物”。
在开发 I²C 传感器读取机制(不断启动线程以读取循环中的数据)时,我意识到每个传感器都会生成大量数据,并且信号中也有一些噪声。为了防止大量数据被转储到日志数据库、规则引擎和整体系统性能上,我必须进行一些过滤。在写这篇文章的时候,系统的阅读间隔是5分钟。这似乎是读取缓慢变化的传感器(如温度、湿度和压力)的好时间间隔。当涉及到快速变化的传感器数据时,例如光强度或空气质量传感器,系统反应缓慢。例如:我打开灯,在最坏的情况下,系统会在 5 分钟后识别出灯光增加。不是很好。当前的光测量非常适合缓慢的日光变化,但在处理快速变化方面并不是最好的。问题在于数据中的巨大噪声,这使得经典的低通/高通滤波或 PID 调节器变得无用,因为你必须进行如此强烈的滤波,以至于失去了快速响应的效果。
也许本文的读者对此问题有解决方案?是否有一种滤波器模型/方法可以在嘈杂信号上实现平滑、良好的数据变化,但对强变化(如开灯)的响应时间快速?
我将传感器站放在客厅沙发旁边(因为这是我最想要舒适的兴趣点),我让系统收集数据几天,以查看传感器数据在我的房间中的表现如何环境
在应用程序概览中,我看到了我的电台的当前值。
早上,当我开始新的一天时,我会打开百叶窗和窗户,因为我的公寓隔离得很好。来自我的新传感器站的数据很好地代表了我的“起床”程序,如下图所示(直接来自应用程序的屏幕截图)。我在早上 8:30 打开窗户 20 分钟。
下午,当外面天色越来越暗时,我再次检查了传感器数据,结果如下(我没有打开窗户,一个人在这里,我妻子在 16:30 左右下班回家)。
在对传感器值有了良好的感觉之后,是时候根据这些数据定义一些规则和操作了。对于我的“问题”,我定义了两个规则。
我调用的第一个规则Air quality notification
应该在空气质量不好时通知我,这样我就可以打开窗户,让我的头脑保持清醒和清醒。根据白天收集的数据,我意识到,当 ppm 值高于 2000 ppm 时,我可以感觉到需要新鲜空气(散步后回到房间)。如果这个值只代表 CO2,我可能会死于 2000 ppm,但传感器正在检测多种气体,因此有很大的解释空间。为了进行精确测量,我肯定会选择另一个传感器,但就我的需要而言,它可以胜任。
一旦该值超过 2000 ppm,该规则就会向我的手机和我的媒体中心发送通知。
我调用的第二条规则Light sensor rule
应该打开我的沙发背景灯,但前提是电视当前处于打开状态。我可以通过两种方式做到这一点,要么检查 Kodi 当前是否正在播放(我使用Mythtv的Kodi PVR 插件看电视),要么通过检测电视是否可访问来使用智能电视插件。这两种情况都适合我。我还可以使用存在传感器插件,它检查 LAN 中是否存在网络设备。如果我的电话或我妻子的电话在网络中,如果光强度低于 80 勒克斯,请打开灯。
有用!使用室内传感器站 2 个多星期后,我意识到我打开窗户的频率更高了,而且自从使用它以来,我从未突然坐在黑暗中。令我惊讶的是,我在传感器数据中识别出了我的哪些日常行为。由于数据存储在本地和我的,我对收集的数据没有任何不好的感觉。该功能(电话通知除外)不依赖于我的互联网连接。
我想用我的新传感器站做几件事。一些想法:
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !