在上一篇文章中,我们使用Apache NiFi项目简要回顾了IoT数据的组织和处理。 通过本文,我们将打开一个系列,其中我们将详细讨论每个阶段,从设备本身到DataLake平台分析,机器学习,异常预测等。

现在让我们从第一层开始,即“物”,简称IoT的字母T。 从设备本身,通信通道的组织和MQTT协议的使用。 物联网趋势已经存在了好几年,但是在大多数情况下,它是一个灯泡和一个可以通过电话打开的插座。 但是几十年来,在生产,采矿以及其他各种行业中,已经使用了各种各样的传感器,在生产SCADA中收集了其中的值。 只需将数据流连接到Internet,我们就能获得相同的IoT,更确切地说是IIoT-工业物联网。
如果几十年来SCADA成功地管理了生产周期,为什么所有这些都是必要的?
有以下几个原因:
- 使用传感器的可能性正在扩大,例如在物流中,在特定的卡车或汽车上安装了位置传感器,以及各种其他传感器,例如油耗或停机时间(挂车时在车站等待)-所有这些都超出了本地生产网络
- 设备上的传感器数量正在增长,它们需要更复杂的处理,而这通常不能由企业能力来完成
- 由于计算能力的增长而开发的机器学习和人工智能功能可用于优化生产,搜索瓶颈和识别异常
结果,生产中的传感器不再只是向SCADA发送值。 我们需要一种软件体系结构,该体系结构将使我们能够构建从任何机器上的终端传感器到计算云的链,其中,根据机器的历史记录,使用受过训练的模型,服务人员将收到一条消息,“该机制出现故障的可能性为37%,您需要派遣一名工程师”。

好了,现在回到事情! 通常,为了演示此类系统,使用了一组开放的行业历史传感器指标。 但不幸的是,在此选项下,“触摸”系统无法正常工作。 不,我们不会去工厂,但是我们将做简单的“互联网事”。
我们的活动领域与服务器基础架构有关,但是我们仍然具有一些业余电子技能,因此“物”将是自制的。
我们将选择最简单的监视选项-气候传感器,我们将收集有关温度,湿度和压力的数据。
组件库
我们以BMP280作为传感器。
非常复杂的东西,不仅用于气象数据,而且还由于灵敏的气压计而设计,用于GPS辅助,用于建筑物内的导航(确定楼层),用于帮助加速度计的游戏。 我们将仅将其用于天气数据。
作为一个模块:

作为控制器和通信通道,我们可能已经选择了esp8266 ( https://en.wikipedia.org/wiki/ESP8266 )。
在我们的例子中,ESP-07模块:

电源是9V克朗电池。 由于所有器件均以3.3V工作,因此需要降压转换器。 伸出一只手将每个人都喜欢的线性LD1117放进去 :

但是降低线性转换器的唯一原因是它只是散发热量。 esp8622的峰值电流约为0.4A,这意味着使用线性转换器(9-3.3)* 0.4 = 2.28W到无处。 它也会融化。
因此,在LM2576上组装了脉冲降压转换器:

对每个人来说3安培绝对足够(实际上,然后焊接了来自组件底座的焊料)。
方案
作为CAD,使用了Eagle,该方案如下:

要运行esp8622,您需要将RESET和CH_PD拉至正号(包括模块),将GPIO15拉至负号。 当GPIO0接地时,模块进入编程模式,因此有一个跳线。
GPIO02和GPIO15用作I2C总线的SDA / SDL线,用于连接BMP280,以及总线上的任何其他设备(引脚连接器JP5),例如显示器,用于现场调试。
JP1用于通过UART(通过UART-USB转换器)连接到计算机,以对模块进行编程和调试。
ADC的分压器安装在电阻R6和R5上,以便您可以监视电池电量。
手续费
接线如下:

按照业余爱好电路的最佳传统,它很可能违反了所有可能的规则,但最重要的是,它起作用:)
设备本身证明了这一点:


