基于stm32+esp8266通过阿里云物联网平台和MQTT实现智慧粮仓环境监测管理系统

基于STM32+ESP8266通过阿里云物联网平台和MQTT实现智慧粮仓环境监测管理系统

技术要点:STM32f407ESP8266阿里云物联网平台IOTMQTTJSON数据解析

1.功能与特性

智慧粮仓的设计旨在提升粮食仓储的效率与安全性,以下是其主要功能与特性的详细解释:

主要功能:

  1. 精确监控与管理:通过集成传感器、自动控制和物联网,智慧粮仓能够对仓内环境进行实时监控。通过传感器、STM32和物联网的综合应用使得对温度、湿度和仓内大气质量的监控更加精确,从而保证粮食的储存条件始终处于最优状态。

  2. 湿度和温度预测:系统可以预测粮堆的湿度和温度,这是通过分析收集到的数据和过往温湿度数据折现图来实现的。这种预测功能有助于及时调整仓库环境,防止由于湿度和温度异常导致的粮食损坏。

  3. 智能杀虫:在检测到诱虫仓内有害虫时,系统可以自动开启氮气杀虫功能,有效地控制虫害问题而不使用传统的化学杀虫剂,更加环保且对粮食安全无害。

  4. 防止粮食霉变:系统能够实时跟踪大气和粮堆的温差、湿差变化,通过调整仓内环境条件预防粮食霉变,确保粮食质量。

智慧粮仓通过这些先进的功能与特性,为现代粮食仓储行业带来了革命性的改进,不仅提高了储存效率,也保证了粮食的质量和安全。

img

1.2 应用领域

智慧粮仓技术作为现代粮食产业链的重要组成部分,在多个领域展现了其关键作用和广泛的应用潜力。

粮食储备管理方面:精准监测和自动调控:智慧粮仓通过高精度传感器实时监测粮食的温度、湿度等关键指标,利用先进的数据分析技术进行趋势预测和风险评估。系统可自动调整仓内环境,如启动除湿或加热设备,确保存储条件始终在最佳状态,从而极大降低粮食损坏和变质的风险。

质量检测方面:配合质量传感器、温湿度传感器、烟雾传感器实时监测粮仓内的储存环境和粮食的存储情况,湿度温度是否合格,粮食内部是否出现害虫。质量检测结果可以实时反馈给到管理人员设备上,以便管理人员及时采取必要的质量控制措施。

宏观调控方面:政府相关部门可以利用智慧粮仓的数据进行宏观调控,如制定粮食储备政策、调整农业生产结构、预测粮食市场供需等,以确保国家粮食安全。通过对智慧粮仓数据的分析,政府可以更合理地调配粮食资源,如在不同地区之间进行粮食调运,以应对自然灾害或市场波动,维护社会稳定。

1.3 主要技术特点

智慧粮仓管理系统整合了多项技术,实现了粮食仓储的高效、安全与智能化管理。

技术特点:

  1. 传感器技术的应用

智慧粮仓系统通过部署多种传感器,如温湿度传感器、烟雾传感器、火焰传感器等,实时监测粮食存储环境中的关键参数。这些传感器可以精确采集数据,帮助系统及时反应环境变化,确保粮食存储条件处于理想状态。

  1. 基于阿里云的数据展现

通过阿里云的物联网平台,管理人员可以通过阿里云平台线上实时接收到传感器收集到的数据,用户可以通过收集到的数据远程操控粮仓系统里的设备。

  1. 系统自动化与智能化

系统具备自动根据环境参数的调节粮仓内的储存环境的能力,如自动控制仓内的温度、湿度和通风,以适应不断变化的存储需求。此外,智慧粮仓还可以自动执行杀虫、防潮防火等操作,减少人工干预,提高操作的准确性和效率。

  1. 系统的兼容性和扩展性

系统设计时考虑了与其他农业管理系统的兼容性,支持多种通讯协议和数据接口,便于与其他系统集成。同时,系统具备良好的扩展性,可以根据未来的需求添加新的功能或升级现有功能。

1.4 主要性能指标

性能指标 描述
数据采集精度 精确、快速地获取温度、湿度、虫害等关键信息
响应速度 快速响应异常情况,及时处理
数据分析效率 实时数据分析,快速响应和预警
自动化程度 高度自动化,能自动调节环境参数并执行关键操作
系统稳定性 高可靠性设计,确保系统连续运行无故障
兼容性和可控展性 支持与多种系统集成,具备良好的功能扩展性
环境控制精度 精确控制温度、湿度等参数,满足设定标准
预警及时性 及时、准确的预警,有效预防损失

1.5 主要创新点

(1) 高度集成化,将多种功能和技术融合在一个系统中,实现一站式管理。

