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

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

1.功能与特性

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

主要功能:

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

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

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

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

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

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 整体介绍

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

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

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

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

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

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

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

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

2.2 硬件系统介绍

2.2.1 硬件整体介绍;

上图为智慧粮仓系统的原理和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 电路各模块介绍

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

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

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

2.3 软件系统介绍

2.3.1 软件整体介绍

阿里云监测界面

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

2.3.2 软件各模块介绍

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

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

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

第三部分 完成情况展示

3.1 整体介绍

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

3.2.1 机械成果;

3.2.2 电路成果;

3.2.3 软件成果;

代码解析:

原理不算复杂

  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发送到阿里云物联网平台

传感器驱动:

按需,略

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

  1. ESA2GJK1DH1K基础篇: 阿里云物联网平台: 测试MQTT连接阿里云物联网平台

    前言 这节看一下在阿里云上实现MQTT通信是个怎样的流程 看了很多网上的教程,感觉讲的迷迷糊糊.... 其实感觉他们是对MQTT不够透彻,所以写的文章就是个比着葫芦画瓢的感觉 在我面前这东西就是玩具. ...

  2. ESA2GJK1DH1K基础篇: 阿里云物联网平台: 测试MQTT客户端接收云平台的数据

    前言 有时候想想可能直接连接现成的感觉比较方便吧! 这种东西考验的是你底子是否够好,是否有很强的学习能力 因为咱就是看文档,理解文档.用文档. 测这节会感觉:这是啥呀...下一节更精彩,但是必须看这节 ...

  3. 阿里云物联网平台体验(NetGadgeteer+C#篇)

    目前对接阿里云物联网平台有多种软件和硬件,可以有多种不同语言来实现对接,比如c/c++,Java,JS,Python,C#等等,不过C#版本只有PC对接云平台的代码,嵌入式的目前还没有看到,所以本篇文 ...

  4. 阿里云物联网平台体验(树莓派+Python篇)

    阿里云物联网平台体验(树莓派+Python篇) 虽然对阿里云物联网平台比较熟悉了,从一开始就有幸参与了飞凤平台(Link Develop 一站式开发平台的前身)的一些偏硬件接入的工作.但是同时也见证了 ...

  5. 阿里云物联网平台体验(树莓派+Nodejs篇)

    我们在<阿里云物联网平台体验(树莓派+python篇)>里,写了通过Python语言开发云到端的物联网程序,本篇文章将介绍通过nodejs来实现类似功能. 同样在阿里云官方文档里已经有了一 ...

  6. 阿里云物联网平台: Android 连接阿里云物联网平台

    说明 这节是是为下一节做铺垫的 只要是按照我提供的学习路线一节一节的认认真真学过来的,这节就十分的简单 有了前两节的基础,这节呢咱让Android 连接阿里云物联网平台 使用这节的代码  https: ...

  7. ESA2GJK1DH1K基础篇: 阿里云物联网平台: 云平台显示单片机采集的温湿度数据,控制设备继电器(基于GPRS模块,AT指令TCP_MQTT通信)

    实现的功能 上一节是使用的Wi-Fi模块连接的阿里云平台,这节呢咱用GPRS连接. 阿里云的设备配置还是按照上一节的,有个温度,有个湿度. 测试 一,打开单片机程序 二,根据自己的修改,然后下载进去单 ...

  8. ESA2GJK1DH1K升级篇: 阿里云物联网平台 OTA: 关于阿里云物联网平台 OTA 的升级流程

    前言 鉴于有些用户直接想使用现成的物联网平台实现 OTA 远程升级 我就写一写这系列的文章 注意:首先大家必须把我自建服务器是如何实现的看明白! 我看了下阿里云提供的,实际上流程和咱自建实现的差别不大 ...

  9. 图解连接阿里云(一)创建阿里云物联网平台产品和设备,使用MQTT.fx快速体验

    1.  打开 https://www.aliyun.com/  注册账号 2.注册账号登录后点击控制台 3. 在下图1处输入物联网平台,会弹出2处所示物联网平台的入口,点击红色箭头所示处,进入物联网平 ...

  10. ESA2GJK1DH1K基础篇: 阿里云物联网平台: 测试云平台显示MQTT客户端发过来的消息

    现在这里空空如也 咱自定义的也没有数据 现在就是传上来温度数据,让这里显示温度数据 你发布的主题  /sys/a1m7er1nJbQ/Mqtt/thing/event/property/post 发布 ...

随机推荐

  1. Fuzz技术综述与文件Fuzz

    文章一开始发表在微信公众号 https://mp.weixin.qq.com/s?__biz=MzUyNzc4Mzk3MQ==&mid=2247486189&idx=1&sn= ...

  2. 使用TOPIAM 轻松搞定「Wiki.js」单点登录

    本文将介绍 TOPIAM 与 Wiki 集成步骤详细指南. 应用简介 Wiki.js 是一款高度可定制且现代化的开源 Wiki 系统,专为团队知识管理和文档协作设计,具有强大的扩展性和跨平台支持能力. ...

  3. 在PlatformIO IDE中对ESP32的CPU主频等进行配置

    前言 rt,有一天开发中需要尽可能发挥ESP32的全部性能,提高主频自然是首选,在Arduino IDE中修改主频很方便,但在PlatformIO IDE中修改主频的方法网上说的却很少,今天就总结一下 ...

  4. vue3 在给路由跳转增加动画之后,跳转时页面会出现上下抖动的问题

    这个问题需要分两个步骤解决: 抖动的页面有多个多根节点 增加离开过渡的css样式 v-leave-to: {display: none} 解决步骤1 (抖动的页面有多个多根节点) 我在为路由跳转增加了 ...

  5. Vuex 面试题(2023-09-13更新)

    谈谈你对 Vuex 的理解 什么是 Vuex? vuex 是 Vue 应用程序开发的状态管理插件,它采用集中式存储,管理应用的所有组件的状态 Vuex 解决了什么问题? 多个组件依赖于同一状态时,多层 ...

  6. zz 云原生时代,Java的危与机

    https://icyfenix.cn/tricks/2020/java-crisis/qcon.html 另一方面,在微服务的背景下,提倡服务围绕业务能力而非技术来构建应用,不再追求实现上的一致,一 ...

  7. idea中terminal的配置

    idea中terminal的配置流程: File->settings->Tools->terminal 然后根据需要进行配置: 显示git操作界面 Shell path ==> ...

  8. Qt/C++音视频开发70-无感切换通道/无缝切换播放视频/多通道流畅切换/不同视频打开无缝切换

    一.前言 之前就写过这个方案,当时做的是ffmpeg内核版本,由于ffmpeg内核解析都是代码实现,所以无缝切换非常完美,看不到丝毫的中间切换过程,看起来就像是在一个通道画面中.其实这种切换只能说是取 ...

  9. Qt开发经验小技巧161-165

    经常有人说Qt垃圾,说用Qt在1毫秒绘制几千个数据点卡成屎.其实显示器最高刷新频率一般才60帧,1毫秒就绘制一次有意义吗?不仅显示器没刷新过来,人肉眼也看不过来(有人可能又要抬杠说这是老板要求的,显示 ...

  10. Qt音视频开发32-Onvif网络设置

    一.前言 用onvif协议来对设备的网络信息进行获取和设置,这个操作在众多的NVR产品中,用的很少,绝大部分用户都还是习惯直接通过摄像机的web页面进去配置,其实修改网络配置的功能在大部分的NVR中都 ...