DesignSpark Electrical Logolinkedin
菜单 搜寻
提问问题

建立一个连栋温室 - 第2部分

title

用Python,MQTT和Node-RED实施监测和控制

第1部分,我的同事Stuart说明了我们如何挑战去创建一个连接的温室 - 集成传感器和环境控制,那是视觉魅力 , 在继续介绍主要组成部分及涵盖机械设计之前。在这篇文章中我继续完成他未完成的地方,并看看更详细和软件配置的电子设备。

子系统

title

整体系统是由许多较小的子系统组成。温室本身配备了传感器和致动器/输出,而它们被连接到控制单元。

所述LED驱动器容纳的LED恒流电源,其中必须有其240V电源输入 - 而不是低电压输出 - 切换。这也是通过电线连接到控制单元。

一个倾斜的前桌面外壳装有7段显示器和电容式触摸开关,以提供控制,它可以监测环境和手动控制。

控制和控制面板单元都使用MQTT传递信息,这是通过云端,系统配置使得不需要依赖任何外部(Internet)帮助。

最后,可以查看应用逻辑和用靠运行Ubuntu Linux的英特尔计算棒PC显示系统,进入一个网页界面。

每个子系统在下面会更详细地描述,其中不包括像在第1部分中描述PERF板,发光二极管,电阻器和连接器的主要组件。

传感器和执行器

title

title

 

HTU21D和BH1750传感器模块装配到其中一块温室屋顶板,温度及湿度传感器朝下,及光传感器朝上。一个IP68等级12VDC风扇被用作新鲜空气通风源,及在另一端的通气口为温室排气。通气口经由齿轮直流电动机转动,并且所述位置是通过一个凸轮加微感测。园艺LED模块装配在另一块顶板,而其散热片应该独自是足够的,风扇被安装以便使其保持凉爽的感觉。

控制系统(传感器和执行器集成)

title

英特尔Edison被选为嵌入式计算平台,因为它提供了一个紧凑的,但相当强大的Linux系统,配备了闪存存储和无线局域网,同时用大量的GPIO,可以很容易地存取,多亏了Arduino的接口板。

title

一个简单的电路被建立在一个Arduino原型屏蔽,与正在使用的晶体管至12V切换到三个继电器线圈。这些继电器依次切换12V的LED驱动单元加上LED模块散热风扇,排气马达,和温室的通风风扇。第四晶体管连接在Edison的PWM输出,以提供通风风扇的速度控制信号。

title

通风口位置感测经由凸轮和微开关实现的,连接到Edison的输入端,当开关触头闭合,它就会接地。

温度+湿度及光传感器板通过I2C总线连接到Edison。

LED驱动器

title

由于LED驱动器从一个主电源供电,所以决定收纳它在自己的外壳,及使用继电器切换其输入端从控制单元取得信号(12V)。由于Petunia LED模块产生相当强烈的光线,所以决定使用主开关作市电隔离和红色指示灯显示装置是否取得电源。

控制台(传感器显示和手动控制)

title

再次使用英特尔Edison及Arduino接口板作为嵌入式计算平台。电容式触控式开关闭及提供控制输入:

  • 模式:自动/手动
  • 通风:开/关(在手动模式下)
  • 照明:开/关(在手动模式下)

触控式开关还具有其独立运作开关功能的RGB LED。这里决定为使用绿色以指示自动模式已启动和红为手动模式已启动。由于LED需要比Arduino breakout可以安全地供应电流的限制多一点的电流,这些都可以靠BC337晶体管驱动。开关启动时也可以输出Vcc,在这个情况下是12V ,所以这被连接到Arduino输入引脚通过电阻分压器。

云端(应用信息和逻辑)

title

我们是英特尔NUC的忠实粉丝,因为它在很小的体积中包含了很优越的性能,特别是当你利用M.2 SSD存储,而去消除对外置SATA驱动器的需求。我们以前在一些项目中使用Core i5 NUCs,甚至是Core i3几乎肯定是过份优胜,但它的而且确为我们提供了大量的空间。