(2) 运用算法进行对环境数据的判断和处理,提升应对突发问题的能力。

(3) 引入无线传输技术,摆脱线缆束缚,增强系统部署的灵活性。

(4) 创新的环境调控机制,能更加精细地控制粮仓内环境。

(5) 基于阿里云的云端开发独特的远程管理模式,实现跨地域高效管理。

(6) 与新兴的智能设备和技术无缝对接,保持系统的先进性。

1.6 设计流程

智慧粮仓环境监测管理系统设计主要分为三大模块:

一、通信模块:通信模块通过WiFi使STM32与阿里云平台连接,实现数据的双向传输,从而让管理人员能够实时监控粮仓数据。

二、传感器模块:传感器模块负责收集粮仓内环境数据,如温度、湿度、诱虫仓重量、烟雾浓度等,并通过WiFi上传到云平台。

三、控制模块:控制模块包括舵机和电机控制氮气及换气开关,LED灯模拟空调状态,管理人员可远程控制,或由STM32根据环境自动调节。

三模块协同架构

  1. 感知层:DHT11温湿度传感器 + HX711称重模块 + MQ-2烟雾传感器
  2. 传输层:ESP8266 WiFi模组实现阿里云双向通信
  3. 执行层:SG90舵机控制氮气阀 + 继电器驱动换气系统

第二部分 系统组成及功能说明

2.1 整体介绍

img该系统主要由:阿里云物联网监测界面、WiFi模块、主控芯片、传感器模块、报警模块、LED状态灯、控制模块组成,各模块之间的关系如下:

①WiFi和主控芯片的关系:主控芯片接收到的各环境传感器的数据通过WIFI模块发送到阿里云监管界面,主控芯片解析WIFI模块回传监管界面下发的JSON指令,并让处理层外设执行。

②主控芯片和传感器的关系:传感器将环境模拟量数据转化成数字量数据,并存储到寄存器。主控芯片定时获取粮仓内各传感器的寄存器数据,计算出传感器监测获得的环境数据。

③主控芯片和控制模块的关系:主控芯片判断比较环境传感器数据和设定的参数阈值,将收集到的粮仓数据通过算法判断决定控制模块的状态,也可以通过管理人员在阿里云下发的指令控制处理层外设;

④主控芯片和报警模块:主控芯片通过分析传感器传回的温度、湿度判断是否超过设定的温湿度阈值来改变蜂鸣器报警的状态;

⑤传感器模块、控制模块和LED工作灯模块、蜂鸣器报警的关系:传感器模块、蜂鸣器报警模块和控制模块的状态会改变LED工作灯的状态,继而将LED状态反馈到主控芯片,然后通过WiFi模块上传到监管平台给管理人员提醒;

数据上行:传感器数据 → MQTT报文 → 阿里云IoT Studio可视化

指令下行:手机端控制指令 → 物模型解析 → STM32执行

2.2 硬件系统介绍

2.2.1 硬件整体介绍;

imgimg

上图为智慧粮仓系统的原理和PCB 3D预览图,下面以工作电压分开介绍硬件:①3.3V工作电压主要有温湿度DHT11传感器、ESP01S模块、火焰传感器、MQ-2烟雾传感器、蜂鸣器、LED灯、HX711称重传感器。3.3V的工作电压由STM32主控芯片提供。

②5V工作电压主要有舵机SG90和继电器控制的电机组成的控制模块,5V的工作电压主要由外部的Type-c母座接入电源提供。

③STM32主控的工作电压由外部的Type-c母座接入电源提供,5V经过STM32内部的降压芯片变为3.3V。电源拓展接口上的3.3V和5V分别由主控芯片和Type-c母座提供。

2.2.2 电路各模块介绍

imgimgimgimgimg

传感器模块:主要由温湿度传感器、烟雾传感器、火焰传感器、称重传感器组成。

img

imgimgimgimg

响应外设主要由:LED工作状态灯、舵机、继电器控制的电机风扇、蜂鸣器组成。

imgimg

WIFI通信模块主要有ESP01S组成。

2.3 软件系统介绍

2.3.1 软件整体介绍

阿里云监测界面

imgimg

软件系统主要由阿里云物联网提供的IoT Studio绘制的监管管理页面,第一张为PC端的监管页面,第二张为手机端的监管页面。

2.3.2 软件各模块介绍

img

imgimg

数据监测部分:主要监测的数据有粮仓内的温湿度、火焰、烟雾浓度、诱虫仓重量。

img

控制部分:主要控制的是粮仓内的氮气开关(舵机)、换气开关(电机风扇)。

img

LED工作状态灯:主要有温湿度报警灯、空调制冷模式灯、空调除湿模式灯、换气工作灯、氮气工作灯(注:换气工作灯和氮气工作灯只有管理人员在管理界面启动才会点亮)

