温室照明的自动化与控制实战演练
发布时间:2020-2-25 16:05
发布者:eechina
作者:Michael Parks 在之前的园艺项目中,我们研究了温度、环境湿度、自身湿度、pH值和CO2含量对植物生长的影响。在本文中,我们将研究植物光合作用的另一个关键因素—光照。本项目将允许园艺工作人员监测和远程控制人工光照。控制环境园艺(CE)是借助数字技术来控制植物生长的一种奇妙方式,它正在成为一种越来越重要的机制,协助稳定地球粮食供应链。与室内垂直农场一样,有时我们的园艺项目无法保证光照度,这时使用人工智能照明就非常重要。 本项目将利用Medium One端到端物联网云平台,允许终端用户监控、自动化和远程控制园艺设施中的人工照明,无论是温室、垂直农场还是其他需要此类功能的环境,都适用。 准备材料 本项目将使用支持快速原型设计的Microchip Xplained开发板系列,以及SAM W25 Xplained Pro评估套件。Xplained开发板搭载基于Arm®Cortex®-M0+的ATSAMD21G18A微控制器。其他关键组件包括: 1、Sparkfun TEMT6000环境光传感器 2、开关电源(额定值为75.6W、2.1A @ 36V) 3、Microchip MIC3202 HB LED驱动器 4、LED灯条 物料清单 物料清单(BOM)如下所示。您也可以访问mouser.com订购所需的零件。截至本文撰写时,以下物料清单的价格约为125美元(USD),其中不含LED灯条。若把LED灯条计算在内,成本也就是400美元多一点。表1列出了物料清单中的物料。 ![]() 工具和其他资源 以下是完成本项目所需的推荐工具列表: 运行Arduino IDE或Atmel Studio 7.0的Windows计算机 Wi-Fi网络(802.11/b/g/n/ac) 剥线钳 数字万用表 尖嘴钳 18AWG或16AWG、300V(最小值)、双线电缆(用于室外照明) Wieland RST 16i2/3母接头 ![]() 图1:Wieland RST 16i2/3连接器适用于可能存在湿气的环境(例如园艺应用) 概览 本项目中使用的传感器和控制器板通过两种方式与Xplained微控制器板进行通信—一种是以数字方式利用脉宽调制信号,另一种是利用微控制器的模数转换器(ADC)所读取的0V-5V模拟信号。 1、MIC3202 HB LED驱动器:MIC3202有两个在逻辑电平电压下工作的控制引脚。第一个是EN(或ENABLE)引脚。此引脚控制输出(-LED和+LED)的开关。如果将EN引脚置高,则功率被输送到LED电源线。相反,如果将EN引脚接地,到LED的输出电压将被切断,从而关闭所有连接到输出的LED。 第二个引脚是DIM引脚,负责控制LED的亮度。DIM引脚寻找脉宽调制(PWM)信号来作为LED亮度的控制信号。改变PWM信号的占空比将导致亮度变化—100%占空比可实现最大亮度,0%将关闭LED。 2、TEMT6000环境光传感器:该传感器的作用类似于一个NPN晶体管,其基极引出端由光照控制。它被配置在共集电极放大电路拓扑中,使输入端的任何细微变化,都能让连接到微控制器模数转换器(ADC)引脚的CE系统输出放大的信号。光线亮度越高,微控制器ADC输入引脚上的电流就越大,电压也越高。 组装电子设备 本项目必须牢记的一点是我们要使用交流电源,安全高于一切。触电和火灾都是潜在的危险,所以要注意硬件和电线插头。要确保电线绝缘,并准备好灭火器。最后,在将电线插入墙上的交流插座之前,检查所有连接线两次。另外还要注意,我是在美国,这里的电压是120VAC,频率为60Hz,您的设备需要根据您所在地区的电气规格进行调整。 本项目的组装步骤如下: LRS 75-36开关电源 1、使用一端带有NEMA 15-5P插头的电缆,露出电缆另一端的火线、零线和地线。 2、用万用表确认插座孔与地线、火线和零线的对应关系。不同电缆的这几根线颜色不一样,所以不要太过依赖下面的图片。 3、将电缆的火线插入电源上标有“L”的插孔。 4、将电缆的零线插入电源上标有“N”的插孔。 5、将电缆的地线插入电源上标有“G”的插孔。 6、取一英尺长的16AWG双线室外照明电缆,并剥去两端。 7、选择电缆的一端,将白线插入电源的V+插孔。 8、将黑线插入电源的V-插孔。 ![]() 图2:电源接线完成。顶部为 NEMA 15-5P插头,底部为16AWG室外照明电缆,连接到LED驱动板 MIC3202 HB LED驱动板 1、使用前面的16AWG双线室外照明电缆的另一端,将白线焊接到VIN双转塔焊接端子上。 2、将黑线焊接到GND双转塔焊接端子上。 3、取一根6英尺长的16AWG双线室外照明电缆,并剥去两端。 4、选择电缆的一端,将白线焊接到LED+双转塔焊接端子上。 5、将黑线焊接到LED-双转塔焊接端子上。 ![]() 图3:双转塔焊接端子 SAM W25 Xplained Pro开发板 1、将MIC3202板上的EN引脚连接到Xplained Pro开发板上的引脚5。 2、将MIC3202板上的DIM引脚连接到Xplained Pro开发板上的引脚7。 3、将MIC3202板上的GND引脚连接到Xplained Pro开发板上的GND引脚。 ![]() 图4:SAM W25板(顶部)、TEMT6000光传感器(左下方)和LED驱动板(右下方) TEMT6000环境光传感器 1、将3引脚公接头焊接到TEMT6000分线板。 2、将TEMT6000板上的“VCC”引脚连接到Xplained Pro开发板上的VCC引脚。 3、将TEMT6000板上的“GND”引脚连接到Xplained Pro开发板上的GND引脚。 4、将TEMT6000板上的“SIG”引脚连接到Xplained Pro开发板上的引脚3。 ![]() 图5:TEMT6000环境光传感器 LED灯条 1、找到连接至MIC3202板的6英尺长16AWG双线室外照明电缆的另一端。 2、将两根裸露的电线插入Wieland RST16i2/3母接头。 3、将Wieland RST16i2/3母接头连接到LED灯条上的Wieland RST16i2/3公接头。 ![]() 图6:项目的功能框图 软件 在这一节,我们将详细介绍本项目中涉及的软件,阐述Microchip Xplained开发板所需的固件和支持文件,以及Medium One沙盒在您的网络浏览器中的设置。您可以根据自己的个人喜好,使用Atmel Studio 7或Arduino IDE来编辑为本项目提供的源代码。 为方便您使用Arduino IDE,Microchip在其GitHub网站上提供了所需的文件。在Arduino IDE中,转到File>Preferences>Additional Boards Manager URLs,然后添加此URL:https://github.com/AtmelUniversi ... le_0.3.0_index.json 本项目的软件分为三部分: 1、微控制器固件,使用C语言编写。 2、向终端用户智能手机和微控制器发送命令并从其接收命令的云应用程序,使用Python编写。 3、Medium One提供的智能手机应用程序,针对本项目专门配置。 Microchip Xplained开发板固件 在微控制器板上运行的固件很简单。代码按顺序执行以下操作: 设置 1、建立到主机的9600波特串行调试连接。 2、尝试连接所需的无线网络。 3、连接到MQTT代理。 4、订阅MQTT代理,此代理为从Medium One发送到微控制器的所有消息提交主题。 5、将各个I/O引脚设置为输入或输出。 主重复循环 6、使用心跳消息轮询MQTT服务器以保持连接。 7、读取TEMT6000环境光传感器的读数。 8、确定系统处于手动还是自动模式。 9、如果是处于自动模式,则通过将0至1023的数字化亮度信号映射到255至0的值来控制在DIM引脚上发送的PWM信号的占空比,从而调整LED亮度。 10、如果处于手动控制模式,则通过将用户智能手机上设置的0%至100%的设定值映射到255至0的值来控制在DIM引脚上发送的PWM信号的占空比,从而调整LED亮度。 11、检查自上次向MQTT代理发送消息以来是否至少经过了1000毫秒。如果是,则向代理发送包含环境光传感器最新读数的新消息。 12、处理从MQTT代理接收的任何消息。 13、将收到的消息输出到串行端口。 14、将有效载荷转换为字符串。 15、确定字符串是否正在请求打开或关闭手动控制;或者确定它是不是应指定为手动亮度设定值的整数。 关于项目中使用的map函数的简要说明——map函数的定义如下: map(value, fromLow, fromHigh, toLow,toHigh) map函数可用于将数字从一个范围映射到另一个范围。例如,模数转换器(ADC)的分辨率为1024,而analogWrite函数只接受0到255的值。map函数接受5个参数,包括: 1、要映射的数字。 2、当前范围值的下限。 3、当前范围值的上限。 4、目标范围值的下限。 5、目标范围值的上限。 map函数将返回映射到新范围的整数。例如: X=map(50, 1, 100, 1, 200); 在这个示例中,x将设置为100,因为50是原来1和100范围内的中间值,而100是新范围内的中间值。 项目文件 以下文件位于:https://github.com/Mouser-Electr ... orticultureLighting。 MicrochipHorticultureLighting.ino:用于本文任务的项目特定代码存储在此文件中。它基于Medium One提供的示例,演示嵌入式设备如何与物联网平台的后台交互。 secrets.h:在使用公开发布的项目时,始终存在泄露敏感数据(如密码或API密钥)的风险。我们可以创建一个未发布的头文件来存储这些信息,而不是直接将这些信息硬编码到固件中,这样就不必在每次Git提交之前更改代码。 库 预处理器指令#include允许我们将库添加到项目中,从而促进代码复用。除非您有非常特殊的需求,否则就不需要再重新编写代码。本项目使用以下库: ArduinoMQTTClient.h:这个库为基于MQTT的服务提供一个方便的接口。 WiFi101.h:这个库提供ATWINC1500芯片接口,以简化与Wi-fi网络的交互。 ![]() 图7:来自微控制器和智能手机应用程序的原始数据流 变量与常量 前几个变量是存储各种必要信息的字符数组。首先,SSID和WPA2是连接到所需无线网络的密钥。接下来,broker和port存储MQTT服务器的URL及其使用的TCP端口。然后,topic和subtopic存储URL路径,并通过MQTT消息从Medium One接收数据或将数据提交到Medium One。最后,pubMessageStart和pubMessageEnd是消息的固定部分,它们将亮度读数发送到Medium One。 char ssid[ ]=SECRET_SSID const char broker[ ]=SECRET_BROKER const int port=SECRET_PORT char pass[ ]=SECRET_PASS const char topic[ ]=SECRET_TOPIC const char subtopic[ ]=SECRET_SUBTOPIC const char pubMessageStart[ ]="{"event_data":{"lux":"" const char pubMessageEnd[ ]=""}}" 接下来,有几个常量用于控制硬件的功能和交互。 const int lightSensorPin=3:设置ADC输入引脚,用于接收来自TEMT600光传感器的输出信号。 const int DIMControlPin=7:将PWM引脚设置为连接到LED驱动板上DIM引脚的输出,用于控制LED的亮度。 const int ENControlPin=5:将GPIO引脚设置为连接到LED驱动板上EN引脚的输出,用于打开或关闭驱动板的输出。 const long interval=1000:将发往Medium One服务器的传输间隔设置为1000毫秒(即1秒)。 接下来,还有几个常量用于控制硬件的功能和交互。 unsigned long previousMillis=0:跟踪上次向MQTT代理发送消息时的时间戳。 unsigned int manualBrightSetPoint=100:存储处于手动控制模式时LED亮度级别的设定值。 unsigned int setBrightPWM=255:将转换后的设定值存储在连接到LED驱动板上DIM引脚的PWM引脚所需的占空比值中。 unsigned int sensorBrightnessReading=0:存储从TEMT6000环境光传感器获取的最新亮度读数。 bool manualMode_ON=false:一个布尔变量,用于跟踪用户希望系统在手动还是自动控制模式下运行。 最后,我们还提供各种类的示例: WiFiClient:创建WiFi客户端类的实例,该实例允许ATSAMD21G18A芯片与ATWINC1500 wifi芯片交互,并建立到Wi-Fi网络的连接。 MQTTClient:创建MQTT客户端类的实例,该实例允许固件通过简单的函数调用与Medium One的MQTT代理交互。 函数 void setup():要运行的第一个函数将初始化所需的许多硬件和软件组件,如串行通信、Wi-Fi连接、传感器接口以及与GPIO引脚的交互。 void loop():这是将持续运行的功能的核心。注意确保主循环的代码尽量简单,并将功能分配给专门的函数承担,每个函数负责执行项目运转所需的某项任务。 void onMQTTMessage(int messageSize):此函数处理从Medium One服务器接收的任何消息。 配置Medium One Medium One为物联网开发人员提供了一个平台,在这个平台上开发人员的物联网设备可以传输和编译来自多个物联网设备的数据集。Medium One提供了一个很棒的教程,介绍如何开始使用其服务。本指南将重点介绍我们在设置Microchip Xplained通过其MQTT API与Medium One通信时遇到的问题。本项目将利用Medium One的MQTT(消息队列遥测传输)协议。MQTT是一个基于发布-订阅的消息传递协议,位于TCP/IP协议之上。与RESTful API相反,MQTT需要一个集中式消息代理。因此,端点设备不能彼此直接通信。这有利也有弊。RESTful API依赖客户机始终启动通信,而MQTT由于使用了发布/订阅(Pub/Sub)架构,允许服务器推送数据。RESTful设备可以直接相互通信。MQTT依赖于集中式消息代理(例如,云中的服务器),在传输此类遥测数据时效率要高得多。 ![]() 图8:Medium One的配置画面 第一步是在https://www.medium.one上创建一个免费帐户。有了帐户后,需要从其Web用户界面的右上角创建一个新项目。 新项目激活后,必须记下Medium One自动生成的一些关键信息,以便后面在固件中使用(具体来说,就是把这些信息存储在secretstuff.h头文件中)。这些关键信息包括: Project ID:这个字母数字字符串是分配给项目的唯一标识符。它让Medium One知道,如果有多个项目托管在他们的web服务上,需要将Microchip Xplained开发板环境数据传送到哪个项目。 API Key:这个自动生成的字母数字字符串,允许我们登录并使用Medium One的API服务。 MQTT ID:每个项目可以有多个贡献者。注意,登录ID与MQTT ID不同。MQTT ID是Medium One生成的字母数字字符串。登录ID是终端用户创建的人类可读字符串。例如“sallymsith”。固件需要的信息是MQTT ID而不是登录ID。 User Password:这是每个用户在为项目建立帐户时创建的密码。出于安全原因,它不会显示在任何地方,因此请务必记住此密码! 接下来,我们确定可以从Medium One 网站的哪个地方获取这些信息: Setup->Project Info:此处将显示Project ID。 Setup->Manage Users:此处包含Login ID和用户的MQTT ID。请记住,固件需要的是MQTT ID,而不是Login ID。 Setup->Manage API Keys:这里可以找到API Key。 固件还需要另外两项关键信息:Medium One MQTT服务器URL(MQTT.mediumone.com)和TCP端口,端口值为61619(非安全)或61620(安全)。最后,我们需要设置一个仪表板,看是否收到了来自Microchip Xplained开发板的数据。为此我们需要: 转至Dashboard并选择Single User Real-Time Events Stream选项。 从下拉框中选择要查看的用户。 这将创建仪表板并开始监听数据。如果绿色播放按钮可见,则单击它开始收听。否则,将有一个红色的暂停按钮,可用于在需要时暂停馈入。 如果一切正常,来自Microchip Xplained开发板的原始MQTT数据包应开始在浏览器中显示。请确保Microchip Xplained开发板通过计算机的USB连接供电,或通过墙壁上的交流电源插座供电。 云和智能手机应用程序 Medium One提供易于使用的资源,创建与物联网设备交互的基本智能手机应用程序。这些应用程序目前仅适用于iOS设备,但预计将来也会支持Android。 对于本项目,请下载Medium One在Apple iOS App Store上提供的专用"IoT Controller"。 ![]() 图9:Medium One Workflow Studio ![]() 图10:将新的小部件添加到智能手机应用程序中 要详细了解设置手机应用程序的步骤说明,请点击查看Medium One的教程。本节将重点介绍此特定项目需要完成的工作。我们将从添加新的小部件开始,让用户控制灯光是自动控制模式还是手动控制模式。 1、在智能手机应用程序上,单击+Add New Widget。 2、选择Switch。 3、在Stream中输入raw。 4、输入“ManualControl”作为标签。 5、单击Done。 6、单击Save。 7、拨动开关并查找要在Real Time Events Stream中显示的消息。 8、回到台式机上,从Medium One仪表板单击Config>Data Streams>Raw。 9、确保raw.manualControl标签勾选了Active复选框。 10、从Medium One仪表板单击Workflow Studio > Create。 11、将其命名为类似“Switch for Manual Control”的名称。 12、在屏幕的右侧,选择Tags & Triggers>raw>manualControl并拖到Studio屏幕上。 13、在屏幕的右侧,选择Modules>Foundation>Base Python并拖到Studio屏幕上。 14、双击Base Python模块并在Script部分输入以下代码: import MQTT mode=IONode.get_input('in1')['event_data']['value'] if(mode == "on"): MQTT.publish_event_to_client('device1','manualControl_ON', encoding='utf-8') else: MQTT.publish_event_to_client('device1','manualControl_OFF', encoding='utf-8') 15、按Save and Activate。 16、拨动智能手机上的开关,确认在打开和关闭manualControl的情况下分别显示manualControl_ON和manualControl_OFF消息。 ![]() 图11:完成时的用户界面(UI) 接下来,让我们创建一个滑块来控制LED的亮度。 1、在智能手机应用程序上,单击+Add New Widget。 2、选择Switch。 3、在Stream中输入raw。 4、输入“ManualBrightnessSetPoint”作为标签。 5、单击Done。 6、单击Save。 7、上下滑动开关,查找要在Real Time Events Stream中显示的消息。 8、回到台式机上,从Medium One仪表板单击Config>Data Streams>Raw。 9、确保为raw.ManualBrightnessSetPoint标签勾选Active复选框。 10、从Medium One仪表板单击Workflow Studio>Create。 11、将其命名为类似“Set Manual Brightness Level”的名称。 12、在屏幕的右侧,选择Tags & Triggers>raw>ManualBrightnessSetPoint并拖到Studio屏幕上。 13、在屏幕的右侧,选择Modules>Foundation>Base Python并拖到Studio屏幕上。 14、双击Base Python模块并在Script部分输入以下代码: import MQTT level=IONode.get_input('in1')['event_data']['value'] MQTT.publish_event_to_client('device1',str(level), encoding='utf-8') 15、按Save and Activate。 拨动智能手机上的开关,确认显示的消息包含0到100之间的字符串值(整数)。 ![]() 图12a:负责处理智能手机交互的后台代码。顶部:设置手动亮度设定值。底部:打开和关闭手动模式 ![]() 图12b:底部:打开和关闭手动模式 ![]() 图13:使用智能手机控制照明 运行中的项目 在项目编译好之后,将Xplained开发板连接到计算机并启动串行终端。您应该能遥测到来自光传感器的数据流以及发往和来自Medium One MQTT代理的MQTT消息。如果没有,请检查是否有错误消息。一些常见错误包括: 1、电源的火线、零线、地线接错。 2、电源或LED驱动板上的V+和V-接反。 3、LED灯条或LED驱动板上的LED-和LED+接反。 4、传感器的电源线和地线接反。 5、如果给设备供电,确保电源至少能提供1A的电流。 6、无线网络未运行,或者SSID/安全密钥输入错误。 ![]() 图14:左侧:亮度约为50%、右侧:亮度约为90% 文章来源:贸泽电子 作者简介:专业工程师Michael Parks是贸泽电子的特约作者,同时也是GreenShoe Garage的所有者。Green ShoeGarage是一个提供定制电子设计的工作室和技术咨询机构,位于马里兰州南部。MichaelParks创办了《S.T.E.A.M. Power Podcast》播客来提升公众对科技的认知,他拥有马里兰州专业工程师资质并拥有约翰·霍普金斯大学的系统工程硕士学位。 |
网友评论