原创深度:温室照明的自动化与控制实战演练(二)

作者:Michael Parks贸泽电子

在上一篇文章“温室照明的自动化与控制实战演练(一)”中,我们介绍了本项目中所需的物料清单、工具、其他资源和组装的具体步骤。本文中,我们将详细介绍本项目中涉及的软件以及项目运行中遇到的常见错误。

“”

软件

在这一节,我们将详细介绍本项目中涉及的软件,阐述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/AtmelUniversityFrance/atmel-samd21-xpro-boardmanagerm...

本项目的软件分为三部分:

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-Electronics/MicrochipHorticultureLighting

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》播客来提升公众对科技的认知,他拥有马里兰州专业工程师资质并拥有约翰·霍普金斯大学的系统工程硕士学位。

相关阅读:

温室照明的自动化与控制实战演练(一)

原文链接:
https://www.mouser.cn/applications/automating-controlling-greenhouse-lighting/

该发布文章为独家原创文章,转载请注明来源。对于未经许可的复制和不符合要求的转载我们将保留依法追究法律责任的权利。

最新文章