显示(应用程序的网页界面)

title

运行Ubuntu Linux的英特尔计算棒被选为是一个灵巧的方法去进入用来监控和配置应用程序的网络界面。这个可以简单地被安装在HDMI显视器后面并经由无线键盘和鼠标控制。

软件

title

init-pins-control 文件的一部份

所有子系统都运行Linux,同时也可以使用Arduino IDE来写适用于英特尔Edison的应用程序,我们决定使用Python。我们同样可以已经使用其它语言,如JavaScript或C。

英特尔Edison GPIO多路复用并Arduino接口板增加了缓冲和可选的上拉电阻器,所有这些都可以在Linux GPIO sysfs界面设定,在Control and Console systems分别使用了init-pins-controlinit- pins-console脚本。

title

在启动时,通过init-pins service中的systemd配置去执行pin初始化脚本,上图所示的就是控制系统的例子。

控制

title

控制系统中有两个Python脚本:一个是读取传感器和发布数值在MQTT broker,另一个则是订阅MQTT主题以接收控制消息。

从这些第一主回路: sensors-mqtt-pub,可以在上面看到。该脚本读取温度湿度+光传感器,列出读数到主题:

  • 传感器/温度
  • 传感器/湿度
  • 传感器/光度

如果脚本无法读取传感器,它会列出0.00到主题从而表示故障。每当它成功发布消息,一个红色LED会在Arduino proto shield上闪烁。如果该LED保持持续亮起就意味着它已经发布失败。

title

 

第二个脚本是actuators-mqtt-sub,它订阅MQTT和接收信息从而设置风扇的开/关和速度,打开和关闭通风口,并设置horticultural LED模块的开/关。这方面可以在上面看到,显示出了排气口开/关功能和它一部分是设置风扇速度的功能。一个关Edison的伟大事情是,它具有PWM生成的硬件支持和配置,这是犹如在Linux文件系统写入文件一样简单。

主题关于这Python脚本是:

  • 执行器/照明
  • 执行器/通风
  • 执行器/风扇转速

前两个课题的有效信息是“开”和“关”, 与这些转动Petunia horticultural LED模块开/关,以及打开或关闭排气口,同时也有通风风扇开/关。所述风扇转速主题采用50-100之间的一个数字用于风扇占空比,与任何数量<50造成本被设置为50%和任意数量>100将其设置为100%。

每次脚本接收一个消息都会在Arduino proto shield闪烁绿色LED。如果该LED持续亮起就意味着它没有订阅。

在实践中,如果有一个问题关于发布或订阅MQTT,那么往往是网络或MQTT broker本身的问题,导致所有LED维持亮起。

两个Python脚本需要greenhouse-sensors.service and greenhouse-actuators.servicesystemd才能执行,这确保他们适当的GPIO引脚初始化脚本运行后才开始启动执行。

控制台

title

控制台运行三项Python脚本,其中第一个是 sensor-indicators-mqtt-sub,订阅MQTT并接收传感器读数其用于更新七段LED显示。

title

第二个脚本,switches-mqtt-pub,读取三个电容式触控开关的状态和发布信息到主题:

  • 温室/模式(“自动”或“手动”)
  • 温室/手动/照明(“开”或“关”)
  • 温室/手动/通气(“开”或“关”)

除了发布到MQTT,这个脚本把开关模式的颜色设置为红色或绿色,取决于它的启动了(手动模式)或还没有启动(自动模式 - 默认)。

title

第三个脚本actuator-indicators-mqtt-sub,订阅了以下MQTT主题:

  • 温室/模式
  • 执行器/照明
  • 执行器/通风

如果Petunia LED模块被设定为亮起或通风启动了,照明和通风电容开关的LED 会亮起。然而,它们亮起的颜色 - 绿色或红色 – 亦会用于指示系统是否处于自动或手动模式。

