让后院里的温室也智能起来
引言
在过去的几年中,Arduino得到了稳步发展,从只有学生和爱好者关注的小众平台变身为品类丰富的开发板产品组合。从教育到机器学习,从工业控制系统到物联网,现代Arduino生态系统可以满足各种嵌入式系统的需求。Arduino Pro系列产品提供了强大的硬件,可满足诸多专业应用的严格要求,同时依旧保持了便于编程或集成第三方硬件的特点。
图1:Arduino正凭借其Pro系列产品(例如面向农业的边缘控制板)进入专业工程市场。(图源:贸泽)
Arduino的Pro系列产品针对的此类应用领域之一是农业市场。Edge Control板(图1)是一款功能强大的嵌入式产品,专门用于对农业应用中的各种设备进行远程监控和智能控制,这些设备包括静水压水位传感器和水控制阀等。该板可采用锂离子电池、密封铅酸电池或光伏电池供电,可在两次维护之间长时间运行。此外,它还配备两个MKR板扩展插槽,因而可以快速轻松地添加额外功能,例如传感器或无线连接,让开发人员能够根据需要定制解决方案。例如,根据地点的不同,可能需要从GSM切换到LoRa通信。
图2:在近阶段供应链问题突出的大背景下,温室正越来越受到个人和家庭的欢迎。(图源:Green Shoe Garage)
现如今,后院花园和温室正经历一波现代化的复兴,其原因是多种多样的,例如希望吃得更健康,同时还希望降低食品杂货方面的支出,或者希望能更加自给自足(图2)。在本项目中,我们将利用边缘控制板,通过密切监测温度和阳光照射等环境因素以及可以将环境改变至所需设定点的机制(例如打开风扇以降低温度,或打开生长灯以补偿日照不足),帮助提高温室作物产量。所有遥测数据最终都将发回云端,以便我们远程监控并添加手动控制功能,以便实现最终用户所需的自动化。
项目材料与资源
物料清单
您可以点击此处获取BOM以及其中的物料在贸泽的当前价格。截至本文撰写之时,该BOM需要花费约380美元(不含适用的税费和运费)。表1列出了该BOM中的项目。
表1:远程温室监控和控制BOM
|
数量 |
贸泽编号 |
说明 |
|---|---|---|
|
1 |
782-ASX00029 |
MKR Environmental Sensor Shield |
|
1 |
782-AKX00034 |
Arduino Edge Control板 |
|
1 |
782-ABX00023 |
MKR1010 Wi-Fi板 |
|
1 |
485-1980 |
TSL2591光传感器 |
|
1 |
426-SEN0189 |
水浊度传感器 |
|
1 |
426-SEN0249 |
土壤pH值传感器 |
此外,本项目还采用了一些为重型农业应用打造的硬件,包括三线球阀、静水压水位传感器和继电器控制器,它们都可以从专营农业和其他农产品的零售商那里买到。此外,还需要三枚M3-0.5 x 5mm机螺钉将Edge Control板安装到外壳上。
资源
本项目所有源文件均可从贸泽GitHub仓库获取。该仓库由三个主要文件夹构成,包括:
Documentation
Documentation文件夹包含原理图的图形文件和其他重要参考资料。
图3:Edge Control板的一种安装装置的3D模型。(图源:Green Shoe Garage)
3D Files
3D Files文件夹包含安装支架(图3)的原始文件(多种格式)和STL文件。这些文件是专门为本项目制作的,您可以在方便的时候将它们3D打印出来。
Software
Software文件夹包含源代码文件,包括以下子文件夹和相关文件:
用于温室的MKR 1010板:
- mkr1010.ino
- dfr_turbidity_sensor.h
- dfr_soil_ph_sensor.h
- system_settings.h
- thing_properties.h
- arduino_secrets.h
用于温室的Edge Control板:
- edgeControl.ino
有关这些文件的更多信息,将在后文“软件开发”一节中进行介绍。
构建项目
Edge Control板可以完成的任务是多种多样的,围绕Edge Control平台构建的每个解决方案都可以根据特定温室的特定需求进行定制。对于本项目的特定工作而言,我们需要监控以下变量:
- 环境温度
- 相对湿度
- 照度(全天的英尺烛光读数)
- 土壤pH值
- 水浊度
您可能会觉得水浊度(水中的悬浮颗粒物数量)这一项对温室而言有些奇怪。这是因为,在本项目的特定温室中,客户使用了一个小型的金鱼池来产生“肥料”,以可持续的方式维持植物生长。
除了监测温室内的环境外,我们还希望增加对以下设备的自动和手动控制:
- 通风风扇
- 水阀
硬件设置
本项目的温室中已经具备Wi-Fi连接,接下来的工作就是通过MKR1010板在Edge Control板和Arduino IoT Cloud服务之间实现双向通信。除了Wi-Fi外,GSM、LoRa、Sigfox和NB-IoT网络也有相应的解决方案。为了让设备能够根据需要在温室内移动,它将由密封的铅酸电池供电。
虽然MKR Environmental板自带了光传感器,但我们并不会用到它,因为Edge Control板(图4)需要安装在避开阳光直射的位置,从而确保测量到真实的环境温度,同时也避免由于直接暴露在阳光下而导致过热。然而,我们又确实需要测量植物接受阳光照射的量和持续时间,因而需要外接一个有线光传感器来收集阳光照射的数据点。
图4:Arduino Control板的关键特征。(图源:Arduino)
组装这些电子硬件的过程是非常轻松的,只需少量工具即可完成。我们这就开始吧:
1. 将钮扣电池放入Edge Control板的钮扣电池槽中,留意电池的极性。注意:这一步非常重要,如果Edge Control板没有正确装入电池的话,可能会导致开发板损坏。切记!
2. 将MKR1010板(图5)插入到MKR2扩展槽中。请务必确保MKR1010板正确插入到Edge Control板的扩展槽中,因为MKR板并未做标注,很容易插错。
3. 将MKRENV Environmental Sensor Shield插入到MKR1010板上,并确保插入正确,因为开发板上没有做标注,容易插反。
图5:Arduino Edge Control板有两个与MKR外形尺寸兼容的扩展端口。(图源:贸泽)
至此,Edge Control板的数据处理和通信组件已全部组装完毕。接下来,我们需要把传感器和执行器添加到Edge Control板上。由于主体组件需要避免阳光直射,因而需要将一个外部TSL2591光传感器(图6)连接到MKRENV,并将该传感器放置在温室内直接暴露在阳光下的位置。下面,我们就开始安装这个外部传感器:
图6:TSL2591光传感器Breakout板。(图源:贸泽)
1. 将公头焊接到TSL2591光传感器Breakout板。
2. 将一根电缆的一端连接到Breakout板的SCL引脚,另一端连接到MKR1010的D12引脚(D12也连接到硬件I²C控制器)
3. 将一根电缆的一端连接到Breakout板的SDA引脚,另一端连接到MKR1010的D12引脚(D12也连接到硬件I²C控制器)
4. 将一根电缆的一端连接到Breakout板的GND引脚,另一端连接到MKR1010的GND引脚。
5. 将一根电缆的一端连接到Breakout板的VIN引脚,另一端连接到MKR1010的3.3V或5V引脚。Breakout板包含将5V降压至3.3V的硬件。
本项目使用静水压水位传感器(图7)监测鱼缸中的水位,并控制一个三线电动球阀来根据需要加水。具有传感机制的分压器电路充当可变电阻器,以将水位高度转换为电压。水阀的状态和水位的测量值将通过基于I²C的RPC反馈给MKR1010板,并在随后发送到Arduino IoT Cloud。下面,我们先把三线电动球阀连接到Edge Control板:
图7:一款三线电动球阀。(图源:Green Shoe Garage)
1. 将球阀的GND电缆连接到Edge Control板的5V Analog In引脚。
2. 将球阀的OPEN电缆连接到Edge Control板的J9 Latching Out 1P引脚。
3. 将球阀的CLOSE电缆连接到Edge Control板的J9 Latching Out 1N引脚。
Edge Control板上有包含驱动器的锁存输出端口,因此不需要外部驱动器。锁存输出引脚以VBAT为基准。
接下来,让我们将注意力转向静水压水位传感器。此类传感器的工作原理是将流体施加在传感膜片上的压力头转化为信号,该信号与压力成正比。这种信号可以是4-20mA电流或0-10Vdc电压。需要注意的是,0.1bar的压力等于1m的流体深度。要连接静水压水位传感器,请执行以下步骤:
1. 将传感器的中性线连接到J8-17引脚(适用于所有静水压水位传感器,J8-18也用作中性线)。
2. 将传感器的模拟信号线连接到J8-1引脚。
浊度测量是衡量封闭水体水质的一种方法。浊度的定义是由悬浮在流体中的颗粒引起的浑浊程度。对于本项目中的温室,我们需要关心的是水不会因为养鱼而变得太脏。浊度传感器(图8)将连接到MKR1010,并按以下方式接线:
图8:浊度传感器用于测量流体的浑浊程度。(图源:贸泽)
1. 使用随附的线束将传感器连接到适配器板。
2. 将传感器适配器板的GND引脚连接到MKR1010的GND引脚。
3. 将传感器适配器板的5V引脚连接到MKR1010的5V引脚。
4. 将传感器适配器板的OUTPUT引脚连接到MKR1010的A0模拟输入引脚。
5. 将A or D开关设置到A(模拟)位置。
最后,我们还需要监测土壤的pH值,以确保土壤含有适当平衡的矿物质,尽可能提高温室内蔬果等植物的产量。我们按照以下步骤将土壤pH值传感器(图9)连接到MKR1010:
1. 使用BNC连接器将尖头pH传感器连接到适配器板。
2. 将传感器适配器板的GND引脚连接到MKR1010的GND引脚。
3. 将传感器适配器板的5V引脚连接到MKR1010的5V引脚。
4. 将传感器适配器板的OUTPUT引脚连接到MKR1010的A2模拟输入引脚。
图9:pH值传感器用于监测土壤的健康状况。保持土壤健康是植物成功生长的关键。(图源:贸泽)
设置软件开发工具链
本项目的固件使用Arduino IDE开发,可从此处下载该软件。默认情况下,对Edge Control和MKR1010进行编程所需的库并不会随着IDE一起安装,所以我们需要用“开发板管理器”向导来获取这些库。请搜索以下开发板系列:
- Mbed OS Edge Boards
- SAMD Boards
外部光传感器、MKRENV传感器板、Arduino IoT Cloud连接以及板间通信都需要额外的支持文件。Arduino IDE内置的“库管理器”中提供以下库,请务必让IDE向导也一并下载所有的支持库。
- Adafruit_TSL2591.h
- ArduinoIoTCloud
- Arduino_ConnectionHandler.h
- Arduino_MKRENV.h
- openmvrpc.h
软件开发
本项目提供了一个独特的机会来学习如何让两个独立的嵌入式处理器相互通信。Edge Edge Control充当的是“载板”(好比台式机中的主板);MKR1010则被视为“扩展板”。两块板之间的通信将通过远程过程调用 (RPC) 完成。
图10:本项目的代码分成许多文件,采用派生自C语言的Wiring语言编写。(图源:Green Shoe Garage)
如果您有在Arduino生态系统中编程的经验,就不会在对Edge Control编程时感到陌生。但是,它们之间仍然有足够显著的差异,所以还是值得您花时间阅读Edge Control库的文档。这些新款“Pro”开发板适合在高要求的环境中运行,同时不牺牲Arduino标志性的开发便利性。简而言之,我们可以认为这些产品对Arduino核心代码库进行了扩展,将新的高级功能包含在内,使开发人员能够轻松地对接Edge Control特有的硬件功能,如静水压水位传感器输入、锁存继电器命令输出和电流隔离固态继电器。
Edge Control板的编程是通过板载的micro-USB端口完成的。注意,此USB端口仅用于对开发板进行编程,不能用于在现场为Edge Control板供电。
在GitHub仓库中项目结构的Software文件夹中,可以找到本项目所需的五个文件。其中,.ino后缀名的文件将会加载到微控制器上,这些文件包含每块开发板所要执行的核心功能;.h后缀名的文件旨在分隔敏感数据,并且/或者将核心与传感器、执行器互动的代码从.ino文件中分离出来,从而降低源代码的复杂性,使之更容易阅读和调试。
项目特定文件
以下是专门为本项目创建的特定文件:
- mkr1010.ino
- dfr_turbidity_sensor.h
- dfr_soil_ph_sensor.h
- system_settings.h
- thing_properties.h
- arduino_secrets.h
- edgeControl.ino
Edge Control库特有的函数
如前所述,Edge Control库中包含许多特有的函数,要正确操作这款开发板,就必须了解这些函数。除了标准的Arduino函数、变量和控制结构之外,Edge Control库还添加了额外的代码,以便与其特有的硬件组件无缝交互。以下是其中一部分特有函数:
- EdgeControl.begin():将Edge Control板初始化为默认电源设置。
- Power.on(PWR_3V3):打开3V电源轨。
- Power.on(PWR_VBAT):打开5V电源轨。
- Power.on(PWR_MKR2):为#2扩展板接口上的VIN引脚供电。
- Expander.begin():启用扩展引脚。
- Latching.begin():将扩展引脚配置为输出。
- Watermark.enable():初始化操作水位传感器的内部硬件。
- Watermark.calibrationMode(OUTPUT):将水位传感器引脚的校准模式设置为输出(类似于pinMode函数)。
- Watermark.calibrationWrite(LOW):通过短暂接地的方式将水位传感器引脚的输入归零。
- Watermark.begin():将水位传感器引脚置于正常工作状态。
- Watermark.commonMode(OUTPUT):将水位传感器置于通用工作模式。
- Watermark.commonWrite(HIGH):将水位传感器输入引脚设置为高电平。
- Watermark.analogRead(pin):读取水位传感器输出上的电压。
关键变量和常数
必须编辑arduino_secrets.h文件中的两个变量,MKR1010才能连接到Wi-Fi网络:
- SECRET_SSID "您的网络SSID"
- SECRET_PASS "您的WIFI密码"
MKR1010连接到互联网后,就必须连接到Arduino IoT Cloud。这是通过在设置过程中提供给您的两个变量来完成的。这些变量存储在thing_properties.h文件中:
- THING_ID "您的THING-ID"
- BOARD_ID "您的BOARD-ID"
在system_setting.h文件中,有许多变量可供调整,以便根据您的要求校准设备。这些变量包括:
- NUM_SENSOR_READINGS_TO_STORE 10:在实际操作中,我们最好不要根据单个传感器数据点来做决定,而是要取一个运行平均值。本项目中,我们使用的是最近十个传感器读数的运行平均值。
滞后是控制系统的一个重要概念。它被定义为一个系统的状态对其历史的依赖性。本项目中,我们根据感应到的环境温度来控制一台风扇。如果温度经常在设定点附近上下浮动,风扇就会快速启动和关闭,这可能会导致故障。复杂的系统会采用比例-积分-微分 (PID) 控制器来缓解此类问题。对于不太复杂的系统,使用两个不同的设定点就足够了,就像本项目所做的那样。对于温度和风扇控制而言,只要温度达到90华氏度,风扇就会启动,但必须在温度降到87华氏度以下后,风扇才会关闭。这种做法可以防止风扇在温度徘徊在90华氏度上下几分之一度的情况下快速启动和关闭。这些变量可以而且应该根据您的需要进行修改。
- const float TEMP_HIGH_HIGH = 90.0
- const float TEMP_HIGH_LOW = 87.0
- const float TEMP_LOW_HIGH = 53.0
- const float TEMP_LOW_LOW = 50.0
- const float HUMIDITY_HIGH_HIGH = 63.0
- const float HUMIDITY_HIGH_LOW = 60.0
- const float HUMIDITY_LOW_HIGH = 33.0
- const float HUMIDITY_LOW_LOW = 30.0
- const float PRESSURE_HIGH_HIGH = 1000.0
- const float PRESSURE_HIGH_LOW = 995.0
- const float PRESSURE_LOW_HIGH = 905.0
- const float PRESSURE_LOW_LOW = 900.0
- const float LOW_WATER_MARK = 0.74
- const float HIGH_WATER_MARK = 1.5
- const float MAX_ALLOWABLE_TURBIDITY = 1.0
注意:Edge Control板的文档大量采用了auto(自动)数据类型。与int(整数)、float(浮点)或bool(布尔)一样,auto是一个数据类型关键字。与前三种数据类型的不同之处在于,auto让编译器在初始化时推断出实际的数据类型。这有助于代码重用,避免了转换的需要,并且有助于提高鲁棒性(例如,如果一个函数的返回类型发生变化,代码仍然可以运行)。需要注意的是,如果auto变量在声明时未能初始化,将导致编译时错误。
将开发板连接到Arduino IoT Cloud
本项目将利用Arduino物联网云来提供云后端,以整合来自我们传感器的数据,并允许最终用户远程控制他们的设备(图11)。开发人员可以通过Arduino IoT Cloud优雅地以图形的方式来显示传感器数据和控制,并从浏览器和专用的智能手机应用(iOS和Android)均可用)来访问这些内容。有关将MKR1010连接到Arduino IoT Cloud的更多信息,请参见此处。继续操作之前,必须完成此步骤。
图11:基于Arduino IoT Cloud平台构建项目,开发人员可以通过快速简便的方法为其物联网解决方案创建基于智能手机和浏览器的应用。(图源:Green Shoe Garage)
接下来,我们还有必要创建一个仪表盘,记录我们的设备向Arduino IoT Cloud发送的各种相关数据点。有关创建仪表盘的更多信息,请单击此处。
总装和安装
现在是最后组装的时候了。首先,从Arduino Edge Control板上卸下MKR1010板,好让三个安装点中的一个露出来。使用三枚M3-0.5 x 5mm机螺钉将Edge Control板装进安装装置(图12)。
图12:将Edge Control板装进安装外壳中,可以提供保护并简化Edge Control板的安装。(图源:Green Shoe Garage)
接下来,在温室中找一个不会让设备暴露在直射阳光下的地方,并根据情况使用四个木螺钉安装妥当,然后根据需要排布外部传感器的电缆。
-最后,还有几点故障排除提示:
- 不要忘记将浊度传感器的A or D开关设置到A(模拟)位置。
- 确保在温室内可以访问本地Wi-Fi网络,必要时可使用Wi-Fi扩展器。
- 确保土壤pH值传感器已按照规定的准则进行了校准。
- 只有在土壤湿润的情况下,尖头pH值传感器才能准确地测出pH值。
- 确保在Edge Control板的电池仓中安装质量合格的钮扣电池。
- 温室可能是一个比较肮脏的环境,所以务必确保电路板上没有可能导致短路的碎屑。如果环境中很容易出现大量碎屑和灰尘,则可能需要将设备安装在密封性更好的外壳中。
- 本项目的外部电缆较多,所以务必确保连接牢固。其中,要特别留意电池为Edge Control板、球阀控制器和静水压水位传感器供电的电缆。
实际运行
本项目完成总装并安装到温室后,就可以开始通过智能手机来监测和控制温室了。请确保设备已通电,然后等待几秒钟,让设备与互联网建立连接。在iOS或Android设备上启动Arduino IoT Cloud Remote应用,然后导航到之前创建的仪表板。
图13:在所有的辛勤工作之后,水果、蔬菜和美丽的花朵就是回报。(图源:Green Shoe Garage)
在本项目提供的代码中,可以通过浏览器或智能手机应用切换手动操作模式和自动模式。此举使用户能够远程控制风扇或照明,而不必考虑当前的条件或设定点。
整个项目启动运行后,温室就实现了完全监控和自动化。不过,本项目还是可以通过许多可用的I/O和扩展功能来实现扩展,以满足您的需求。此外,请务必根据您所在地区的气候特点和您种植的植物类型来配置设定点。如果您不确定合适的条件,我们建议您向当地的园艺师或苗圃咨询更多信息。
作者简介
专业工程师Michael Parks是Green Shoe Garage的所有者。Green Shoe Garage是一家提供定制电子设计的工作室和技术咨询机构,位于马里兰州南部。Michael Parks创办了《S.T.E.A.M. Power Podcast》播客来提升公众对科技的认知。他拥有马里兰州专业工程师资质,并拥有约翰·霍普金斯大学的系统工程硕士学位。