基于stm32+esp8266通过阿里云物联网平台和MQTT实现智慧粮仓环境监测管理系统
基于STM32+ESP8266通过阿里云物联网平台和MQTT实现智慧粮仓环境监测管理系统
技术要点:STM32f407、ESP8266、阿里云物联网平台IOT、MQTT、JSON数据解析、
1.功能与特性
智慧粮仓的设计旨在提升粮食仓储的效率与安全性,以下是其主要功能与特性的详细解释:
主要功能:
精确监控与管理:通过集成传感器、自动控制和物联网,智慧粮仓能够对仓内环境进行实时监控。通过传感器、STM32和物联网的综合应用使得对温度、湿度和仓内大气质量的监控更加精确,从而保证粮食的储存条件始终处于最优状态。
湿度和温度预测:系统可以预测粮堆的湿度和温度,这是通过分析收集到的数据和过往温湿度数据折现图来实现的。这种预测功能有助于及时调整仓库环境,防止由于湿度和温度异常导致的粮食损坏。
智能杀虫:在检测到诱虫仓内有害虫时,系统可以自动开启氮气杀虫功能,有效地控制虫害问题而不使用传统的化学杀虫剂,更加环保且对粮食安全无害。
防止粮食霉变:系统能够实时跟踪大气和粮堆的温差、湿差变化,通过调整仓内环境条件预防粮食霉变,确保粮食质量。
智慧粮仓通过这些先进的功能与特性,为现代粮食仓储行业带来了革命性的改进,不仅提高了储存效率,也保证了粮食的质量和安全。
1.2 应用领域
智慧粮仓技术作为现代粮食产业链的重要组成部分,在多个领域展现了其关键作用和广泛的应用潜力。
粮食储备管理方面:精准监测和自动调控:智慧粮仓通过高精度传感器实时监测粮食的温度、湿度等关键指标,利用先进的数据分析技术进行趋势预测和风险评估。系统可自动调整仓内环境,如启动除湿或加热设备,确保存储条件始终在最佳状态,从而极大降低粮食损坏和变质的风险。
质量检测方面:配合质量传感器、温湿度传感器、烟雾传感器实时监测粮仓内的储存环境和粮食的存储情况,湿度温度是否合格,粮食内部是否出现害虫。质量检测结果可以实时反馈给到管理人员设备上,以便管理人员及时采取必要的质量控制措施。
宏观调控方面:政府相关部门可以利用智慧粮仓的数据进行宏观调控,如制定粮食储备政策、调整农业生产结构、预测粮食市场供需等,以确保国家粮食安全。通过对智慧粮仓数据的分析,政府可以更合理地调配粮食资源,如在不同地区之间进行粮食调运,以应对自然灾害或市场波动,维护社会稳定。
1.3 主要技术特点
智慧粮仓管理系统整合了多项技术,实现了粮食仓储的高效、安全与智能化管理。
技术特点:
- 传感器技术的应用
智慧粮仓系统通过部署多种传感器,如温湿度传感器、烟雾传感器、火焰传感器等,实时监测粮食存储环境中的关键参数。这些传感器可以精确采集数据,帮助系统及时反应环境变化,确保粮食存储条件处于理想状态。
- 基于阿里云的数据展现
通过阿里云的物联网平台,管理人员可以通过阿里云平台线上实时接收到传感器收集到的数据,用户可以通过收集到的数据远程操控粮仓系统里的设备。
- 系统自动化与智能化
系统具备自动根据环境参数的调节粮仓内的储存环境的能力,如自动控制仓内的温度、湿度和通风,以适应不断变化的存储需求。此外,智慧粮仓还可以自动执行杀虫、防潮防火等操作,减少人工干预,提高操作的准确性和效率。
- 系统的兼容性和扩展性
系统设计时考虑了与其他农业管理系统的兼容性,支持多种通讯协议和数据接口,便于与其他系统集成。同时,系统具备良好的扩展性,可以根据未来的需求添加新的功能或升级现有功能。
1.4 主要性能指标
性能指标 | 描述 |
---|---|
数据采集精度 | 精确、快速地获取温度、湿度、虫害等关键信息 |
响应速度 | 快速响应异常情况,及时处理 |
数据分析效率 | 实时数据分析,快速响应和预警 |
自动化程度 | 高度自动化,能自动调节环境参数并执行关键操作 |
系统稳定性 | 高可靠性设计,确保系统连续运行无故障 |
兼容性和可控展性 | 支持与多种系统集成,具备良好的功能扩展性 |
环境控制精度 | 精确控制温度、湿度等参数,满足设定标准 |
预警及时性 | 及时、准确的预警,有效预防损失 |
1.5 主要创新点
(1) 高度集成化,将多种功能和技术融合在一个系统中,实现一站式管理。
(2) 运用算法进行对环境数据的判断和处理,提升应对突发问题的能力。
(3) 引入无线传输技术,摆脱线缆束缚,增强系统部署的灵活性。
(4) 创新的环境调控机制,能更加精细地控制粮仓内环境。
(5) 基于阿里云的云端开发独特的远程管理模式,实现跨地域高效管理。
(6) 与新兴的智能设备和技术无缝对接,保持系统的先进性。
1.6 设计流程
智慧粮仓环境监测管理系统设计主要分为三大模块:
一、通信模块:通信模块通过WiFi使STM32与阿里云平台连接,实现数据的双向传输,从而让管理人员能够实时监控粮仓数据。
二、传感器模块:传感器模块负责收集粮仓内环境数据,如温度、湿度、诱虫仓重量、烟雾浓度等,并通过WiFi上传到云平台。
三、控制模块:控制模块包括舵机和电机控制氮气及换气开关,LED灯模拟空调状态,管理人员可远程控制,或由STM32根据环境自动调节。
三模块协同架构:
- 感知层:DHT11温湿度传感器 + HX711称重模块 + MQ-2烟雾传感器
- 传输层:ESP8266 WiFi模组实现阿里云双向通信
- 执行层: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 软件成果;
代码解析:
原理不算复杂
- stm32串口0做Debug调试输出
- 串口1用作通信,stm32与esp8266通信,串口发送AT指令至esp8266,同时接收esp8266从云端接收的JSON格式数据
- esp8266通过WIFI将接收到32接收到的传感器数据经过处理后上传到阿里云物联网平台,同时接收物联网平台下发的JSON
- stm32接收处理传感数据,封装为MQTT格式,通过串口1发送给esp8266
- stm32通过串口1接收esp8266从云端接收的JSON数据
- stm32解析JSON数据,并判断,做出处理
云端(阿里云物联网平台)
- 绘制大体界面
- 添加组件并绑定物模型
特点:阿里云物联网平台将设备发布上线后会分配公网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实现智慧粮仓环境监测管理系统的更多相关文章
- ESA2GJK1DH1K基础篇: 阿里云物联网平台: 测试MQTT连接阿里云物联网平台
前言 这节看一下在阿里云上实现MQTT通信是个怎样的流程 看了很多网上的教程,感觉讲的迷迷糊糊.... 其实感觉他们是对MQTT不够透彻,所以写的文章就是个比着葫芦画瓢的感觉 在我面前这东西就是玩具. ...
- ESA2GJK1DH1K基础篇: 阿里云物联网平台: 测试MQTT客户端接收云平台的数据
前言 有时候想想可能直接连接现成的感觉比较方便吧! 这种东西考验的是你底子是否够好,是否有很强的学习能力 因为咱就是看文档,理解文档.用文档. 测这节会感觉:这是啥呀...下一节更精彩,但是必须看这节 ...
- 阿里云物联网平台体验(NetGadgeteer+C#篇)
目前对接阿里云物联网平台有多种软件和硬件,可以有多种不同语言来实现对接,比如c/c++,Java,JS,Python,C#等等,不过C#版本只有PC对接云平台的代码,嵌入式的目前还没有看到,所以本篇文 ...
- 阿里云物联网平台体验(树莓派+Python篇)
阿里云物联网平台体验(树莓派+Python篇) 虽然对阿里云物联网平台比较熟悉了,从一开始就有幸参与了飞凤平台(Link Develop 一站式开发平台的前身)的一些偏硬件接入的工作.但是同时也见证了 ...
- 阿里云物联网平台体验(树莓派+Nodejs篇)
我们在<阿里云物联网平台体验(树莓派+python篇)>里,写了通过Python语言开发云到端的物联网程序,本篇文章将介绍通过nodejs来实现类似功能. 同样在阿里云官方文档里已经有了一 ...
- 阿里云物联网平台: Android 连接阿里云物联网平台
说明 这节是是为下一节做铺垫的 只要是按照我提供的学习路线一节一节的认认真真学过来的,这节就十分的简单 有了前两节的基础,这节呢咱让Android 连接阿里云物联网平台 使用这节的代码 https: ...
- ESA2GJK1DH1K基础篇: 阿里云物联网平台: 云平台显示单片机采集的温湿度数据,控制设备继电器(基于GPRS模块,AT指令TCP_MQTT通信)
实现的功能 上一节是使用的Wi-Fi模块连接的阿里云平台,这节呢咱用GPRS连接. 阿里云的设备配置还是按照上一节的,有个温度,有个湿度. 测试 一,打开单片机程序 二,根据自己的修改,然后下载进去单 ...
- ESA2GJK1DH1K升级篇: 阿里云物联网平台 OTA: 关于阿里云物联网平台 OTA 的升级流程
前言 鉴于有些用户直接想使用现成的物联网平台实现 OTA 远程升级 我就写一写这系列的文章 注意:首先大家必须把我自建服务器是如何实现的看明白! 我看了下阿里云提供的,实际上流程和咱自建实现的差别不大 ...
- 图解连接阿里云(一)创建阿里云物联网平台产品和设备,使用MQTT.fx快速体验
1. 打开 https://www.aliyun.com/ 注册账号 2.注册账号登录后点击控制台 3. 在下图1处输入物联网平台,会弹出2处所示物联网平台的入口,点击红色箭头所示处,进入物联网平 ...
- ESA2GJK1DH1K基础篇: 阿里云物联网平台: 测试云平台显示MQTT客户端发过来的消息
现在这里空空如也 咱自定义的也没有数据 现在就是传上来温度数据,让这里显示温度数据 你发布的主题 /sys/a1m7er1nJbQ/Mqtt/thing/event/property/post 发布 ...
随机推荐
- Vue项目“TypeError: Cannot read property ‘_wrapper’ of undefined
前情 最近在开发一个H5营销活动项目,为了更高的开发效率我使用了Vue全家桶来实现. 坑位 在开发中遇到一个奇怪报错(报错截图如下),从提示看也定位不到是哪里出问题 Why? 在报错的页面仔细看了一遍 ...
- RepoDB:一个介于Dapper、EFCore之间.Net的ORM库
推荐一个介轻量ORM和全功能ORM的开源项目. 01 项目简介 RepoDB 提供了基本操作所需的方法,同时也提供了一些高级功能,如第二层缓存.跟踪.仓储.属性处理器和批量/大量操作.支持的数据库,包 ...
- MeteoInfo-Java解析与绘图教程(二)
MeteoInfo-Java解析与绘图教程(二) 上节说到了数据的简单解析,这节则说简单绘图 绘图的前置最重要的就是GridData,有了它,基本可以直接绘制出来 例如我们先放弃简单的自定义绘图的操作 ...
- 2.猿人学爬虫攻防第二题 JS 混淆 动态cookie
题目链接:请点击 抓取到发布日热度的值,计算所有值的加和 1.分析网页 由于是动态Cookie,为了避免其他Cookie的影响,所以使用浏览器的无痕模式进行调试,按f12并选中[Preserve lo ...
- 如何用source和source结合cat << EOF 和EOF )实现template.txt模板文件变量的替换
使用 source 和 cat << EOF 来实现 template.txt 模板文件变量的替换,你可以按照以下步骤操作: 创建 config.env 文件:包含变量定义. 创建 tem ...
- 免费学习基于SpringBoot的高考志愿智能推荐系统
免费学习基于SpringBoot的高考志愿智能推荐系统 摘要 科学技术日新月异,人们的生活都发生了翻天覆地的变化,高考志愿智能推荐系统管理当然也不例外.过去的信息管理都使用传统的方式实行,既花费了时间 ...
- Linux sudo 提权之软链接攻击
软链接提权的原理 低权限用户能够以 root 用户的权限执行某个脚本,该脚本中又使用到了诸如 chown 等命令修改文件的权限,且该文件又能够被低权限的用户所修改.因此低权限的用户可以删除该文件,然后 ...
- pygame基础功能总结
1.导入Pygame模块 (1) 模块并初始化 ① Import pygame ② Pygame.init() (2) 创建窗体 ① Window_size = (800,600) 长宽 ② Scr ...
- Qt编写地图综合应用20-多浏览器内核
一.前言 本人写Qt程序这么多年,比较喜欢支持多个Qt版本,尤其是钟情于支持任意Qt版本+任意系统+任意编译器,这句话说起来简单其实实现起来就不容易了,首先你得有个很多版本的测试环境,起码十几个Qt环 ...
- 在Win7操作系统上安装VS2017报错:安装程序清单签名验证失败
方法1: 开始-运行-gpedit.msc-计算机配置-Windows 设置-安全设置-本地策略-安全选项-系统机密:将FIPS兼容算法用于加密.哈希和签名-设置禁用-退出安装程序,重新安装一次.亲测 ...