基于 Intel Edison 的植物监控和浇水系统,用于农业物联网,通过 Matlab 驱动的实时数据分析到 ThingSpeak 频道






4.50/5 (2投票s)
使用物联网传感器网络也可以实现农业现场的监控和控制。
目标
你可能已经读过、听过、见过或看过一些形式的植物监测系统,无论是嵌入式还是物联网的。说实话,我们都爱植物,任何黑客或多或少都曾想过构建一个系统来照顾植物的健康并观察它。那么,这篇文章与其他类似的众多项目有什么不同或独特之处呢?嗯,如果你观察过大多数农用物联网项目,它们的目标是相似的
- 收集土壤和环境参数
- 数据可视化
- 远程或自动触发灌溉/浇水系统
Windows Azure、IBM Watson 等许多平台都提供对收集到的传感器数据的机器学习。但它们不是免费的,而且你找不到太多展示完整农用物联网堆栈的用例示例。因此,我们想构建一个“穷人的农用物联网堆栈”,并提供一个可完全演示的原型。在印度这样的发展中国家,如果我们期望农民在 IT 预算上花费云服务,我们可能是在要求一个不可能的场景。即使是硬件成本对他们来说也是一笔开销,因为他们面临着从及时获得合适的种子和杀虫剂到收获和销售的极端挑战。增加数据监控的经常性成本也不是一个可行的解决方案。另一方面,随着手中技术的不断进步,正确的适应可以带来更好的农作物和产量。在这个项目中,我们试图为常规的农用监测和控制构建一个可行的解决方案,并集成一个基于聚类技术的有效数据分析方案。我们为此使用了 ThingSpeak 的免费框架。收集到的数据在终端节点使用 Matlab 进行分析。
引言
整个工作方法可以总结为以下几个模块。
物理参数监测
我们使用了光敏传感器(LDR)、温度传感器(Seed Studio 温度传感器)、雨量传感器(基于电阻的电位器)、土壤湿度传感器(……),并将这些传感器连接到 Arduino 兼容的扩展板的模拟端口,该扩展板连接到 Intel Edison 设备。这些模拟端口是 10 位精度,因此,我们得到的传感器的 A/D 值在 0、1、2、3 的范围内。通过使用下面的公式,这些值会被进一步转换为精度参数值。
数据显示
观察到的数据在彩色 LCD 上显示,用于本地观察参数。
数据集成到云端
我们使用 thingspeak 物联网网关,通过 http 套接字来缓解此数据,使用 thingspeak 提供的 API 密钥进行编码。一旦数据被集成到 thingspeak,它就可以从世界任何地方实时观察。
警报生成
我们将温度阈值定义为 40 摄氏度,光照强度为 70 摄氏度以上,土壤湿度低于“0”,这被视为不适合植物生长的条件。如果出现这种情况,农民将通过 matt 通道收到通知。
温度=1/ (Math.log (电阻/10000.0)/B+1/298.15)-273.15
lp= lightVal*100
// 光照强度(百分比)var soilVal=1023-soilSensor.read()
soilVal=soilVal*100/1023
// 土壤湿度(百分比)var rainfall=1023-rainSensor.read()
rainfall = rainfall*100/1023
// 降雨量(百分比),尽管以毫米为单位会是更好的度量
灌溉控制
我们通过继电器使用了一个 230 伏的泵,并将其连接到 Intel Edison 板的数据端口。灌溉系统通过 MQTT 协议与农民连接,MQTT 是一种高保证队列、低延迟的通信协议,农民可以通过该协议生成控制灌溉系统开启和关闭的特定命令。一旦 Intel Edison 异步接收到相应的命令,它就会根据命令触发继电器开关。
数据分析
我们添加了一种基于 MATLAB 的数据挖掘技术,通过这种技术,我们不仅可以观察环境的值,还可以预测它们的未来值。因此,农民可以为未来的状况做好准备,这是通过直接部署在云端的 Matlab 分析代码完成的。
范围和挑战
我们的主要目标是提供一个能够帮助提高作物生产力的架构,特别是针对印度农民。然而,它可以适应广泛的应用,包括采矿,采矿领域的参数监测是一个非常重要的状态。随着时间的推移,由于对采矿领域环境数据的了解不足,已经导致了许多生命的丧失。这项工作还可以应用于其他广泛的监测,例如,在特定土壤条件下进行生物反应,这可以在沼气项目中观察到,提出的架构还可以应用于城市中流行的屋顶花园、小型家庭花园、家庭监测等。
尽管物联网架构正在发展,预计到 2020 年底将达到 200 亿,并且已经出现了许多物联网设备,降低了这些设备的价格,但这些设备仍然相当昂贵。同时,物联网架构需要无缝的互联网连接,这在印度的许多地区仍然难以获得。因此,所提出的架构对物联网网关、互联网连接、可用带宽和互联网接入资费的依赖是这项工作的主要缺点,此外,当前的成本水平有时对小型农民来说是难以承受的。
硬件和软件要求
硬件要求
- Intel Edison
- 适用于 Intel Edison 的 Arduino 兼容扩展板
- 传感器:温度、LDR 光传感器、湿度传感器和雨量传感器
- 执行器:继电器、水泵
- 9v 外接电源/移动电源
- 互联网连接(Wi-Fi)、3G
- Intel 处理器 PC(最低 2 GB RAM,iCore3 及以上处理器)
- Android 手机(Android 4.0 及以上)
- Seed Studio Groove Kit
软件要求
- Edison 的 Linux Yocto 操作系统
- IDE:Intel XDK IoT 版
- 语言:JavaScript (Node.js)
- Windows 7 及以上操作系统(最好是 64 位)
- PuTTY
- WinSCP
- 物联网网关:ThingSpeak, IFTTT
- 物联网协议:MQTT, HTTP
系统设计
框图/系统架构
感应到的数据通过物联网网关集成到 thingspeak,thingspeak 提供实时可视化。我们使用轻量级通信协议 MQTT,通过该协议,我们可以通过控制继电器来控制灌溉。
数据流图
由于我们以传感器的数据输入,这些数据在物联网中进行分发,并在 thingspeak 上进行实时可视化。
序列图
用例图
组件图/上下文图
下面显示了系统的组件图,其中 Intel Edison 板包含传感服务、决策和记录。决策是关于通过继电器控制灌溉。
电路图
注意:Grove 套件不包含雨量传感器和植物湿度传感器或湿度计。您需要单独购买。如果您不生活在 Grove 组件可用的国家,那么您可以选择 Arduino 兼容的湿度计和雨量传感器,并将其与 Edison 连接。
您可以使用此视频学习如何将不兼容的组件与 Intel Edison 连接。
编码
让我们先看完整的 Node.js 代码,然后再逐个模块进行查看。
var mraa=require('mraa');
var sys = require('sys')
var exec = require('child_process').exec;
function puts(error, stdout, stderr) { sys.puts(stdout) }
///////// Make connection seeing these pins or change acc to your connection///////
var tSensor=new mraa.Aio(0);
var ldrSensor=new mraa.Aio(1);
var rainSensor=new mraa.Aio(3);
var soilSensor=new mraa.Aio(2);
var relay=new mraa.Gpio(4);
////////////////////////////////////////
relay.dir(mraa.DIR_OUT);
var LCD = require('jsupm_i2clcd');
var myLCD = new LCD.Jhd1313m1(6, 0x3E, 0x62);
var B=3975;
//////////////// Plant Watering////////
var mqtt = require('mqtt');
var client = mqtt.connect('mqtt://iot.eclipse.org');
client.subscribe('rupam/Agro/#')
client.handleMessage=function(packet,cb)
{
var payload = packet.payload.toString()
console.log(payload.length);
payload = payload.replace(/(\r\n|\n|\r)/gm,"");
//console.log(payload.length)
console.log(payload)
try{
//payload=".9 "
var state=Number(payload.trim());
if(state==1)
{
relay.write(1);
setTimeout(null,5000);
relay.write(0);
}
else
{
}
}catch(ex)
{
console.log(ex.message);
}
cb()
}
/////////////////////////////////////
Loop();
function Loop()
{
var a=tSensor.read();
var resistance=(1023.0-a)*10000.0/a; //get the resistance of the sensor;
var temperature=1/(Math.log
(resistance/10000.0)/B+1/298.15)-273.15;//convert to temperature via datashee
temperature=Math.floor(temperature * 100) / 100;
//setTimeout(Loop,1000);
console.log("temparature="+temperature);
var lightVal=ldrSensor.read();
var lp=lightVal*100/1024;
lp=Math.floor(lp * 100) / 100;
console.log("Light %"+lp);
var soilVal=1023-soilSensor.read();
soilVal=soilVal*100/1023;
soilVal=Math.floor(soilVal * 100) / 100;
console.log("Moisture="+soilVal+"%");
var rainfall=1023-rainSensor.read();
rainfall=rainfall*100/1023;
rainfall=Math.floor(rainfall * 100) / 100;
console.log("Rainfall="+rainfall+"%");
myLCD.clear();
myLCD.setColor(255,0,0);
myLCD.setCursor(0,0);
myLCD.write(""+temperature);
myLCD.setCursor(0,5);
myLCD.write("'C");
myLCD.setCursor(0,8);
myLCD.write("L="+lp);
myLCD.setCursor(1,0);
myLCD.write("R="+rainfall+"%");
myLCD.setCursor(1,9);
myLCD.write("M="+soilVal+"%");
console.log("\n----------------------\n");
///////////// Update ThingSpeak/////////////
s="curl \"http://api.thingspeak.com/update?
api_key=NH0EDP5F7TQSAH90&field1="+temperature+"&field2="+lp+
"&field3="+ soilVal+lp+"&field4="+ rainfall+ "\"";
exec(s);
//////////////////////////////////////////
setTimeout(Loop,15000);
}
正如我们在 C 语言中使用头文件 <stdio.h>
来包含库一样,在 JavaScript 中,我们使用 require
函数来使用模块。
var mraa=require('mraa');
var sys = require('sys')
Node.js 中有两种类型的库:用户模块和代码模块。JavaScript 也支持一些模块,因此我们不必包含 Jayson、数学库。任何用户定义的库都可以使用 npm
命令与 JavaScript 一起安装,因此 Node.js 有一个仓库,我们可以将我们的模块推送到那里,用户可以通过 npm install
命令简单地下载。
var exec = require('child_process').exec;
function puts(error, stdout, stderr) { sys.puts(stdout) }
Intel Edison 使用一个名为 mraa
的库来访问引脚,该库也适用于 Raspberry pi 和其他设备。主要目标是将数据推送到 ThingSpeak。当我们尝试将数据推送到 ThingSpeak 时,我们需要使用“http
”方法,如 get 和 post 方法。好的一点是,在 Unix 中,我们可以从命令行打开任何网站,即通过给出 curl
命令。curl
是一个命令行 url,如果任何用户输入 curl google.com,整个内容都会通过网站的命令行部分传递,页面将显示给用户。我们使用 curl
命令调用 ThingSpeak API,这是一个 Unix 系统命令,它将使用一个名为 sys
的库,该库提供对所有 Unix 系统命令的访问。sys
将作为一个子进程执行,因为 Node.js 是单线程运行的。Puts
是一个将所有标准错误输出到命令提示符的函数。
我们定义了四个传感器,它们连接到模拟输入。土壤湿度传感器、雨量传感器、光传感器和温度传感器分别连接到模拟 0、1、2 和 3 输入引脚。还有一个通过继电器控制水,该继电器连接到端口号 4。
var tSensor=new mraa.Aio(3);
var ldrSensor=new mraa.Aio(2);
var rainSensor=new mraa.Aio(1);
var soilSensor=new mraa.Aio(0);
var relay=new mraa.Gpio(4);
当使用 Gpio 时,我们需要指定它是输入还是输出。每个通用数字引脚都可以接收数据并用于控制,同时也可以用于读取数字数据。但 Gpio 同时只能是输入或输出。
var LCD = require('jsupm_i2clcd');
var myLCD = new LCD.Jhd1313m1(6, 0x3E, 0x62);
var B=3975;
i2c 库代表集成电路到集成电路通信。i2c 是一种用于两个芯片之间通过串行通信进行通信的协议。在 LCD 中,数字 6 是 i2c 的协议地址,0x3E 是 LCD 的硬件地址,0x62 是 i2c 端口的硬件地址。通过给出此命令,我们可以初始化 LCD。
var MQTT = require('MQTT');
var client = MQTT.connect('MQTT://IoT.eclipse.org');
client.subscribe('rupam/Agro/#')
client.handleMessage=function(packet,cb)
{
var payload = packet.payload.toString()
console.log(payload.length);
payload = payload.replace(/(\r\n|\n|\r)/gm,"");
console.log(payload)
});
Loop();
我们使用 MQTT 协议,它不是代码库的一部分,但通过该应用程序我们可以连接到“IoT.eclipse.org”并订阅“rupam/Agro
”通道。每当有消息到达 MQTT 时,将调用以下函数。这是一个事件处理,因此每当有消息到达 MQTT 时,一个模块就可以通过 Node.js 中的某种称为 packet 的东西与其他模块通信。Packet 将包含两个字段,即 topic
和 payload
字段。Node.js 是全局的,因此从一个模块到另一个模块,数据通过 packet 而不是变量进行通信。好处是它使用 packet。模型可以位于本地或远程。在 topic 和 payload 字段中,我们使用 payload。由于我们订阅了特定的通道,因此当我们向通道推送数据时,我们将收到一个 packet,因此用户不必检查 topic。在 MQTT 中,用户需要留出一些空格,标签行将替换为字符。
将 payload 转换为数字,如果大于 0,则在这种情况下,我们将继电器保持为 1,否则继电器将关闭。同样,当状态为 1 时,继电器将打开。在此代码中,我们将继电器自动设置了 5000ms 的时间,因此即使用户忘记关闭开关,5 秒后继电器也会关闭。
Node.js 是异步的。与其他编程语言不同,当我们调用一个函数时,它会等待函数返回结果。但 Node.js 不是这样,Node.js 只会在有消息时调用函数。我们递归调用“cb
”。在其他编程语言中,如果我们递归调用同一个函数,该函数将进入无限循环,导致堆栈溢出。但在 Node.js 中,当我们递归调用同一个函数并且 cb 中有 packet 时,它会返回。
i2c 库代表集成电路到集成电路通信。i2c 是一种用于两个芯片之间通过串行通信进行通信的协议。在 LCD 中,数字 6 是 i2c 的协议地址,0x3E 是 LCD 的硬件地址,0x62 是 i2c 端口的硬件地址。通过给出此命令,我们可以初始化 LCD。
当使用 Gpio 时,我们需要指定它是输入还是输出。每个通用数字引脚都可以接收数据并用于控制,同时也可以用于读取数字数据。但 Gpio 同时只能是输入或输出。
Cb
是消息处理方法或回调方法的名称,每当有 MQTT 消息时,它将读取、提示并查找另一个 MQTT 消息。由于我们使用的是完全异步运行的 Node.js,即使递归调用函数,它也不会进入无限循环。它会返回并进入一个名为 loop
的函数,我们在其中读取温度值。我们使用 math.floor
,因为 double
会太长,所以将结果保留在小数点后两位。
Cb
是消息处理方法或回调方法的名称,每当有 MQTT 消息时,它将读取、提示并查找另一个 MQTT 消息。由于我们使用的是完全异步运行的 Node.js,即使递归调用函数,它也不会进入无限循环。它会返回并进入一个名为 loop
的函数,我们在其中读取温度值。我们使用 math.floor
,因为 double
会太长,所以将结果保留在小数点后两位。
代码详细解释
1. 包依赖
在 Unix 中,我们使用 curl
系统命令调用任何网站,以便我们可以将传感器获取的任何数据放入 ThingSpeak 通道。由于 JavaScript 无法访问 Unix 系统命令,我们可以通过使用 sys
库来访问 Unix 命令,该库使 Node.js 可以访问内部 Unix API 调用。
var exec = require('child_process').exec;
由于 Node.js 是一个应用程序,而 Unix 是调用整个内核级调用的部分,我们无法从应用程序调用内核,因此我们使用另一个名为 child_process
的库来调用新进程以访问内核。
function puts(error, stdout, stderr) { sys.puts(stdout) }
在上面的代码行中,puts
函数将 JavaScript 的控制台映射到 Unix 的控制台。这里 stdout
、stderr
是标准输出和错误输出窗口中的内容,“sys.puts(stdout)
”意味着我们获得的任何数据都将传递给 Unix 系统。
2. 变量
var tSensor=new mraa.Aio(3);
var ldrSensor=new mraa.Aio(2);
var rainSensor=new mraa.Aio(1);
var soilSensor=new mraa.Aio(0);
在上面的代码中,我们声明了连接不同传感器的引脚,这里温度、ldr、雨量和土壤传感器分别连接到 Aio(3)
、Aio(2)
、Aio(1)
和 Aio(0)
,这四个是模拟端口。
var relay=new mraa.Gpio(4);
由于我们还控制着植物的浇水,所以继电器连接在 Gpio(4)
,即数字引脚号 (4)。
relay.dir(mraa.DIR_OUT);
由于 Gpio 是双向的,即我们可以从数字引脚读取数据并输出数据,因此我们需要明确指定我们使用连接到继电器的数字端口的用途,以便微处理器可以向特定引脚发送命令。
var LCD = require('jsupm_i2clcd');
在上面的代码中,i2c
表示集成电路通信,这是一个小型协议,通过该协议,一个电子芯片可以与另一个芯片通信,因此为了访问它,我们正在使用由 i2c
协议调用的 i2clcd
库。
var myLCD = new LCD.Jhd1313m1(6, 0x3E, 0x62);
上面的代码显示,Intel Edison i2c 端口中的 LCD 手动连接了 0x3E,这是 i2c 引脚的硬件地址,此地址将自动搜索端口号,0x62 是中断号。
3. 用于远程控制浇水的 MQTT 集成
//////////////// Plant Watering////////
var mqtt = require('mqtt');
在上面的代码中,我们添加了 mqtt 模块,通过 mqtt 协议连接到物联网中心。
var client = mqtt.connect('mqtt://iot.eclipse.org');
这里 iot.eclipse.org
是一个免费的 Mqtt 代理,通过它可以订阅特定频道,以便我们可以从手机发送命令来控制浇水服务。
client.subscribe('rupam/Agro/#')
这里,我们订阅了通道 rupam/Agro
,这样每当有消息时,它就会异步发送给客户端。
client.handleMessage=function(packet,cb)
{
var payload = packet.payload.toString()
console.log(payload.length);
payload = payload.replace(/(\r\n|\n|\r)/gm,""); //console.log(payload.length)
//console.log(payload)
在上面的代码中,我们创建了一个名为 client.handleMessage
的事件处理程序,并且每当通道中有数据时,我们都会调用 cb
函数,因为在 Node.js 中,每个函数都可以通过 packet 与其他函数通信,并且当我们收到来自 mqtt 通道的消息时,我们会将其作为 packet 接收。Packet 有两个部分:topic 和 payload。我们将使用 payload 并替换从 mqtt 协议接收到的命令中的垃圾字符。
try{
//payload=".9 "
var state=Number(payload.trim());
if(state==1)
{
relay.write(1);
setTimeout(null,5000);
relay.write(0);
} else
{
}
}catch(ex)
{
console.log(ex.message);
} cb()
}
在上面的代码中,我们将 payload 字符串转换为数字,并调用 trim
方法来删除通过 mqtt 协议接收到的命令中的 \0
,这样就不会有任何垃圾字符保留在命令中,并检查数据是否为 1
,我们将设置继电器为 ON
,5 秒后继电器将自动关闭。
4. 感应
Loop();
function Loop()
{
var a=tSensor.read();
var resistance=(1023.0-a)*10000.0/a;
//get the resistance of the sensor;
var temperature=1/(Math.log(resistance/10000.0)/B+1/298.15)-273.15;
//convert to temperature via datasheet
temperature=Math.floor(temperature * 100) / 100;
//setTimeout(Loop,1000);
console.log("temparature="+temperature);
在上面的代码片段中,Loop()
是一个用于读取传感器数据的函数,我们从传感器中获取数据,这些数据是 Seed Studio 温度值形式的,并通过使用上述公式将其转换为摄氏度。
var lightVal=ldrSensor.read();
var lp=lightVal*100/1024;
lp=Math.floor(lp * 100) / 100;
console.log("Light %"+lp);
在上面的代码中,我们读取 ldr
传感器的数据,并使用上述 formula1
将其转换为光照强度百分比的形式,计算出的百分比可能是一个很大的小数,我们无法在 LCD 上显示,因此为了将数字限制在小数点后两位,我们使用了上述 formula2
。
var soilVal=1023-soilSensor.read();
soilVal=soilVal*100/1023;
soilVal=Math.floor(soilVal * 100) / 100;
console.log("Moisture="+soilVal+"%");
在上面的代码中,我们读取土壤传感器的值,该值实际上与土壤湿度成反比,因此为了计算湿度,我们将其从最大土壤值中减去,并使用公式计算湿度百分比,并将其显示为 2 位小数。
var rainfall=1023-rainSensor.read();
rainfall=rainfall*100/1023;
rainfall=Math.floor(rainfall * 100) / 100;
console.log("Rainfall="+rainfall+"%");
这里,与土壤湿度计算的解释相同,我们读取雨量传感器的数据,计算降雨量百分比,并将其显示在 LCD 上。
myLCD.clear();
清除 lcd
以删除旧数据。
myLCD.setColor(255,0,0);
为 LCD 显示设置红色,因为它具有 RGB 色彩显示。
myLCD.setCursor(0,0);
将光标设置在第 0 行第 0 个字符。
myLCD.write(""+temperature);
myLCD.setCursor(0,5);
myLCD.write("'C");
在第 0 行第 5 个字符处显示温度,并在 LCD 上包含“C”。
myLCD.setCursor(0,8);
myLCD.write("L="+lp);
在第 0 行第 8 个字符处显示光照百分比,位于温度值之后。
myLCD.setCursor(1,0);
myLCD.write("R="+rainfall+"%");
myLCD.setCursor(1,9);
myLCD.write("M="+soilVal+"%");
console.log("\n----------------------\n");
在第 1 行第 0 个字符处显示降雨量,在同一行的第 9 个字符处显示湿度值(以百分比形式)。
5. 更新数据到 ThingSpeak 通道
///////////// Update ThingSpeak/////////////
s="curl \"http://api.thingspeak.com/update?api_key=NH0EDP5F7TQSAH90&field1="+
temperature+"&field2="+lp+"&field3="+
soilVal+lp+"&field4="+ rainfall+ "\"";
exec(s);
setTimeout(Loop,15000);
}
上面的代码显示了使用 API curl
命令调用 ThingSpeak 通道以更新温度、光照、湿度和降雨量数据并执行它,我们为 ThingSpeak 设置了 15 秒的延迟,这样每隔 15 秒,我们就可以不断更新 ThingSpeak 通道。
结果
下图显示了实时部署的植物监测系统,带有移动电源。使用 5000mAh 移动电源,该系统可以连续 17 小时向 ThingSpeak 通道发送数据(每分钟 4 次 http 请求)。
下面的 ThingSpeak 通道图显示了同时向通道的四个字段传输数据。通过在 PC 或手机上浏览通道链接,可以实时观察这些图表。
测试
我们通过将蜡烛靠近温度传感器、遮挡 LDR 传感器、向植物盆中倒水以及在设备附近放置蒸汽水壶来检查传感器读数的变异,以分别观察温度、光照强度、降雨量和湿度的变异。
分析
ThingSpeak 提供了与云端 Matlab 脚本的轻松集成。然而,ThingSpeak 尚未支持更高级的 Matlab 工具箱。因此,我们运行一个本地脚本来首先从我们的 ThingSpeak 通道获取值,然后执行预测和聚类分析。我们假设一个非常简单的预测公式。预测值 = 前一个值 + 过去的标准差。
虽然这不是预测序列的最优雅方法,而且我们应该始终采用更稳健的方法,例如反馈卡尔曼滤波器,但这种实现暴露了预测分析的策略。你总是可以在它之上构建自己的算法。
我们分别对所有四个参数使用 K-Means 聚类来获得数据中最明显的趋势。
我们使用一个名为 ThingSpeakFetch 的 ThingSpeak Matlab 工具箱。
我们对数据执行三个主要分析
- 预测分析
- 聚类分析
- 统计分析
clear all;
clc;
close all;
%% Fetching the data
[d t]=thingSpeakFetch(101184,'NumPoints',130);
dtemp=[];
%% Temperature Analysis
for(i=1:size(d,1))
if(~isnan(d(i,1)))
dtemp=[dtemp;d(i,1)];
end
end
%% Statistical Analysis
AvTemp=mean(dtemp)
TempStd=std(dtemp)
MaxTemp=max(dtemp)
MinTemp=min(dtemp)
nextVal=dtemp(length(dtemp))+TempStd;
dpredict=[dtemp;nextVal];
plot(dpredict,'g-');
hold on;
plot(dtemp,'r-');
hold on;
legend('Actual Graph','Prediction');
%% Clustering
[IDX,C]=kmeans(dtemp,2);
for(i=1:length(dtemp))
if(IDX(i)==1)
plot(i,dtemp(i),'g*');
hold on;
else
plot(i,dtemp(i),'b+');
hold on;
end
end
title('Temperature Analysis');
%% Light Intensity Analysis
figure
title('Light Intensity Analysis');
dLight=[];
for(i=1:size(d,2))
if(~isnan(d(i,2)))
dLight=[dLight;d(i,2)];
end
end
%% Statistical Analysis
AvLight=mean(dLight)
LightStd=std(dLight)
MaxLight=max(dLight)
MinLight=min(dLight)
nextVal=dLight(length(dLight))+LightStd;
dpredict=[dLight;nextVal];
plot(dpredict,'g-');
hold on;
plot(dLight,'r-');
hold on;
legend('Actual Graph','Prediction');
%% Humidity Analysis(Soil Moisture)
figure
title('Humidity Analysis');
dHumidity=[];
for(i=1:size(d,3))
if(~isnan(d(i,3)))
dHumidity=[dHumidity;d(i,3)];
end
end
%% Statistical Analysis
AvHumidity=mean(dHumidity)
HumidityStd=std(dHumidity)
MaxHumidity=max(dHumidity)
MinHumidity=min(dHumidity)
nextVal=dHumidity(length(dHumidity))+HumidityStd;
dpredict=[dHumidity;nextVal];
plot(dpredict,'g-');
hold on;
plot(dHumidity,'r-');
hold on;
legend('Actual Graph','Prediction');
%% Clustering
[IDX,C]=kmeans(dHumidity,2);
for(i=1:length(dHumidity))
if(IDX(i)==1)
plot(i,dHumidity(i),'g*');
hold on;
else
plot(i,dHumidity(i),'b+');
hold on;
end
end
%% Rainfall Analysis
figure
title('Rainfall Analysis');
dRainfall=[];
for(i=1:size(d,4))
if(~isnan(d(i,4)))
dRainfall=[dRainfall;d(i,4)];
end
end
%% Statistical Analysis
AvRainfall=mean(dRainfall)
RainfallStd=std(dRainfall)
MaxRainfall=max(dRainfall)
MinRainfall=min(dRainfall)
nextVal=dRainfall(length(dRainfall))+RainfallStd;
dpredict=[dRainfall;nextVal];
plot(dpredict,'g-');
hold on;
plot(dRainfall,'r-');
hold on;
legend('Actual Graph','Prediction');
%% Clustering
[IDX,C]=kmeans(dRainfall,2);
for(i=1:length(dRainfall))
if(IDX(i)==1)
plot(i,dRainfall(i),'g*');
hold on;
else
plot(i,dRainfall(i),'b+');
hold on;
end
end
Matlab 命令提示符显示了温度数据的统计值(均值和标准差)。你可能看不到实际系列和预测系列之间有太大差异,因为预测系列跟随实际系列。聚类分析将点分为较低和较高的值,分别用蓝色+和红色*表示。基于此,人们可以对聚合环境状况做出决策,并相应地设置浇水阈值。这甚至可以为农药和肥料进行更好的需求分析。
结论
提高作物生产力是印度等国家面临的主要挑战,技术改进是提高作物生产力以支持和维持我国不断增长的人口需求的必要工作。过去,已经提出了几个传感器驱动的网络来成功监测大片农田。然而,大多数技术不提供数据挖掘技术和预测分析,这限制了数据在准确的田地和作物状态中的使用。我们提出了一种新技术,通过该技术,将物理传感设备收集的数据集成到云端,在那里机器学习技术可以实时生成当前环境和作物状况的警报,同时还可以提供对未来环境和作物状况的预测分析。
基于物联网的架构还提供了数据的实时实现和分析,这些数据可以在全球范围内与其他地区监测到的参数结合使用,以了解类似作物的不正常行为。我们的结果表明,所提出的系统在控制系统方面具有非常最佳的延迟,并且在数据传输方面具有高的数据包递送率和准确性。通过引入新的自学习技术,可以进一步改进该系统,这些技术可以部署在云端以理解传感数据行为并做出自主决策。