第三部分 完成情况展示

3.1 整体介绍

img

img

img

3.2 工程成果(分硬件实物、软件界面等设计结果)

3.2.1 机械成果;

imgimg

3.2.2 电路成果;

img

3.2.3 软件成果;

imgimg

代码解析:

原理不算复杂

  1. stm32串口0做Debug调试输出
  2. 串口1用作通信,stm32与esp8266通信,串口发送AT指令至esp8266,同时接收esp8266从云端接收的JSON格式数据
  3. esp8266通过WIFI将接收到32接收到的传感器数据经过处理后上传到阿里云物联网平台,同时接收物联网平台下发的JSON
  4. stm32接收处理传感数据,封装为MQTT格式,通过串口1发送给esp8266
  5. stm32通过串口1接收esp8266从云端接收的JSON数据
  6. stm32解析JSON数据,并判断,做出处理

云端(阿里云物联网平台)

  1. 绘制大体界面
  2. 添加组件并绑定物模型

特点:阿里云物联网平台将设备发布上线后会分配公网ip,用户可通过在浏览器通过链接进入平台查看并控制。只要能使用浏览器的设备均可访问,不用安装app,实现了跨平台,多端的同时访问控制

stm32使用串口1对esp8266通信:

向WIFI模块发送指令,并查看WIFI模块是否返回想要的数据

(代码截自嘉立创移植手册使用)

/******************************************************************
 * 函 数 名 称:WIFI_Send_Cmd
 * 函 数 说 明:向WIFI模块发送指令,并查看WIFI模块是否返回想要的数据
 * 函 数 形 参:cmd=发送的AT指令        ack=想要的应答                waitms=等待应答的时间                cnt=等待应答多少次
 * 函 数 返 回:1=得到了想要的应答                0=没有得到想要的应答
 * 作       者:LC
 * 备       注:无
******************************************************************/
char WIFI_Send_Cmd(char *cmd,char *ack,unsigned int waitms,unsigned char cnt)//AT指令,应答间隔,等待时间,重复次数
{        
        WIFI_USART_send_String((unsigned char*)cmd);//1.发送AT指令
        while(cnt--)
        {
        //时间间隔
                delay_1ms(waitms);
                //串口中断接收蓝牙应答
                if( WIFI_RX_FLAG == 1 )
                {
                        WIFI_RX_FLAG = 0;
                        WIFI_RX_LEN = 0;
            //查找是否有想要的数据
                        if( strstr((char*)WIFI_RX_BUFF, ack) != NULL )
                        {
                                return 1;
                        }
            //清除接收的数据
                        memset( WIFI_RX_BUFF, 0, sizeof(WIFI_RX_BUFF) );
                }
        }
        WIFI_RX_FLAG = 0;
        WIFI_RX_LEN = 0;
        return 0;
}

初始化esp连接到阿里云

void WIFI_Aliyun_Init(void)
{
WIFI_Send_Cmd("AT+RST\r\n","OK",100,3);//1		////重启esp	
//第一次初始化使用
WIFI_Send_Cmd("AT\r\n","OK",100,3);//1
WIFI_Send_Cmd("AT+CWMODE=1\r\n","OK",300,3);//1开启热点模式
WIFI_Send_Cmd("AT+CWJAP=\"jianzhiji\",\"8765432111\"\r\n","OK",3000,3);//2连结wifi
WIFI_Send_Cmd("AT+MQTTUSERCFG=0,1,\"k1fdm0YP3Jy.NC_3|securemode=2\\,signmethod=hmacsha256\\,timestamp=1718023481015|\",\"NC_3&k1fdm0YP3Jy\",\"dc6ef3c156ae55e575991834835c30fb5fd7a2419ef7ebd6c2c7322dd1694611\",0,0,\"\"\r\n","OK",5000,3);//3连接连结阿里云 		
WIFI_Send_Cmd("AT+MQTTCONN=0,\"k1fdm0YP3Jy.iot-as-mqtt.cn-shanghai.aliyuncs.com\",1883,0\r\n""\r\n","OK",4000,3);//4链接端口
WIFI_Send_Cmd("AT+MQTTSUB=0,\"/sys/k1fdm0YP3Jy/NC_3/thing/service/property/set\",0\r\n","OK",8000,3);//5,订阅MQTT主题ok
WIFI_Send_Cmd("AT+MQTTPUB=0,\"/sys/k1fdm0YP3Jy/NC_3/thing/event/property/post\",\"{\\\"params\\\":{\\\"Humidity\\\":100\\,\\\"temperature\\\":98}\\,\\\"version\\\":\\\"1.0.0\\\"}\",0,0\r\n", "OK",4000,3);
//Clear_WIFI_RX_BUFF();//清除串口接收缓存
}    