该板是通过激光熨烫技术制成的(数千个示例之一: http : //cxem.net/master/45.php )。
设备编程
为了快速入门esp8622,他们选择了NodeMCU固件。
NodeMCU是esp8622的Lua解释器,是一堆用于各种设备,传感器,显示器等的库。
要刷新设备,首先需要获取此固件。 该文档提供了多个选项,但最简单的是nodemcu-build.com服务,该服务使您可以通过简单地选择必要的模块来获取现成的固件以用于邮件。

对于我们的设备,您肯定需要选择MQTT,I2C(因为传感器位于此总线上),BME280传感器本身(我们具有BMP280,但该库是通用的)以及用于监视电池的ADC。 组装固件后,服务会将其发送到指定的邮件。
接下来,您需要将GPIO0接地,并将模块置于编程模式(跳线JP2),连接USB-UART适配器并断开电源。
使用NodeMCU PyFlasher执行固件下载。 您需要选择适当的串行端口,固件本身,以及ESP-07模块-Quad i / O,其他模式将不起作用。

稍稍耐心,直到固件完成,然后删除跳线JP2,扭曲电源,最后我们的设备就可以使用用户代码了。
代号
用于连接的UART设置-115200 8N1,通过与某个用于串行端口的端子连接(例如, terminalbpp ),可以直接输入lua命令,例如REPL。

但是我们仍然对较少的临时固件感兴趣,因此在重新启动后,它仍然是:)
启动时,NodeMCU开始从闪存卡执行init.lua文件(如果有)。 在这里我们写它。
对于示例,我们以文档中的示例为例:
为了进行下载,我们使用了简单的实用工具Asmodat ESP LUA Loader 。 她只是将file.open推入终端,并用命令逐行写入Lua。
逻辑如下:
- 初始化设备
- 连接到wifi
- 读取传感器读数
- 我们连接到MQTT经纪人,并发送相关主题的阅读材料
- 关闭WiFi,入睡直到下一次测量
我们布置了Lua脚本,电路板和电路板的布线 ,原则上,那里的一切都非常透明。
我要注意的地方:
ADC esp8266输入需要0到1 V的电压,输出给出0到1024的相应数字。对于电阻39 kOhm和470 kOhm,转换系数约为13。即 为了估算(不是很准确地测量)电池上的电压-您需要将获得的值乘以13,再除以1024。
由于BMP280传感器是通用的,因此它具有针对不同应用的多种配置选项。 对于NodeMCU,用于气候测量的传感器的初始化看起来像这样(一个幻数):
bme280.setup(1, 1, 1, 1, 7, 0) -- weather mode
在文档中阅读有关这些数字的更多信息。 好吧,在上面BMP280的数据板上。
由于某种原因,模块无法唤醒,因此无法进入深度睡眠模式。
使用MQTT的库非常具体,无法确切确定何时关闭连接。 社区对此有很多疑问,没有任何解决方案。 有多种解决方法,例如本文 。
但就我们而言,我们只需要等待几秒钟的超时时间,然后关闭WiFi。
此外,虽然已宣布支持TLS,但未能获得支持,但数据未加密发送。
传送资料
每分钟一次,模块连接到WiFi,并将传感器读数发送到MQTT代理。
MQTT中的主题,格式如下:
/device_location/device_name/sensor
这使您可以按位置和特定传感器(例如,窗口外部的温度)订阅来自传感器的数据流:
/outdoor/
MQTT经纪人
作为MQTT代理,我们使用Eclipse Mosquitto。 例如,要在Debian中进行安装,您需要两个软件包:mosquitto和mosquitto_clients。
在/etc/mosquitto/mosquitto.conf中,您需要编写
require_certificate false
接下来,使用mosquitto_sub实用程序启动我们的设备,订阅设备主题,监视天气)
root@baikal:~
这里提到贝加尔湖是有原因的。 我们仍然位于贝加尔湖附近,因此对于该设备的基站,除了在贝加尔湖T-1核上使用BFK 3.1之外,没有其他选择:)
在后续文章中,我们将继续将从IIoT接收的数据传输到分析和可视化系统,并讨论队列。 当然,关于贝加尔湖:)