基于NB-IoT的西红柿基地温湿度监测系统

总体硬件架构

        在西红柿种植园内,我们为每株作物分配RFID标签,以便在每次照顾作物后记录其生长状况、施肥和灌溉等信息。这些数据将上传至云端,便于用户在线实时监控作物生长情况。

        为了确保温湿度的精确控制,我们在作物棚内每隔3米放置一个温湿度传感器,收集实时的温度和湿度数据。这些数据同样会上传至云端进行统一管理。

        当温湿度出现异常时,传感器会发出警报(红色灯开始闪烁),同时在用户端进行异常提示。这样,农户可以及时处理西红柿生长过程中可能出现的问题,为西红柿创造更有利的生长环境。

        云端记录的温湿度数据和用户端的信息将帮助用户根据作物的实际需求调整培育方案,从而优化西红柿的生长过程。通过这种智能化的管理系统,西红柿种植园将实现更高的产量和更优质的果实。

涉及的关键技术

RFID阅读器:为作物分配RFID标签,进行作物数据管理。

Arduino和A9芯片:作为核心组件,负责温湿度数据的采集和串口通信。

OneNET物联网云平台:通过TCP连接实现与A9的数据交互,实现远程监控和控制。

Java: 在系统中,Java的角色不仅包括Java Swing用于图形化界面的设计和数据展示,还涉及通过URL连接方式从OneNET平台获取数据。这部分的Java代码负责与OneNET平台进行通信,实现数据的获取与展示。

关联

在Arduino设备中采用分层结构,包括硬件层(Arduino和A9)、通信层(串口通信、TCP连接)、云平台层(OneNET)和用户界面层(Java Swing)。

系统物理分布: Arduino与传感器连接,A9连接Arduino并通过串口通信,A9与OneNET通过TCP连接,Java Swing界面连接OneNET获取数据。

Arduino+A9

OneNET

        实时监控与远程控制: OneNET物联网云平台作为核心,为系统提供了实时监控和远程控制的关键支持。通过TCP连接,A9芯片与OneNET建立了高效稳定的通信渠道,使得用户能够远程实时监测温湿度状况,并通过云平台进行远程控制。这种能力对于农业管理等领域至关重要,能够提高决策的灵活性和时效性。

        数据存储与分析: OneNET云平台在数据存储和分析方面发挥着关键作用。温湿度数据经由A9上传至OneNET后,被安全地存储,并可随时检索和分析。这种数据的持久性存储为用户提供了可靠的历史数据基础,支持用户进行深度分析,从而更好地了解和适应环境变化。

        URL连接的灵活性: Java通过URL连接OneNET平台的方式,为系统提供了灵活性和可扩展性。这种通信方式不仅符合现代Web开发的标准实践,同时也为未来的系统扩展和二次开发提供了方便。系统可以轻松集成其他数据源或服务,以满足不断变化的需求。

JavaSwing

        实用的图形化界面: Java图形化界面技术(例如Swing)通过URL连接OneNET平台,使用户能够以直观、友好的方式观察温湿度数据。图表和统计图的展示为用户提供了直观的数据呈现方式,使得用户能够更容易理解复杂的环境数据变化。

源码+注释