由于使用函数发送 命令 字符串中含有多种特殊字符 “\”," " "......等,需要使用反注释符""

可将规律的字符定义成宏,在此为了我为了直观

JSON处理:

定义JSON格式结构体,便于发送和接收后处理

//上传数据结构体
typedef struct
{
        char keyname[50];   //键读取
        char value[20];     //读取到的值,类型字符串
	    char led[20];     //读取到的值,类型字符串
		char change_air[20];
		char kill_switch[20];

}JSON_PUBLISH;

JSON数据解析

uint8_t Get_Aliyun_json_data(JSON_PUBLISH *data)
{
        char *buff=0;
    //串口中断接收WIFI应答
    if( WIFI_RX_FLAG == SET )
    {
          printf("\r\n--\r\n");
        WIFI_RX_FLAG = 0;
        WIFI_RX_LEN = 0;
        //有设备连接了热点
        if( strstr((char*)WIFI_RX_BUFF, "change_air\":") != NULL )//换气
        {
                        //获取功能名称
                        buff = strstr((char*)WIFI_RX_BUFF, "change_air\":");//{"led":0},"         以:为首部切割
                        buff += strlen("change_air\":");
                        strcpy(data->change_air,strtok(buff,"\}"));//{"led":0},"         以}为尾部切割
                        printf("data->change_air = %s\r\n",data->change_air);
                        //获取功能值
                        buff = strstr((char*)WIFI_RX_BUFF, "change_air\":" );
                        buff += strlen("change_air\":")+strlen(data->change_air)+2;
			strcpy(data->value, strtok(buff,"}"));
            return 1;
        }
		
		       if( strstr((char*)WIFI_RX_BUFF, "kill_switch\":") != NULL )
        {
                        //获取功能名称
                        buff = strstr((char*)WIFI_RX_BUFF, "kill_switch\":");//{"led":0},"         以:为首部切割
                        buff += strlen("kill_switch\":");
                        strcpy(data->kill_switch,strtok(buff,"\}"));//{"led":0},"         以}为尾部切割
                        printf("data->kill_switch = %s\r\n",data->kill_switch);
                        //获取功能值
                        buff = strstr((char*)WIFI_RX_BUFF, "kill_switch\":" );
                        buff += strlen("kill_switch\":")+strlen(data->kill_switch)+2;
			strcpy(data->value, strtok(buff,"}"));
            return 1;
        }
        }
    return 0;
}

根据定义的键名切割接受到的JSON格式数据,并保存到变量中

传感器数据上报至云

void Get_Data_Upload()//获取传感器数据并上传
{
		smoke=Get_MQ2_Percentage_value();//获取烟雾浓度	
		flame=Get_FLAME_Percentage_value();//获取火焰传感器数据
		Weight=Get_Weight();//获取质量
	
		sprintf(command, "AT+MQTTPUB=0,\"/sys/k1fdm0YP3Jy/NC_3/thing/event/property/post\",\"{\\\"params\\\":{\\\"sos_led\\\":%d\\,\\\"cold_led\\\":%d\\,\\\"remove_humi\\\":%d}\\,\\\"version\\\":\\\"1.0.0\\\"}\",0,0\r\n",
                      sos_led,cold_led,remove_humi);//工作灯
		WIFI_Send_Cmd(command, "OK", 500, 3);	//UART2接收,并回传UART1	
		
		get_tem_humi();//获取温湿度		
		sprintf(command, "AT+MQTTPUB=0,\"/sys/k1fdm0YP3Jy/NC_3/thing/event/property/post\",\"{\\\"params\\\":{\\\"Humidity\\\":%d\\,\\\"temperature\\\":%d\\,\\\"Weight\\\":%d}\\,\\\"version\\\":\\\"1.0.0\\\"}\",0,0\r\n",
		                   hummi,tem,Weight);//湿度,温度,重量
		WIFI_Send_Cmd(command, "OK", 500, 3);	//UART2接收,并回传UART1	
	
		sprintf(command, "AT+MQTTPUB=0,\"/sys/k1fdm0YP3Jy/NC_3/thing/event/property/post\",\"{\\\"params\\\":{\\\"flame\\\":%d\\,\\\"smoke\\\":%d}\\,\\\"version\\\":\\\"1.0.0\\\"}\",0,0\r\n",
							flame,smoke);//火焰,烟雾
		WIFI_Send_Cmd(command, "OK", 500, 3);	//UART2接收,并回传UART1			
}

按照MQTT协议格式,将变量值传入,并发送给esp8266,由esp8266使用wifi发送到阿里云物联网平台

传感器驱动:

按需,略

posted @ 2025-02-06 22:11  沁拒离  阅读(383)  评论(0)    收藏  举报