×

智能私有开源传感器站

消耗积分:0 | 格式:zip | 大小:0.21 MB | 2023-01-04

h1654155275.3239

分享资料个

描述

当我非常专注于项目(比如这个项目)时,我经常会忘记我的环境。突然坐在黑暗中或没有意识到需要新鲜空气的情况并不少见。以前,我购买了一个知名品牌的智能传感气象站,我真的很喜欢它的传感器。我喜欢他们提供的数据量。但是我意识到,我意识到,我没有在一个该死的设备上本地访问我的个人数据,而这个设备就在我旁边。该设备仅适用于互联网连接我的所有数据都存储在他们的服务器上

将传感器/设备连接到互联网并不能使其变得智能!

作为一名修补匠,我认为我也可以做到这一点,甚至可能做得更好,获得相同的传感器数据,向其添加通知和统计数据,但略有不同的是,我的数据和逻辑将在本地存储和处理

所以这就是我所做的:我带着我的 Raspberry Pi 并在上面安装了传感器,用于测量温度、湿度、空气质量、环境光和气压。我决定使用我最喜欢的物联网中间件 nymea,并为传感器编写插件。Nymea 提供了一堆开箱即用的东西,例如日志记录、统计信息、通知和规则,因此我可以轻松地在我的环境中添加一些实际的智能行为。

组件

我使用了几个从亚马逊购买的 I²C 传感器。我一直在寻找 I²C 空气质量传感器,但找不到价格合理的传感器,所以我将一个便宜的模拟空气质量传感器连接到模数转换器(简称 ADC)。我使用的是 Raspberry Pi 3B+,但支持 I²C 接口的类似硬件平台就可以了。

  • 温度和湿度传感器:我发现传感器SHT30适合我的用例。它很便宜,并且注意湿度和温度之间的物理影响。使用数据表读取值非常简单。
  • 压力传感器:非常流行压力传感器是BMP180使用此传感器,我还可以获得温度和湿度,因为正确测量需要这些值。传感器在出厂时已经校准,校准数据存储在芯片中,我觉得非常整洁。数据表为我提供了有关如何获得压力的所有必要步骤。如果你愿意,你也可以计算海拔高度,但我的用例并不需要它
  • 强度传感器:有很多传感器用于此目的。我一直在寻找一个适合测量可见光的传感器,因为我想在我的客厅里使用这个传感器。我选择了TSL2561,它给我全光谱的光强度测量,此外,还单独给我红外光强度光谱。这真的很方便,因为它允许我从全光谱中减去红外光谱测量,从而得到适合人类的光测量。
  • 空气质量传感器事实证明,在不花一大笔钱的情况下找到合适的空气质量传感器有点具有挑战性。我最终得到了一个模拟 MQ-135 空气质量传感器。它测量空气中的不同气体,如 NH3、NOx、酒精、苯、烟雾和 CO2。挖掘有关此传感器的更多信息表明,从传感器中挑选出某种气体并不是最简单的事情。必须对每个单独的传感器(找到 R0)进行校准,并且传感器需要至少 24 小时的“老化”阶段才能提供任何有用的数据。可以在此处找到对传感器的详细描述和深入研究其背后数学模型的代码可以在这里找到. 我实施了该模型,结果在我的案例中提供的信息多于准确的信息,但稍后会详细介绍。

连接传感器

由于 I²C 是并行总线,每个 I²C 设备都有不同的默认寄存器地址,因此无需更改地址,所有设备都可以直接连接。空气质量传感器具有模拟输出,因此需要一个 ADC。为此,我使用了ADS1115ADC,它也连接到 I²C 总线,允许我读取模拟值作为数字表示。仍然有三个免费输入,将来我可能会用额外的传感器扩展站点。我将温度传感器放置在尽可能远离空气质量传感器的位置,因为空气质量传感器包含一个会变热的加热元件。

 

 
 
 
 
pYYBAGOzleGAGTO3AAJ4_wteu8c101.png
 
1 / 2传感器和 ADC 的接线
 

连接后,我检查了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光传感器TSL2561
  • 0x44温湿度传感器SHT30
  • 0x48ADC 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作为系统客户端将传感器站添加为“事物”。

 

 
 
 
 
pYYBAGOzleSAZVsBAACfSjzGUG4622.jpg
 
1 / 5事物概览
 

 

读取传感器数据

在开发 I²C 传感器读取机制(不断启动线程以读取循环中的数据)时,我意识到每个传感器都会生成大量数据,并且信号中也有一些噪声。为了防止大量数据被转储到日志数据库、规则引擎和整体系统性能上,我必须进行一些过滤。在写这篇文章的时候,系统的阅读间隔是5分钟。这似乎是读取缓慢变化的传感器(如温度、湿度和压力)的好时间间隔。当涉及到快速变化的传感器数据时,例如光强度或空气质量传感器,系统反应缓慢。例如:我打开灯,在最坏的情况下,系统会在 5 分钟后识别出灯光增加。不是很好。当前的光测量非常适合缓慢的日光变化,但在处理快速变化方面并不是最好的。问题在于数据中的巨大噪声,这使得经典的低通/高通滤波或 PID 调节器变得无用,因为你必须进行如此强烈的滤波,以至于失去了快速响应的效果。

也许本文的读者对此问题有解决方案?是否有一种滤波器模型/方法可以在嘈杂信号上实现平滑、良好的数据变化,但对强变化(如开灯)的响应时间快速?

