借助A2工业计算机和4G网络,设计智能喷淋系统,实现根据传感器数据定时控制喷淋的功能。
主要设计目标如下:
- 控制大功率喷淋水泵开关
- 接入多种传感器,温湿度、光照、土壤PH等
- 接入物联网平台,采集数据、下发执行命令
- 下发联动策略,由本地规则引擎执行
- 接入星尘平台,监控设备健康状况
- 支持OTA空中升级应用
电气图
采用工业级设备,大功率喷淋水泵,总电气接线图如下:

真实项目中,还需要电箱和开关电源,把这些东西都安装在电箱里面。
这里使用12v圆口电源,通过转接线给A2工控机的欧式端子供电,同时给继电器控制板和温湿度传感器供电。

继电器控制板使用工控机的COM1口,温湿度传感器使用工控机的COM2口,可以在程序中根据实际情况调整。

喷淋水泵功率较大,本身是圆口电源直接给水泵供电,我们让红线正极通过继电器控制,黑线附近直连。
同理,继电器控制板的另外3个继电器还可以控制其它设备,支持220v10A。
务必注意,不要搞混了工控机电源和喷淋水泵电源,接线错误可能损坏传感器(A2工控机有防护功能)。

上电测试
A2-4G自带4G全网通模块以及物联网卡(含1年流量)。
开箱后先给工控机上电测试,此时自动通过4G联网,可在星尘公网查看到该设备。

工控机带有双网口,其中Ethernet1具有DHCP功能,接入网线即可联网。
网线和4G可以同时连接,优先使用以太网,以太网断开时自动切换到4G网络
为了取得较好网络质量,需要连接好4G天线,并把天线放置在高处。

连接设备
安装MobaXterm,接上网线后(不支持4G远程连接工控机),使用SSH连接工控机IP地址(可从路由器或星尘找到),默认账号密码都是feifan。

工控机内部已安装好.NET3.1/5.0,新机器安装有.NET6.0

使用MobaXterm可以很方便的上传下载文件,左边有可视化目录,拖拽文件即可。

agent目录部署有星尘代理StarAgent,默认连接星尘公网 http://star.diyibox.com:6600 ,可以修改为自己的平台地址。
StarAgent设置为系统服务,随系统启动会自动运行。
flower目录部署有喷淋系统程序,并且由StarAgent守护,配置文件 ~/agent/Config/StarAgent.config。
因此,计算机启动时,StarAgent也会拉起喷淋系统程序,即使程序崩溃退出或者认为终止进程,StarAgent仍然会拉起程序(每分钟检查)。
<?xml version="1.0" encoding="utf-8"?>
<StarAgent>
<!--调试开关。默认true-->
<Debug>true</Debug>
<!--证书-->
<Code></Code>
<!--密钥-->
<Secret></Secret>
<!--本地服务。默认udp://127.0.0.1:5500-->
<LocalServer>udp://127.0.0.1:5500</LocalServer>
<!--更新通道。默认Release-->
<Channel>Release</Channel>
<!--应用服务集合-->
<Services>
<ServiceInfo>
<Name>flower</Name>
<FileName>GirlFlower</FileName>
<Arguments></Arguments>
<WorkingDirectory>/home/feifan/flower/</WorkingDirectory>
<AutoStart>true</AutoStart>
<Retry>3</Retry>
<AutoRestart>true</AutoRestart>
<Singleton>false</Singleton>
</ServiceInfo>
</Services>
</StarAgent>程序开发与上传
喷淋控制主要源码
using System;
using System.Threading;
using NewLife;
using NewLife.Log;
using NewLife.Threading;
using SmartOS_A2;
using Stardust;
namespace GirlFlower
{
class Program
{
private static ITracer _tracer;
private static TimerX _timer;
private static TimerX _timer2;
static void Main(string[] args)
{
XTrace.UseConsole();
var star = new StarFactory(null, null, null);
_tracer = star.Tracer;
A2.Led.Tracer = star.Tracer;
A2.Buzzer.Tracer = star.Tracer;
A2.COM1.Tracer = star.Tracer;
A2.COM2.Tracer = star.Tracer;
// 闪灯,闪蜂鸣器
var led = A2.Led;
var buzzer = A2.Buzzer;
for (var i = 0; i < 6; i++)
{
led.Write(i % 2 == 0);
buzzer.Write(i % 2 == 0);
Thread.Sleep(300);
}
var relay = new RelayControl { Modbus = A2.COM1 };
relay.Write(0, false);
//var timer = new TimerX(DoWork, relay, "*/5 * * * * *") { Async = true };
_timer = new TimerX(DoControl, relay, "0 0 6-20/2 * * *") { Async = true };
_timer.SetNext(5_000);
var sensor = new TemperatureSensor { Modbus = A2.COM2 };
_timer2 = new TimerX(DoCollect, sensor, 1_000, 10_000) { Async = true };
Thread.Sleep(-1);
}
static void DoControl(Object state)
{
using var span = _tracer?.NewSpan("OpenControl");
XTrace.WriteLine("开始控制!");
var led = A2.Led;
led.Write(true);
var relay = state as RelayControl;
relay.Write(0, true);
Thread.Sleep(15_000);
relay.Write(0, false);
led.Write(false);
XTrace.WriteLine("结束控制!");
}
static void DoCollect(Object state)
{
using var span = _tracer?.NewSpan("ReadData");
var sensor = state as TemperatureSensor;
// 读取温湿度
var (temp, humi) = sensor.ReadValues();
XTrace.WriteLine("传感器,温度:{0:n1}°C,湿度:{1:p1}", temp, humi);
if (span != null) span.Tag = $"温度:{temp:n1}°C,湿度:{humi:p1}";
}
}
}从代码中可以看到,喷淋系统启动时先让蜂鸣器鸣叫3次,并且闪灯,告知用户系统程序已启动。
然后配置继电器控制和温湿度采集,各自启动一个定时器。
继电器按照Cron表达式定时执行,启动5秒后临时增加一次执行;
温湿度采集是每10秒一次,借助星尘埋点,送到星尘监控平台。
http://star.newlifex.com/Monitors/appDayStat?appId=36

http://star.newlifex.com/trace?id=0a00000c16208351988313e84e048a

后面对接物联网平台后,传感器数据将直接送给平台。
程序发布为linux-arm,然后使用MobaXterm部署到工控机的flower目录下。

上图为部署所必要的文件。

切换到flower目录,给GirlFlower加执行权限 chmod +x GirlFlower 。
然后可以直接跑起来 sudo ./GirlFlower ,注意,控制串口需要管理员权限,因此这里需要sudo。
如果不想加执行权限,也可以用dotnet命令启动 sudo dotnet GirlFlower.dll 。
工控机上电后,让程序先跑一会,去星尘看看是否有正常的数据上报 http://star.newlifex.com/Monitors/appDayStat?appId=36 。
一切正常后,再做电器线路连接。
最后的最后,一定要注意安全,禁止带电接线!!!