如与控制系统,用于Arduino原屏蔽的绿色和红色LED以指示MQTT发布和订阅的成功和失败。 systemd也再次用*.service文件来设定,在启动同时也开始Python脚本,但要经过GPIO引脚被初始化之后才会发生。

云端

云端系统被配置为运行Ubuntu Linux操作系统和以下应用:

随着配置MQTT,传感器读数可以通过控制系统予以公布,通过Console订阅和用于更新7段LED显示器。电容式触控开关状态也会被读取并发布到MQTT主题。然而,没有进程发布到MQTT主题的用于控制系统的输出,如通风(风机+通风口)和照明(LED模块)。

虽然我们可以通过上述的Python脚本或其他脚本来实行控制逻辑,就做到这一点,可以通过Node-RED,Node-RED是用于连接物联网的可视化工具。因为这将保持其与物理世界接口的代码- 传感器和输出- 适当地简单,同时也使非常迅速新的逻辑原型变得有可能,我们应该希望,与其它系统进行集成,这要归功于Node– RED的能力。

应用程序流程

title

整个Node-RED流程从上面可以看出,在这我们可以在左边看到,我们订阅MQTT主题温度,湿度,光度,随着主题模式开关的状态,通风开关和照明开关。

其中右手侧的发布到MQTT通风,风扇速度和照明的主题。

因为我们对于温室内的温度没有任何控制,我们只需连接这个MQTT主题输出到调试节点,使我们能够由收到的话题打印消息。

title

经由湿度MQTT主题接收到的消息会被输入到一个湿度控制功能。这个会被配置有最大允许湿度,其中如果超过,并且系统是在自动模式下,将导致在通风被接通及在通风主题发布“开启”。

同样地,光水平读数油光控制功能分析,这取决于这些和系统运行模式解析,将发出一个“开”或“关”的讯息,然后发布到照明主题。

title

在流程底部我们有三种功能可以设置全局变量以反映电容式触摸开关的状态三种功能。如果系统处于手动模式,则湿度和光照控制功能将忽略传感器读数,并使用电容式开关状态,以确定是否通风和光照应开启或关闭。

还要注意,每个功能具有附加几行的代码用来更新状态指示,一点就指示自动模式,一个圆圈是手动,而红色是关及绿色是开。例如,湿度控制功能下的绿色圆圈表示,该系统在自动模式和通风是活动的。

title

最后,通风风扇转速经由注入节点设定,可以允许有效载荷进行配置设置。在这种情况下,风扇占空比会发布到致动器/风扇转速主题。

可能的改进

现在,我们有足够的通风和照明通过Node-RED控制,从温度,湿度和光线感应器提供的数据,我们可以非常迅速地更改应用程序逻辑和/或整合其他系统,如通过网络的API,来实现更先进的功能。

一个明显的改进是加快和放慢风扇马达随着湿度增大和减小,而不是简单地切换通风风扇和关闭。而加上温度控制只是很简单的电路通过继电器或者通过一个遥控电源开关用来控制加热器。我们可以很容易地绘制传感器测量和控制输出,添加电子邮件通知等等......这些潜在的改进是无止境的。

总结

title

这是一个有趣的项目,希望演示使用Python简单的脚本可以与一个通用平台,如英特尔Edison,从而快速整合传感器和输出。使用MQTT作为“胶水”,通过Node-RED快速发展的控制逻辑和更先进功能的潜在集成,加快分布式系统的发展。

自定义亚克力组件的设计文件与外壳和Python脚本可以一起在项目GitHub知料库找到。

Andrew Back

Open source (hardware and software!) advocate, Treasurer and Director of the Free and Open Source Silicon Foundation, organiser of Wuthering Bytes technology festival and founder of the Open Source Hardware User Group.

20 Sep 2016, 8:12