基于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. Vue项目“TypeError: Cannot read property ‘_wrapper’ of undefined

    前情 最近在开发一个H5营销活动项目,为了更高的开发效率我使用了Vue全家桶来实现. 坑位 在开发中遇到一个奇怪报错(报错截图如下),从提示看也定位不到是哪里出问题 Why? 在报错的页面仔细看了一遍 ...

  2. RepoDB:一个介于Dapper、EFCore之间.Net的ORM库

    推荐一个介轻量ORM和全功能ORM的开源项目. 01 项目简介 RepoDB 提供了基本操作所需的方法,同时也提供了一些高级功能,如第二层缓存.跟踪.仓储.属性处理器和批量/大量操作.支持的数据库,包 ...

  3. MeteoInfo-Java解析与绘图教程(二)

    MeteoInfo-Java解析与绘图教程(二) 上节说到了数据的简单解析,这节则说简单绘图 绘图的前置最重要的就是GridData,有了它,基本可以直接绘制出来 例如我们先放弃简单的自定义绘图的操作 ...

  4. 2.猿人学爬虫攻防第二题 JS 混淆 动态cookie

    题目链接:请点击 抓取到发布日热度的值,计算所有值的加和 1.分析网页 由于是动态Cookie,为了避免其他Cookie的影响,所以使用浏览器的无痕模式进行调试,按f12并选中[Preserve lo ...

  5. 如何用source和source结合cat << EOF 和EOF )实现template.txt模板文件变量的替换

    使用 source 和 cat << EOF 来实现 template.txt 模板文件变量的替换,你可以按照以下步骤操作: 创建 config.env 文件:包含变量定义. 创建 tem ...

  6. 免费学习基于SpringBoot的高考志愿智能推荐系统

    免费学习基于SpringBoot的高考志愿智能推荐系统 摘要 科学技术日新月异,人们的生活都发生了翻天覆地的变化,高考志愿智能推荐系统管理当然也不例外.过去的信息管理都使用传统的方式实行,既花费了时间 ...

  7. Linux sudo 提权之软链接攻击

    软链接提权的原理 低权限用户能够以 root 用户的权限执行某个脚本,该脚本中又使用到了诸如 chown 等命令修改文件的权限,且该文件又能够被低权限的用户所修改.因此低权限的用户可以删除该文件,然后 ...

  8. pygame基础功能总结

    1.导入Pygame模块 (1) 模块并初始化 ① Import pygame ② Pygame.init() (2) 创建窗体 ① Window_size = (800,600)  长宽 ② Scr ...

  9. Qt编写地图综合应用20-多浏览器内核

    一.前言 本人写Qt程序这么多年,比较喜欢支持多个Qt版本,尤其是钟情于支持任意Qt版本+任意系统+任意编译器,这句话说起来简单其实实现起来就不容易了,首先你得有个很多版本的测试环境,起码十几个Qt环 ...

  10. 在Win7操作系统上安装VS2017报错:安装程序清单签名验证失败

    方法1: 开始-运行-gpedit.msc-计算机配置-Windows 设置-安全设置-本地策略-安全选项-系统机密:将FIPS兼容算法用于加密.哈希和签名-设置禁用-退出安装程序,重新安装一次.亲测 ...