#include <gprs.h>                 // 包含 GPRS 库
#include <SoftwareSerial.h>       // 包含软件串口库
#include <dht11.h>                // 包含 DHT11 温湿度传感器库
#include <UTFT.h>                 // 包含 UTFT LCD 屏幕库
#include <stdio.h>                // 标准输入输出库
#include <stdlib.h>               // 标准库UTFT myGLCD(QD_TFT180A,7,8,5,4,6);  // 初始化 UTFT 类型的 LCD 屏幕对象,参数需根据你的显示模块进行更改
extern uint8_t SmallFont[];        // 引用 SmallFont 字体
extern uint8_t BigFont[];          // 引用 BigFont 字体
extern uint8_t SevenSegNumFont[];  // 引用 SevenSegNumFont 字体GPRS gprs;                          // 初始化 GPRS 对象
dht11 DHT11;                        // 初始化 DHT11 对象#define DHT11PIN A2               // 设置 DHT11 传感器连接的引脚为 A2bool gprsInit() 
{gprs.preInit();                   // GPRS 模块预初始化int i = 0;while(0 != gprs.init()) {         // 若 GPRS 初始化失败则循环重试delay(500);Serial.println("init error");i++;if(i >= 10){return false;}}  while(0 != gprs.connectTCP("183.230.40.40",1811)){  // 若无法连接指定 IP 和端口则重试Serial.println("connect error");i++;delay(1000);if(i >= 3)break;}gprs.closeTCP();                  // 关闭 TCP 连接Serial.println("gprs connect ok");i = 0;while(!gprs.join("cmnet")) {      // 加入指定的网络,此处需要根据自己的网络进行修改Serial.println("gprs join network error");delay(1000);i++;if(i >= 5){return false;}    }return true;                      // 返回初始化结果
}double Fahrenheit(double celsius)  // 摄氏度转华氏度的函数
{return 1.8 * celsius + 32;
}   double Kelvin(double celsius)      // 摄氏度转开氏度的函数
{return celsius + 273.15;
} double dewPoint(double celsius, double humidity)   // 计算露点的函数
{double A0= 373.15/(273.15 + celsius);double SUM = -7.90298 * (A0-1);SUM += 5.02808 * log10(A0);SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ;SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ;SUM += log10(1013.246);double VP = pow(10, SUM-3) * humidity;double T = log(VP/0.61078);   // temp varreturn (241.88 * T) / (17.558-T);
}double dewPointFast(double celsius, double humidity)    // 快速计算露点的函数
{double a = 17.271;double b = 237.7;double temp = (a * celsius) / (b + celsius) + log(humidity/100);double Td = (b * temp) / (a - temp);return Td;
}void setup() 
{Serial.begin(9600);while(!Serial);Serial.println("Setup Complete!");Serial.println("DHT11 TEST PROGRAM ");Serial.print("LIBRARY VERSION: ");Serial.println(DHT11LIB_VERSION);Serial.println();myGLCD.InitLCD();Serial.println("startInit");delay(5000);  gprsInit();// 初始化 GPRS 模块String identify = gprs.getIdentify();Serial.print("identify:");Serial.println(identify);
}int flag = 0;void loop() 
{Serial.println("startloop");int chk = DHT11.read(DHT11PIN);// Serial.print("Read sensor: ");// switch (chk)// {//   case DHTLIB_OK: //               Serial.println("OK"); //               break;//   case DHTLIB_ERROR_CHECKSUM: //               Serial.println("Checksum error"); //               break;//   case DHTLIB_ERROR_TIMEOUT: //               Serial.println("Time out error"); //               break;//   default: //               Serial.println("Unknown error"); //               break;// }if(0 == gprs.connectTCP("183.230.40.40",1811)){   // 尝试连接服务器Serial.println("connect successfully");}else{Serial.println("connect failed");}char hum[2]; char temp[2];int int_hum = (int)DHT11.humidity;  // 获取湿度值int int_temp = (int)DHT11.temperature;  // 获取温度值gprs.connectTCP("183.230.40.40",1811);gprs.sendTCPData("*153149#18#hum*");gprs.sendTCPData(itoa(int_hum,hum,10));  // 将湿度值转换为字符串并发送到服务器Serial.println("hum");Serial.println(hum);gprs.closeTCP();gprs.connectTCP("183.230.40.40",1811);gprs.sendTCPData("*153149#18#temp*");gprs.sendTCPData(itoa(int_temp,temp,10));  // 将温度值转换为字符串并发送到服务器Serial.println("temp");Serial.println(temp);gprs.closeTCP();/*  if(gprs.sendTCPData(itoa(int_temp,temp,10))==0){Serial.println("sent temperature successfully");}else{Serial.println("sent temperature failed");}*/Serial.print("Read sensor: ");if(Serial.available()){char a=Serial.read();if (a=='1'){flag = 1;Serial.println("Alarm Open!"); }else if (a=='0'){flag = 0;Serial.println("Alarm Close!"); }}switch (chk){case DHTLIB_OK: Serial.println("OK"); break;case DHTLIB_ERROR_CHECKSUM: Serial.println("Checksum error"); break;case DHTLIB_ERROR_TIMEOUT: Serial.println("Time out error"); break;default: Serial.println("Unknown error"); break;}Serial.print("Humidity (%): ");Serial.println((float)DHT11.humidity, 2);Serial.print("Temperature (oC): ");Serial.println((float)DHT11.temperature, 2);float hum1 = (float)DHT11.humidity;float temp1 = (float)DHT11.temperature;int i=0;myGLCD.clrScr();                // 清除屏幕内容myGLCD.setFont(SmallFont);      // 设置字体myGLCD.setColor(255, 255, 255); // 设置颜色myGLCD.setBackColor(255, 0, 0); // 设置背景颜色myGLCD.print("HUM Test", CENTER, 20);myGLCD.print("HUM", 15, 50);myGLCD.print("TEMP", 15, 70);myGLCD.printNumF(hum1, 2, 60, 50);myGLCD.printNumF(temp1, 2, 60, 70);// 当湿度大于40且报警标志为1时,触发LED闪烁报警if(hum1>40 && flag == 1){digitalWrite(LED_BUILTIN, HIGH);delay(100);digitalWrite(LED_BUILTIN, LOW);delay(100);digitalWrite(LED_BUILTIN, HIGH);delay(100);digitalWrite(LED_BUILTIN, LOW);delay(100);digitalWrite(LED_BUILTIN, HIGH);delay(100);digitalWrite(LED_BUILTIN, LOW);delay(100);}delay(500);
}

文书补充

实际意义

在现代化西红柿种植园中,物联网技术的应用正改变着传统的种植方式,为提高产量、质量和可持续性提供强大支持。在本报告中,我们创新的提出了一种针对西红柿种植园的物联网解决方案,主要包括以下功能:

1. 传感技术和监测系统:在种植园内部署各种传感器,如土壤湿度传感器、温度传感器和光照传感器,实时收集环境参数。从而更好地了解植物生长环境状况,并且可以根据实际情况对西红柿苗采取相应的措施,保证西红柿苗更好的生长。同时,这些分析数据将被传到云端进行分析,根据数据实时唤起自动灌溉系统等自动化设备。

2. 自动灌溉系统:通过分析土壤湿度数据,智能调整灌溉计划,确保西红柿得到适量水分。这不仅有效保证西红柿产量,同时减少了水资源浪费和农户的时间成本。

3. 远程监控和控制:借助物联网技术,用户可以通过手机或电脑随时随地监控种植园的状况,实现对灌溉、施肥等操作的远程控制,提高管理效率。

4. 作物追踪与自动收割系统:为每个作物分配一个RFID标签,从种植到收获的整个过程中追踪作物的生长状况、施肥和灌溉记录等信息。后续在作物收割期间,在收割机器人上安装RFID阅读器,从而识别作物上的标签,实现精确收割,提高效率。

通过应用这些物联网技术,西红柿种植园可以实现精细化管理,提高产量和质量,降低资源消耗,为农业可持续发展做出贡献。

扩展方向

 西红柿种植园物联网系统在未来可以进一步扩展,以满足更多需求和提高农场管理效率。以下是一些建议的扩展方向:

1. 添加更多传感器。除了现有的土壤湿度、温度传感器外,还可以添加其他类型的传感器,如光照强度、大气湿度、二氧化碳浓度、土壤pH值等,以更全面地监测西红柿生长环境。

2. 告警系统。通过OneNET平台实现告警功能,当环境参数超出预设阈值时,自动向用户发送报警信息,如短信、邮件或手机推送通知。这有助于用户及时采取措施,防止潜在问题的发生。

3. 移动端应用。开发专用的移动应用程序,支持Android和iOS平台,使用户能够随时随地远程监控和控制农场设备。移动端应用还可以实现多用户登录和权限管理功能,确保不同用户具有合适的访问和操作权限。

4. 机器学习和预测功能。通过收集和分析大量历史数据,利用机器学习算法预测未来的环境变化和作物生长趋势。这将有助于用户提前调整种植策略,以应对可能的气候变化和市场需求。

5. 智能收获与分拣。开发基于计算机视觉和机器人技术的智能收获与分拣系统,实现对成熟西红柿的自动收获和按品质分级。这将大大降低人工成本,提高生产效率。

通过以上扩展功能方向,西红柿种植园物联网系统将能够为农场管理者提供更加全面和智能的解决方案,助力实现现代农业的高效、环保和可持续发展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/723897.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

appium2的一些配置

appium-desktop不再维护之后&#xff0c;需要使用appium2。 1、安装appium2 命令行输入npm i -g appium。安装之后输入appium或者appium-server即可启动appium 2、安装安卓/ios的驱动 安卓&#xff1a;appium driver install uiautomator2 iOS&#xff1a;appium driver i…

算法沉淀——贪心算法一(leetcode真题剖析)

算法沉淀——贪心算法一 01.柠檬水找零02.将数组和减半的最少操作次数03.最大数04.摆动序列 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种基于贪心策略的优化算法&#xff0c;它通常用于求解最优化问题&#xff0c;每一步都选择当前状态下的最优解&#xff0c;以期…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:TapGesture)

支持单击、双击和多次点击事件的识别。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 接口 TapGesture(value?: { count?: number, fingers?: number }) 参数&#xff1a; 参数名称参数类型必填参…

sql多表运用 12.3

肖SIR__数据库之多表运用__12.3 数据库之多表运用 CREATE table dept(dept1 VARCHAR(6),dept_name VARCHAR(20)) default charsetutf8; INSERT into dept VALUES (101,财务); INSERT into dept VALUES (102,销售); INSERT into dept VALUES (103,IT技术); INSERT into dep…

前端工具网站合集(持续更新)

综合类网站 那些免费的砖 统计推荐免费工具网站 那些免费的砖 - 优雅地白嫖各种免费资源 (thosefree.com)https://www.thosefree.com/ CSS样式网站 毒蘑菇-配色 CSS 配色&#xff0c;阴影网站 一个好用的配色网站! 毒蘑菇 - 配色 (dumogu.top)https://color.dumogu.top/ …

如何使用Minitab计算MSA数据

1.1 步骤一 将数据复制进Minitab数据区 1.2 步骤二 按图示选择 1.3 步骤三 按图示选择&#xff0c;测量数据那列根据自己填入的数据而定 1.4 数据 评价中的重要指标为可区分类别数&#xff08;通常需大于10&#xff09;&#xff0c;合计量具R&R&#xff08;通常需小于10&am…

alibabacloud学习笔记07(小滴课堂)

讲解Sentinel自定义异常降级-新旧版本差异 讲解新版Sentinel自定义异常数据开发实战 如果我们都使用原生的报错&#xff0c;我们就无法得到具体的报错信息。 所以我们要自定义异常返回的数据提示&#xff1a; 实现BlockExceptionHandler并且重写handle方法&#xff1a; 使用F…

Jupyter如何开启Debug调试功能

由于需要对算子做远程调试功能&#xff0c;需要在jupyter中开启远程断点调试功能&#xff0c;特此记录。 本文写作时用到的系统是Ubuntu22&#xff0c;Python的版本是3.8. 首先&#xff0c;创建虚拟环境。 python -m venv venv source venv/bin/activate接着&#xff0c;安装…

【教程】无法验证app需要互联网连接以验证是否信任开发者

摘要 本文将探讨在使用苹果App时遇到无法验证开发者的情况&#xff0c;以及用户可以采取的解决方案。通过检查网络连接、重新操作、验证描述文件等方式来解决无法验证开发者的问题。同时&#xff0c;还介绍了开发者信任设置的步骤&#xff0c;以及使用appuploader工具进行安装…

Vue点击切换组件颜色

例如我有一个这样的组件&#xff0c;我希望在点击组件之后由蓝色变成橙色 先把原来的代码附上(简化掉了叉号&#xff09;&#xff1a; <div v-for"(item, index) in words" :key"index" class"scrollbar-demo-item"><span>{{ item …

python入门必会的助手函数:dir()函数

今天我们来看一个非常重要的函数&#xff1a;dir() 中文说明&#xff1a;不带参数时&#xff0c;返回当前范围内的变量、方法和定义的类型列表&#xff1b;带参数时&#xff0c;返回参数的属性、方法列表。如果参数包含方法__dir__()&#xff0c;该方法将被调用。如果参数不包…

IntelliJ IDEA 下载安装及配置使用教程

一、IDEA下载 1、打开游览器输入IntelliJ IDEA – the Leading Java and Kotlin IDE (jetbrains.com) 2、点击Download&#xff0c;进入IDEA下载界面 3、 有两个版本&#xff0c;一个是Ultimate 版本为旗舰版&#xff0c;需要付费&#xff0c;包括完整的功能&#xff0c;下载后…

【JSON2WEB】08 Amis的事件和校验

【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 【JSON2WEB】06 JSON2WEB前端框架搭建 【J…

部署DNS解析服务

一、安装软件&#xff0c;关闭防火墙&#xff0c;启动服务 1.yum install -y bind bind-utils bind-chroot 2.systemctl stop firewalld && setenforce 0 3.systemctl start named 二、工作目录 /var/named/chroot/etc #存放主配置文件 /var/named/chroot/var/n…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:LongPressGesture)

用于触发长按手势事件&#xff0c;触发长按手势的最少手指数为1&#xff0c;最短长按时间为500毫秒。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 接口 LongPressGesture(value?: { fingers?: num…

Vue3:OptionsAPI 与 CompositionAPI的比较

1、Vue2 Vue2的API设计是Options&#xff08;配置&#xff09;风格的。 Options API 的弊端 Options类型的 API&#xff0c;数据、方法、计算属性等&#xff0c;是分散在&#xff1a;data、methods、computed中的&#xff0c;若想新增或者修改一个需求&#xff0c;就需要分别…

【Leetcode每日一题】 前缀和 - 和为 K 的子数组(难度⭐)(29)

1. 题目解析 题目链接&#xff1a;560. 和为 K 的子数组 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 核心在于计算题目所给数组是否存在连续子数组和为指定值&#xff0c;存在返回连续子数组个数即可&#xff0c;不存在返回0即…

C++入门全集(5):内存管理

前言 一、内存区域划分 二、C的内存管理方式 2.1 对内置类型 2.2 对自定义类型 三、new和delete的底层实现 四、new和delete的原理 五、定位new 六、malloc/free和new/delete 前言 在C中&#xff0c;内存管理是不可避免的一门必修课。C对内存的自由度使其获得了更高的…

单片机的boot升级和双备份升级

同时boot升级还会有一个策略来防止单片机变成砖&#xff1a;就是boot的升级程序写在boot中&#xff0c;这个部分的的升级程序是不会改动的&#xff0c;如果检测到升级失败&#xff0c;会一直等待&#xff0c;直到升级正确的程序

Sora: 大型视觉模型背景、技术、局限性和机遇的综述

论文链接&#xff1a;https://arxiv.org/pdf/2402.17177.pdf 背景 在分析 Sora 之前&#xff0c;研究者首先盘点了视觉内容生成技术的沿袭。 在深度学习革命之前&#xff0c;传统的图像生成技术依赖于基于手工创建特征的纹理合成和纹理映射等方法。这些方法在生成复杂而生动…