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

总体硬件架构

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

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

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

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

涉及的关键技术

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

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

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

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

测试用例设计

硬件测试用例:

  • 硬件连接测试:确保Arduino、A9芯片、传感器和LCD屏幕之间的连接正确无误。
  • 传感器测试:模拟不同温湿度环境,验证传感器是否能够准确采集数据。
  • LCD屏幕显示测试:验证LCD屏幕是否能够正常显示温湿度数据和图形化界面。
  • 串口通信测试:通过串口通信测试Arduino和A9芯片之间的通信是否正常。
  • TCP连接测试:验证A9芯片能够成功与OneNET云平台建立TCP连接。

软件测试用例:

  • 数据采集测试:验证Arduino能够准确采集传感器数据并传输给A9芯片。
  • 数据传输测试:验证A9芯片能够成功将数据通过GPRS网络发送到OneNET云平台。
  • 数据存储测试:确认OneNET云平台能够正确存储接收到的温湿度数据。
  • 数据展示测试:通过Java Swing界面验证能够从OneNET平台获取数据并正确展示在界面上。
  • 远程控制测试:验证用户能够通过Java界面远程控制A9芯片执行特定操作(如改变采集频率)。

关联

在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平台,使用户能够以直观、友好的方式观察温湿度数据。图表和统计图的展示为用户提供了直观的数据呈现方式,使得用户能够更容易理解复杂的环境数据变化。

源码+注释

在物联网(IoT)领域中,GPRS(General Packet Radio Service)是一种移动通信技术,通常用于将数据从物联网设备发送到云端服务器或从服务器发送到设备。特点如下:
数据通信:GPRS对象负责与GPRS网络进行通信,发送和接收数据。它可以通过GPRS网络与远程服务器或其他设备进行数据交换。
数据传输协议支持:GPRS对象通常支持多种数据传输协议,如TCP/IP、UDP等,以便在GPRS网络上进行可靠的数据传输。
网络连接管理:GPRS对象负责管理与GPRS网络的连接,包括建立连接、保持连接和断开连接等操作。GPRS对象位于OSI模型的第三层,即网络层。在OSI模型中,第三层负责网络互连,提供数据在网络中的传输路径选择和管理功能。

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值