数据解读

我将传感器站放在客厅沙发旁边(因为这是我最想要舒适的兴趣点),我让系统收集数据几天,以查看传感器数据在我的房间中的表现如何环境

在应用程序概览中,我看到了我的电台的当前值。

 
poYBAGOzleaAe2LbAAA4hXScgtI190.png
数据概览
 

早上,当我开始新的一天时,我会打开百叶窗和窗户,因为我的公寓隔离得很好。来自我的新传感器站的数据很好地代表了我的“起床”程序,如下图所示(直接来自应用程序的屏幕截图)。我在早上 8:30 打开窗户 20 分钟。

 
 
 
 
poYBAGOzleiAM_p4AACGP4FnyKE583.png
 
1 / 5温度测量
 

 

  • 打开窗户后,温度下降了约3° C 然后加热将温度调节回所需的 22.5°C。
  • 开窗后湿度明显下降
  • 今天压力慢慢下降,这是一个阳光明媚的冬日。
  • 光照强度在早上显示出一个大峰值。这是阳光直射通过窗户到达传感器,然后太阳升得更高。大约在 10 点 30 分,我打开了第二个百叶窗,在那里你可以看到台阶。中午前后房间的正常亮度约为 1100 勒克斯。然后价值慢慢下降,直到日落。
  • 打开窗户后,空气质量测量值明显下降。数值越低空气越好。如果我将窗户打开大约 2 小时,该值约为 300 ppm。再次关闭窗口后,该值缓慢上升。

下午,当外面天色越来越暗时,我再次检查了传感器数据,结果如下(我没有打开窗户,一个人在这里,我妻子在 16:30 左右下班回家)。

 
 
 
 
pYYBAGOzleqAL7-8AAB-9_aFLt0158.png
 
1 / 5温度测量
 
  • 白天温度升高了一点(天气晴朗)并在下午晚些时候下降(加热再次打开)。
  • 白天湿度上升在 18 点 45 分左右达到顶峰,也就是我真正开始做饭的地方。
  • 压力变化非常小还不确定如何处理这些数据。
  • 光照强度随太阳一起下降。今天的日落时间是 17:53。但是在我的客厅里,大约 17:00 时天已经黑了,那里的亮度约为 80 lux。那就是我要开灯的地方。在这里我们还可以看到我在 18:45 到 19:20 之间打开厨房的灯做饭的时间。
  • 白天空气质量测量值升高在我妻子回家时约 16:30 有一个更大的峰值,因为房间里有两个人在呼吸。我开始做饭时的另一个高峰。

定义规则

在对传感器值有了良好的感觉之后,是时候根据这些数据定义一些规则和操作了。对于我的“问题”,我定义了两个规则。

我调用的第一个规则Air quality notification应该在空气质量不好时通知我,这样我就可以打开窗户,让我的头脑保持清醒和清醒。根据白天收集的数据,我意识到,当 ppm 值高于 2000 ppm 时,我可以感觉到需要新鲜空气(散步后回到房间)。如果这个值只代表 CO2,我可能会死于 2000 ppm,但传感器正在检测多种气体,因此有很大的解释空间。为了进行精确测量,我肯定会选择另一个传感器,但就我的需要而言,它可以胜任。

一旦该值超过 2000 ppm,该规则就会向我的手机和我的媒体中心发送通知。

 
 
 
 
poYBAGOzle2AJzJXAAD4cznrVhM495.jpg
 
1 / 3空气质量通报规则
 

我调用的第二条规则Light sensor rule应该打开我的沙发背景灯,但前提是电视当前处于打开状态。我可以通过两种方式做到这一点,要么检查 Kodi 当前是否正在播放(我使用Mythtv的Kodi PVR 插件看电视),要么通过检测电视是否可访问来使用智能电视插件。这两种情况都适合我。我还可以使用存在传感器插件,它检查 LAN 中是否存在网络设备。如果我的电话或我妻子的电话在网络中,如果光强度低于 80 勒克斯,请打开灯。

 
pYYBAGOzlfGAB6b_AADLuLGwP44301.jpg
电视可达条件下的光敏规则
 

结论

有用!使用室内传感器站 2 个多星期后,我意识到我打开窗户的频率更高了,而且自从使用它以来,我从未突然坐在黑暗中。令我惊讶的是,我在传感器数据中识别出了我的哪些日常行为。由于数据存储在本地和我的,我对收集的数据没有任何不好的感觉。该功能(电话通知除外)不依赖于我的互联网连接

下一步是什么?

我想用我的新传感器站做几件事。一些想法:

  • 建立射频室外站,使用 6LoWPAN 或 Zigbee 向系统发送数据。
  • 添加更多传感器以获得更好的周围信息。I²C 总线上仍有三个可用的模拟输入和大量寄存器。更多数据、更多信息、更多自主行为。
  • 在变暗的同时平滑地增加亮度也会非常好。nymea 中仍然缺少此功能,但希望此功能将很快实现。
  • 对光强度和空气质量进行更好的传感器过滤,以检测峰值,例如:将烟雾吹入传感器或打开灯以获得快速反应行为。也许有人可以帮我?:)
  • 使用FFT检测数据中的重复模式,例如开窗事件、烹饪、招待客人、饮酒。

 

 

 


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !