基于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 传感器连接的引脚为 A2

bool 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 var
        return (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.mfbz.cn/a/432466.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

#QT(智能家居界面上-图片插入)

1.IDE&#xff1a;QTCreator 2.实验 3.记录 (1)添加图片文件&#xff08;图片资源文件&#xff0c;PNG格式为佳&#xff09; &#xff08;2&#xff09;将图片放入工程文件夹 &#xff08;3&#xff09;按如下步骤将图片加入到工程中&#xff08;pic.qrs文件夹&#xff09; &…

阿里云2核4G服务器支持多少人同时在线?

2核4G服务器支持多少人在线&#xff1f;阿里云服务器网账号下的2核4G服务器支持20人同时在线访问&#xff0c;然而应用不同、类型不同、程序效率不同实际并发数也不同&#xff0c;2核4G服务器的在线访问人数取决于多个变量因素&#xff1a; 2核4G&#xff1a;2核CPU和4G内存对…

2024年【烟花爆竹经营单位主要负责人】试题及解析及烟花爆竹经营单位主要负责人作业模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【烟花爆竹经营单位主要负责人】试题及解析及烟花爆竹经营单位主要负责人作业模拟考试&#xff0c;包含烟花爆竹经营单位主要负责人试题及解析答案和解析及烟花爆竹经营单位主要负责人作业模拟考试练习。安全生…

代码还原之 函数

指令堆里逆向出来的代码有歧义&#xff0c;有三处返回&#xff0c;有嵌套IF语句&#xff0c;故推断出是个函数&#xff1b; #if 0/*27ec: 48 8d 3d 58 39 00 00 lea 0x3958(%rip),%rdi # 614b <_IO_stdin_usedBase0x14b> // rdi"COLUMNS"27f3: e8 e…

“.网址”中文域名成为中国企业互联网发展新潮流

随着互联网的不断发展和英文域名资源的日益枯竭&#xff0c;中文域名在国内迅速崛起。 中文域名不可重复注册&#xff0c;具有一经注册全球唯一的属性。 为维护自主品牌权益&#xff0c;加强中文域名知识产权保护已成为企业的重要任务。 现代知识产权法的价值已经从西方文化价…

Docker入门——安装部署(openEuler)、镜像加速

安装 1&#xff09;依赖的基础环境 64 位CPU Linux kernel(内核) 3.10 Linux kernel cgroups and namespaces 我用的是openEuler&#xff0c;所以直接yum安装(推荐&#xff0c;因为二进制安装&#xff0c;docker命令中补全操作要另外安装软件) [rootlocalhost ~]# yum -y…

电动汽车路由问题的自适应精英遗传算法与改进的邻居路由初始化

英文&#xff1a;Adaptive Elitist Genetic Algorithm With Improved Neighbor Routing Initialization for Electric Vehicle Routing Problems(2021) 摘要 本文将精英遗传算法应用于有时间窗口的电动汽车路由问题。在初始化方面&#xff0c;本文提出了一种改进的邻居路由初始…

StarUML6.0.1使用

1. 简介 作为一个软件开发人员&#xff0c;平时免不了做一定的软件设计&#xff0c;标准做法就是采用UML来设计&#xff1a; 讨论功能流程时采用时序图、活动图来表达&#xff1b;做业务功能架构时采用组件图来表达&#xff1b;做系统部署架构时采用部署图来表达&#xff1b;做…

浅谈结构化数据、非结构化数据,关系数据库、非关系数据库

结构化数据和非结构化数据两者之间存在一定的区别。以下是具体分析&#xff1a; - **结构化数据**&#xff1a;通常指的是那些组织严谨、格式规范统一的数据&#xff0c;它们存储在关系数据库中&#xff0c;可以通过二维表的形式进行逻辑表达。这类数据有明确的数据模型&#…

【小白学机器学习7】相关系数R,决定系数R2和SST=SSR+SSE, 离差,偏差,方差,标准差,编译系数,标志误。

目录 1 各种数据指标&#xff0c;分类整理 1.0 关于数据/值有3种 1.1 第1类&#xff1a;描述一堆数据特征的指标&#xff1a;集中度&#xff0c;离散度&#xff0c;形状特征 1.2 第2类&#xff1a;判断预测y值和观测值差距的指标 1.3 第3类&#xff1a;描述误差的各种指标…

容器化软件应用简化传统设备的连接

| Docker容器如何简化工业物联网解决方案 制造和包装工厂可通过集成IT和OT技术来改善运营&#xff0c;从而释放预测性维护、数据分析以及接入强大的企业管理应用等优势。然而&#xff0c;对于缺乏员工、时间或资源的企业而言&#xff0c;实施工业物联网解决方案并不容易。对此…

HashSet在添加元素时,是如何判断元素重复的? (原理详解 | 易错案例)

前言&#xff1a;我们知道Set中所存储的元素是不重复的&#xff0c;那么Set接口的实现类HashSet在添加元素时是怎么避免重复的呢&#xff1f; HashSet在添加元素时&#xff0c;是如何判断元素重复的? ● 在底层会先调用hashCode()&#xff0c;注意&#xff0c;Obje…

有名信号量、网络协议模型、UDP编程发送端

我要成为嵌入式高手之3月5日Linux高编第十五天&#xff01;&#xff01; ______________________________________________________ 学习笔记 有名信号量 1、创建semget #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int semget(…

js SheetJS 合并表格导出到同一个excel中

最近有个需求,我在一个页面显示了4个表格, 然后合并导出到excel文件中 四个表,四个sheet,一个excel文件 最后导出时这样: 实现: 1,页面有个导出的checkbox,勾选则导出,不勾选不处理 2,在一个函数中,集中处理四个表数据获取,并将结果返回出来 //获取数据后返回为…

开展庆2024年“三八”国际妇女节系列纪念活动怎样向媒体投稿?

为了向媒体投稿,庆祝2024年“三八”国际妇女节系列纪念活动,你可以遵循以下步骤: 策划与准备: 确定纪念活动的主题和目标,例如提升女性权益、表彰女性成就、促进性别平等。 策划一系列活动,如研讨会、表彰仪式、展览、讲座等,确保内容丰富多样。 准备相关的背景资料、活动介…

PyTorch搭建LeNet神经网络

函数的参数 1、PyTorch Tensor的通道排序 [batch, channel, height, width] batch: 要处理的一批图像的个数 channel: 通道数&#xff08;一般是R G B 三个通道&#xff09; height: 图像的高度 width: 图像的宽度 2.Conv 2d 卷积层的参数 [in_channels, out_channels, ke…

从零开始学习Netty - 学习笔记 -Netty入门【自定义编码器解码器】

自定义编码器解码器 通过一个简单案例&#xff0c;我们自己去实现一个编码器 和解码器 实现思路 编码器&#xff08;Encoder&#xff09;实现&#xff1a; 在编码器中&#xff0c;实现了 ByteToMessageCodec<Message> 类&#xff0c;并覆盖了 encode() 方法来处理消息的编…

【HarmonyOS】Dev Eco Studio4.0安装教程

目录 下载安装开发工具配置 下载 Dev Eco Studio4.0下载连接→https://developer.huawei.com/consumer/cn/next/deveco-studio/ 安装 点击Next 选择安装目录。点击Next 勾选创建桌面快捷方式和环境变量&#xff0c;点击Next 点击Install&#xff0c;安装 等待安装 选…

Node.js最准确历史版本下载(以下载Node.js16.17.1版本为例)

先进入官网:Node.js https://nodejs.org/en 括号中LTS代表稳定版本. 嫌其他冗余博客帖子多&#xff0c;找起来费眼睛,可以到/release下载:Node.js,在blog后面加/release https://nodejs.org/en/blog/release/ 点击next翻页,跟上面同样的步骤

做分析用什么工具

做分析用什么工具 导读 数据分析是数据辅助决策的最后一公里&#xff0c;是最终的数据可视化展示与探索分析的部分&#xff0c;选择使用最适合的数据展示方式&#xff0c;可以帮助分析人员大大提升分析效率。 问题&#xff1a; ● 纠结选择哪个工具 ● 纠结从哪里学起&#x…
最新文章