【STM32+QT项目】基于STM32与QT的智慧粮仓环境监测与管理系统设计(完整工程资料源码)

视频演示:

基于STM32与QT的智慧粮仓环境监测与管理系统设计

目录:

目录

视频演示:

目录:

前言:

一、国内外研究现状与发展趋势

[1.1 国内研究现状与发展趋势:](#1.1 国内研究现状与发展趋势:)

[1.1.1 研究现状](#1.1.1 研究现状)

[1.1.2 发展趋势](#1.1.2 发展趋势)

[1.2 国外研究现状与发展趋势:](#1.2 国外研究现状与发展趋势:)

[1.2.1 研究现状](#1.2.1 研究现状)

[1.2.2 发展趋势](#1.2.2 发展趋势)

二、相关技术基础

[2.1. 环境监测技术](#2.1. 环境监测技术)

[2.2. 物联网(IoT)技术](#2.2. 物联网(IoT)技术)

[2.3. 自动化控制系统](#2.3. 自动化控制系统)

三、设计目的:

[3.1 项目背景](#3.1 项目背景)

[3.2 设计意义:](#3.2 设计意义:)

四、硬件部分:

[4.1 stm32f103c8t6(1个)](#4.1 stm32f103c8t6(1个))

电路原理图:

[4.2 光敏传感器(2个)](#4.2 光敏传感器(2个))

电路原理图:

[4.3 烟雾传感器(2个):](#4.3 烟雾传感器(2个):)

电路原理图:

[4.4 OLED 显示屏(1个):](#4.4 OLED 显示屏(1个):)

电路原理图:

[4.5 DHT11传感器(1个):](#4.5 DHT11传感器(1个):)

电路原理图:

[4.6 蜂鸣器(1个):](#4.6 蜂鸣器(1个):)

电路原理图:

[4.7 esp8266WiFi模块(1个):](#4.7 esp8266WiFi模块(1个):)

电路原理图:

[4.8 驱动模块(1个):](#4.8 驱动模块(1个):)

电路原理图:

[4.9 二氧化碳传感器(2个):](#4.9 二氧化碳传感器(2个):)

[4.10 整体电路设计:](#4.10 整体电路设计:)

五、软件设计:

[5.1 stm32源码主要组件分析:](#5.1 stm32源码主要组件分析:)

[5.1.1 传感器数据采集](#5.1.1 传感器数据采集)

[5.1.2 用户界面控制(UI)](#5.1.2 用户界面控制(UI))

[5.1.3 报警和控制逻辑](#5.1.3 报警和控制逻辑)

[5.1.4 OLED 显示](#5.1.4 OLED 显示)

[5.1.5 OneNET 数据发送](#5.1.5 OneNET 数据发送)

[5.1.6 定时任务和中断](#5.1.6 定时任务和中断)

[5.2 stm32源码函数实现细节](#5.2 stm32源码函数实现细节)

[5.2.1 HAL_GPIO_EXTI_Callback](#5.2.1 HAL_GPIO_EXTI_Callback)

[5.2.2 Buzzer_Control 和 Motor_Control](#5.2.2 Buzzer_Control 和 Motor_Control)

[5.2.3 Logic_Process](#5.2.3 Logic_Process)

[5.2.4 OLED_ShowData](#5.2.4 OLED_ShowData)

[5.2.5 Send_Data](#5.2.5 Send_Data)

[5.2.6 SystemClock_Config](#5.2.6 SystemClock_Config)

[5.3 stm32源码核心主程序:](#5.3 stm32源码核心主程序:)

[5.4 QT源码分析](#5.4 QT源码分析)

[5.4.1. 代码结构](#5.4.1. 代码结构)

[5.4.2. 宏定义](#5.4.2. 宏定义)

[GET 请求相关](#GET 请求相关)

[POST 请求相关](#POST 请求相关)

数据标识符

[5.4.3. 变量定义](#5.4.3. 变量定义)

[5.4.4. 构造函数和析构函数](#5.4.4. 构造函数和析构函数)

[5.4.5. 槽函数](#5.4.5. 槽函数)

按钮点击事件

定时器事件

[HTTP 请求完成事件](#HTTP 请求完成事件)

[5.4.6. 数据处理函数](#5.4.6. 数据处理函数)

Get_Data_Deal()

Data_Show()

[5.4.7. HTTP 请求函数](#5.4.7. HTTP 请求函数)

Get_Onenet_Data()

Post_Onenet_Data()

[5.4.8. 代码亮点](#5.4.8. 代码亮点)

[5.4.9. 改进建议](#5.4.9. 改进建议)

[5.5 QT源码详解:](#5.5 QT源码详解:)

[5.5.1 头文件和宏定义](#5.5.1 头文件和宏定义)

[5.5.2. 接收数据变量](#5.5.2. 接收数据变量)

[5.5.3 构造函数和析构函数](#5.5.3 构造函数和析构函数)

[5.5.4 按钮点击事件](#5.5.4 按钮点击事件)

[5.5.5 定时器事件](#5.5.5 定时器事件)

[5.5.6 数据处理和显示](#5.5.6 数据处理和显示)

[5.5.7 HTTP请求函数](#5.5.7 HTTP请求函数)

[5.6 QT 实现的打包app](#5.6 QT 实现的打包app)

[六、 尾言](#六、 尾言)

资源获取方式:毕设&课设&项目&实训-Altium-粮仓环境监测-2025-01-03.zip资源-CSDN文库

资源详情:

APP安装包:

KEIL:

QT:

原理图:


前言:

环境数据采集,系统通过传感器(如温度、湿度、气体传感器等)对粮仓内部的环境进行实时监测,采集相关数据;

数据处理,使用STM32微控制器对采集到的数据进行处理与分析,根据设定的阈值判断环境是否处于安全状态;·

数据展示,通过QT界面,将处理后的环境数据可视化,用户可以实时查看粮仓的温湿度变化、气体浓度等信息;

报警系统,当监测到的环境数据超过安全阈值时,系统会触发报警机制,及时通知管理人员采取措施,确保粮仓安全;

远程监控,系统可以实现远程数据传输,管理人员可以通过网络访问监测数据,进行远程监控和管理;

数据记录与分析,记录历史数据,提供数据分析功能,帮助用户了解粮仓环境变化趋势,以便于后续的管理决策;

用户交互,QT作为图形用户界面框架,提供友好的操作界面,便于用户进行设置、查看和管理。通过结合STM32的强大处理能力和QT的界面交互功能,该系统能够有效提高粮仓管理的智能化水平,确保粮食安全和质量。

一、国内外研究现状与发展趋势

1.1 国内研究现状与发展趋势:

1.1.1 研究现状

随着农业现代化和智能化的发展,智慧粮仓环境监测与管理系统作为粮食安全保障体系的重要组成部分,近年来逐渐成为研究的热点。智慧粮仓通过实时监控粮仓内外环境,提供精准的数据支持与决策建议,确保粮食在存储过程中不受环境因素的影响,避免粮食的浪费和质量下降。

当前,国内在粮仓环境监测领域的研究主要集中在传感技术的发展与应用上。环境监测数据的采集离不开温湿度、气体(如二氧化碳、氧气、氨气等)、光照、空气流通速度等多个因素的实时检测。国内的研究者在传感器的精度、稳定性、耐用性方面做了大量工作。常用的传感技术包括无线传感器网络(WSN)、物联网(IoT)技术、红外传感技术等。

例如,基于无线传感器网络的粮仓环境监测系统,通过在粮仓内安装多个传感器节点,实时采集温湿度、气体浓度等数据,并将数据上传到云平台进行处理和分析。

智慧粮仓环境监测系统通常要求具备远程传输和即时通信的能力。在国内,很多研究集中于如何保证粮仓内部的传感器网络能够稳定、高效地传输数据。一些研究采用了低功耗广域网(LPWAN)技术,如LoRa、NB-IoT等,使得粮仓内的传感器能够实现低功耗、长距离的数据传输。这些技术大大提升了监测系统的可操作性和覆盖范围。

大数据分析与人工智能(AI)技术在智慧粮仓系统中的应用逐渐成为研究的前沿。通过数据挖掘、机器学习等算法,可以对采集到的环境数据进行实时分析,预测粮仓环境的变化趋势,并根据不同的预测结果自动调节粮仓内部的温湿度等条件,达到自动控制的效果。

国内已有一些研究尝试通过建立基于人工智能的粮仓环境管理系统,实现对粮仓环境的智能化预测与控制。比如,使用深度学习模型预测粮仓内的温湿度变化趋势,从而提前采取措施。

目前,粮仓环境监测与管理系统的集成化程度在国内有所提高。集成的系统不仅限于数据采集与传输,还包括对环境的实时控制和智能决策功能。例如,部分研究结合了温控、湿控、气候调节等多种技术,设计出具有自动调节功能的智慧粮仓环境管理系统。这类系统可以根据实时监测数据,自动启动空调、加湿器、排气系统等设施,实现对粮仓内部环境的自动优化。

随着信息技术和人工智能的不断发展,越来越多的研究开始探索将智能化仓储与粮仓环境监测系统相结合。例如,通过智能化仓储管理系统对粮食的存储状态、出入库情况进行实时监控,并与环境监测数据结合,为粮食的存储提供全面的技术支持。

1.1.2 发展趋势

随着技术的不断进步和需求的日益增加,智慧粮仓环境监测与管理系统的研究正朝着以下几个方向发展:

未来,物联网技术将与大数据分析进一步融合,形成更加智能化的环境监测系统。通过物联网实现设备之间的互联互通,采集到的大量环境数据将通过大数据技术进行处理和分析,生成精准的决策支持。这将推动智慧粮仓向更高的自动化、智能化水平发展。

人工智能技术在智慧粮仓中的应用将更加深入。未来,基于机器学习和深度学习的预测与控制模型将能够自动化地识别粮仓内环境的异常变化,并进行自主调节。例如,通过深度学习模型的自适应能力,系统可以根据历史数据和实时数据自动优化粮仓内温湿度的调节参数,从而提高粮食存储的安全性与效率。

随着环保和可持续发展理念的推动,未来的智慧粮仓环境监测系统将更加注重绿色、低碳技术的应用。例如,使用可再生能源(如太阳能)供电的传感器节点,优化能源使用的智能控制系统,甚至结合环境友好的材料和技术,以实现节能减排和环保目标。

未来的粮仓环境管理系统将不仅仅依赖人为设定的参数,更加注重自适应控制和智能化的调节。例如,系统能够根据粮仓的存储条件、外部气候变化等多方面因素自动调节内部环境,最大限度地保证粮食的质量和减少能源消耗

随着云计算和边缘计算的普及,未来的智慧粮仓系统将实现更加高效的数据处理和智能控制。边缘计算技术可以在数据源端进行数据初步处理,从而减少数据传输延迟,提高响应速度;云平台则负责存储和分析大量数据,进行深度学习和模型优化。这种结合将使得智慧粮仓环境监测系统具备更强的实时性和可靠性。

未来的智慧粮仓将更加注重多维度的数据融合与综合监控。例如,不仅仅监测仓内环境的温湿度等,还可以对粮食的质量、粮食虫害等进行全方位的监测与预警。这种综合监控系统将使得粮仓管理更加精准和全面,能够更好地预测潜在风险并做出及时响应。

未来的智慧粮仓系统将具备更强的智能预警风险管理能力。例如,系统将能够根据历史数据和当前数据分析出可能导致粮食质量下降的风险因素,并在危险来临之前提前发出预警信号。同时,结合风险管理策略,自动调整粮仓环境条件,以降低风险发生的概率。

智慧粮仓环境监测与管理系统在国内的研究和应用已经取得了显著进展,特别是在传感器技术、数据处理与分析、智能控制系统等方面,国内学者和技术人员做出了大量的创新和努力。未来,随着物联网、大数据、人工智能等技术的不断发展,智慧粮仓环境监测与管理系统将更加智能化、高效化和绿色化,有望为我国的粮食安全、农业现代化以及可持续发展做出更大的贡献。

1.2 国外研究现状与发展趋势:

随着全球气候变化、粮食安全以及农业现代化进程的加快,智慧粮仓环境监测与管理系统逐渐成为农业和食品安全领域的重要研究方向。该系统通过集成先进的传感器技术、物联网(IoT)、大数据分析以及人工智能(AI)等前沿技术,对粮仓内的环境进行实时监测和精准管理,以保证粮食的安全存储、质量监控和损失预防。

1.2.1 研究现状

在国外,环境监测技术已广泛应用于智慧粮仓管理中,重点关注温湿度、气体成分、微生物活性等关键因素的实时监测。例如,欧洲和美国的一些粮仓已部署了基于传感器的监测系统,这些传感器能够监测温度、湿度、氧气浓度、二氧化碳浓度以及有害气体(如氨气)的变化,实时反馈粮仓内部环境状况。

  • 传感器技术:国外研究者主要使用多种传感器,如温湿度传感器、气体传感器、光谱传感器等。这些传感器可以监测粮仓内的微气候条件,帮助及时发现潜在的霉变、虫害或腐烂问题。
  • 无线网络技术:物联网(IoT)在粮仓监测中的应用愈发成熟,传感器通过无线网络(如ZigBee、LoRa等)将数据传输至中央控制系统,实现远程实时监控。

智能化数据分析技术是智慧粮仓系统的重要组成部分。国外的研究集中在如何利用大数据分析人工智能(AI)技术对收集到的环境数据进行深度分析,预测粮食存储过程中的潜在风险,优化粮仓管理决策。

  • 机器学习与AI模型:例如,通过机器学习模型对温湿度等环境参数的历史数据进行训练,系统能够预测粮仓中可能发生的质量变化和虫害发生的概率,为管理者提供科学的风险预警和决策支持。
  • 大数据平台与云计算:一些企业和研究机构已采用云计算平台,整合来自不同传感器的数据,并通过大数据分析提供精准的存储环境优化方案。美国农业部(USDA)和一些商业公司(如Syngenta)已开展此类研究,并将其应用于粮食安全管理中。

国外一些研究已经将环境监测系统与自动化控制系统相结合,形成了闭环管理系统。这种系统不仅能够监测粮仓内的环境状况,还能够根据监测数据自动调节温湿度、通风、除湿等措施。

  • 自动化调节:例如,基于温湿度传感器反馈的实时数据,系统可以自动调节通风设备或加热设备,以确保粮食存储环境的稳定性。意大利和荷兰的一些研究机构已经开始研发具有自我调节功能的智慧粮仓系统。
  • 智能预警系统:一旦监测到环境参数偏离正常范围,系统可以触发预警,通知操作人员及时进行干预。这种预警机制在全球范围内的粮仓管理中已得到初步应用。

1.2.2 发展趋势

未来,随着物联网(IoT)技术的进一步发展,智慧粮仓系统将更加依赖于大规模传感器网络云计算平台的深度融合。这些技术将使得数据采集、存储、分析和控制更加高效,且具备更强的实时性和扩展性。

  • 边缘计算与IoT融合:为了解决云端计算延迟的问题,边缘计算将在智慧粮仓系统中得到广泛应用。通过将部分数据处理功能移至传感器设备附近,可以减少延迟,提升数据响应速度。
  • 智能硬件与传感技术的发展 :随着新型传感器技术的不断成熟,未来的智慧粮仓系统能够更加准确、实时地监测更加细致的环境变化。例如,温湿度、CO₂、甲烷、氨气等微量气体的精准监测,以及虫害检测技术的提高。

人工智能尤其是深度学习将在智慧粮仓系统中扮演越来越重要的角色。未来,系统不仅能够对粮仓的环境进行监测和管理,还能够根据环境数据分析出最优存储方案和应急响应措施。

  • 智能决策系统:深度学习可以帮助系统识别不同的粮食存储风险,如温湿度异常、虫害爆发等,并给出最佳应对方案。例如,基于历史数据和气候模型,AI系统可以预测特定气候条件下粮食存储的风险,并自动调整粮仓的管理策略。
  • 自适应控制系统:未来的智能粮仓将具备自适应学习能力,可以通过不断收集和分析数据,优化控制算法和管理策略,逐步提高粮仓管理的效率和精准度。

随着全球化农业供应链 的发展,未来的智慧粮仓系统将不仅限于单一农场或区域的应用,而是可能涉及到全球粮食存储的管理。多国农业合作和跨国粮仓管理将成为一种趋势。

  • 跨区域数据共享与协作:借助物联网平台,全球不同地区的粮仓管理可以实现数据共享和协作。例如,通过全球粮仓环境监测数据的汇总与分析,研究人员能够更准确地预测全球范围内粮食生产和存储的趋势,及时发现潜在的供应链风险。
  • 智能供应链管理:智慧粮仓不仅限于存储管理,还将参与到全球粮食供应链的优化和管理中。基于环境监测数据,系统可以实时反馈粮仓库存情况,协助物流系统和市场预测,确保粮食资源的合理分配。

随着可持续发展理念的普及,绿色环保技术将在未来的智慧粮仓系统设计中占据越来越重要的地位。例如,低能耗、绿色节能设备、生态友好的除湿除害技术将成为未来研究的重点。

  • 绿色能源与智能化控制 :未来的粮仓将逐步采用太阳能、风能等可再生能源,并结合智能化控制系统,实现能源的高效利用。同时,粮仓内的通风和温控设备将更加节能环保,减少对环境的负担。
  • 可持续农业技术的融合 :例如,通过使用生物防治技术替代传统的化学杀虫剂,并结合环境监测系统对虫害进行精准防治,减少粮食存储过程中对环境的污染。

随着技术的不断进步,智慧粮仓环境监测与管理系统 将在未来得到更加广泛的应用。国外的研究现状表明,通过先进的传感器技术、物联网、大数据分析和人工智能的结合,智慧粮仓系统已逐步形成一个高效、智能和可持续的管理体系。在未来,系统将向着深度智能化、绿色环保的方向发展,并通过全球化的协作和数据共享,为全球粮食安全提供更加可靠的保障。

二、相关技术基础

2.1. 环境监测技术

环境监测技术是智慧粮仓设计的基础之一,其核心目的是实时采集仓库内的温湿度、气体成分(如二氧化碳、氨气等)、光照强度及空气流通状况等环境参数。这些参数的监测对于粮食的储存质量至关重要。

  • 传感器技术:传感器是环境监测系统中不可或缺的设备。通过温湿度传感器、气体传感器等实时监测环境数据。例如,温湿度传感器能够准确测量仓内的温湿度情况,过高或过低的温湿度可能导致粮食霉变或腐烂。气体传感器则可以检测粮仓内的有害气体,如二氧化碳、氨气等,这些气体浓度的变化可能指示粮食储存过程中出现了问题。

  • 无线通信技术:监测数据需要传输到远程管理平台,通常采用无线通信技术(如Wi-Fi、LoRa、NB-IoT等)进行数据传输。LoRa技术在长距离低功耗传输方面有显著优势,适合大规模分布式传感器网络的建设。

2.2. 物联网(IoT)技术

物联网技术是实现智慧粮仓的关键技术之一。通过物联网技术,粮仓内部的各类设备、传感器及监控系统可以联网互通,实现自动化数据采集与传输。

  • 数据实时采集与监控:通过传感器节点实时采集粮仓环境数据,并将数据通过网络传输到中心控制平台,进行远程监控和分析。管理人员可以实时了解仓内环境的变化,及时采取措施,确保粮食存储安全。

  • 自动化控制:物联网技术不仅能实时采集数据,还能通过自动化控制设备调节粮仓环境。例如,当温湿度传感器检测到温度过高时,系统可以自动启动风扇或空调设备,调节环境温度;当空气中二氧化碳浓度过高时,可以开启通风系统。

2.3. 自动化控制系统

自动化控制系统是确保智慧粮仓能够实现精准管理与智能调节的核心技术。

  • 环境控制系统:自动化控制系统能够根据传感器的数据反馈,自动调节温湿度、通风、气体浓度等环境参数。例如,当监测到空气湿度过高时,自动启动除湿设备;当粮仓内温度过低时,自动启动加热装置,维持合适的存储环境。

  • 自动化警报系统:系统能够根据设定的阈值,当监测数据超出正常范围时,自动触发报警,提醒管理人员及时采取措施。警报不仅可以通过短信、邮件等方式发送给管理人员,还可以通过管理平台实时展示警报信息,便于工作人员做出迅速反应。

三、设计目的:

3.1 项目背景

随着现代农业生产的不断发展,粮仓的智能化管理已经成为提高粮食安全和质量的关键因素之一。为了有效监控和管理粮仓内部环境,确保粮食存储条件符合安全标准,逐步实现自动化、远程监控和预警系统显得尤为重要。基于此背景,本项目旨在利用STM32微控制器、QT界面以及各类环境传感器 ,构建一个集环境数据采集、处理、展示、报警和远程监控 于一体的智能粮仓监控系统。该系统通过实时监测粮仓内部的温度、湿度、气体浓度等环境数据,确保粮仓内的存储环境符合粮食安全的要求,进而有效防止粮食发霉、变质、受损等问题的发生,保障粮食质量和安全。首先,系统通过一系列温度、湿度、气体传感器等传感器进行实时数据采集。

传感器将持续监测粮仓内的环境变化,并将采集到的数据传输至STM32微控制器进行处理与分析。STM32微控制器具有强大的数据处理能力,能够根据事先设定的安全阈值对采集的数据进行实时判断,一旦发现温湿度、气体浓度等数据超过设定范围,系统将立即触发报警机制。通过这种方式,能够在第一时间内发出警报,提醒管理人员及时采取相应的处理措施,避免环境异常导致的粮食安全问题。

此外,QT界面作为图形用户界面框架,将处理后的环境数据通过可视化的方式呈现给用户,提供直观、易操作的界面,用户可以随时查看粮仓内各项环境数据的变化趋势,包括温湿度、气体浓度等关键信息。为了提升系统的可操作性,QT界面还提供了数据设置、设备管理和报警历史记录等功能,便于用户灵活配置和管理系统。

在数据监测和报警的基础上,系统还具备强大的远程监控功能。通过数据传输模块,管理人员可以通过互联网实现对粮仓环境的远程访问和监控,随时随地获取实时数据,确保粮仓管理不受时间和空间的限制。为了进一步增强系统的可追溯性,所有的环境数据都会被记录和存储,以便后期进行分析和查询。

这些历史数据不仅可以帮助用户了解粮仓的环境变化趋势,还能够为后续的管理决策提供科学依据。通过对历史数据的分析,用户能够发现潜在的问题并提前采取预防措施,从而避免粮食安全隐患的发生。综上所述,本系统通过STM32微控制器、QT界面和各类传感器的结合,实现了粮仓管理的智能化升级,确保粮仓环境的稳定和粮食质量的安全,同时也为管理人员提供了一个更加高效、便捷的管理平台,从而大大提高了粮仓管理的智能化水平。

3.2 设计意义:

本项目设计的智慧粮仓环境监测与管理系统具有重要的实践意义和应用价值,能够有效提升粮仓管理的自动化、智能化水平,保障粮食的存储安全和质量。首先,环境监测和管理的智能化能够大大减少人为操作的依赖,通过引入温湿度、气体浓度等各类传感器,系统可以实时监测粮仓内的环境变化,确保粮食储存条件始终保持在最优状态。

通过STM32微控制器的处理与分析,系统能够根据设定的安全阈值自动判断环境是否处于安全范围,一旦发现异常,立刻采取报警机制进行提醒。这种高度自动化的管理方式,能够有效减少人为疏忽对粮仓环境的影响,提升管理的精准度和响应速度。

其次,数据展示和可视化功能极大地提升了用户的操作体验和管理效率。通过QT界面,用户不仅能够直观地查看粮仓环境的实时数据变化,还可以通过图形化的方式方便地分析和管理各类参数。这种易操作、友好的用户界面设计,能够使管理人员更高效地做出决策,避免了繁琐的手工记录和监控,降低了管理的复杂度。

在粮仓管理中,报警系统的引入至关重要。通过设定合理的阈值,一旦监测到环境数据超出安全范围,系统会自动触发报警机制,并及时通知管理人员,确保粮仓在异常情况下能够得到快速处理。这不仅提高了粮仓管理的响应速度,还能有效避免粮食在不利环境下遭到损害,减少因环境异常带来的经济损失。

此外,远程监控和数据记录功能使得管理人员能够随时随地通过网络对粮仓进行远程监控,实时获取数据,了解粮仓环境的变化情况。无论是日常检查还是突发事件处理,远程监控都能大大提高管理的便利性和灵活性。

同时,系统会自动记录历史数据,这些数据可以为后期的分析、预警和决策提供重要依据,帮助用户了解粮仓环境变化的长期趋势,并通过数据分析进行预测和优化。这种数据驱动的决策支持系统不仅提升了粮仓管理的科学性,还为管理人员提供了可靠的数据支持,从而确保粮食的安全存储和质量稳定。

通过STM32微控制器与QT界面的结合,本项目的设计实现了智能粮仓环境监控与管理的全面升级,使得粮仓管理不仅更加高效、精准,还能应对各种复杂的环境变化,最终确保粮食的安全和质量,具有较高的技术和经济价值。

四、硬件部分:

4.1 stm32f103c8t6(1个)

STM32F103C8T6是基于Cortex-M3内核的微控制器 ,具备强大的性能与灵活性,特别适合中小型嵌入式系统开发。该芯片的工作频率最高可达72MHz ,提供了充足的计算能力,能够支持复杂的算法和高效的数据处理任务。64KB闪存和20KB SRAM的存储配置 使得STM32F103C8T6能够在存储需求相对较小的应用中表现出色,尤其适合资源有限但又要求高性能的系统。丰富的外设接口 是其一大亮点,USART、SPI、I2C、CAN和USB等接口使得STM32F103C8T6在通信方面具有极高的灵活性和兼容性。这些接口不仅支持与外部设备的高效数据交换,还能够连接各种传感器、执行器以及其他嵌入式模块,拓展了应用场景的多样性。例如,USART接口适合串口通信,SPI和I2C接口能够与其他微控制器或外设进行高速数据传输,而CAN接口则为车载系统或工业控制系统提供了可靠的通信支持。

此外,STM32F103C8T6拥有多达37个GPIO引脚 ,这些引脚可以灵活配置为数字输入、数字输出、模拟输入或PWM输出,方便连接各类外部传感器和执行器。这些GPIO引脚的多功能性,使得STM32F103C8T6能够适应各种嵌入式应用的需求,不论是传感器数据采集 还是信号控制输出 ,都能够轻松实现。为了满足模拟信号处理的需求,STM32F103C8T6内部集成了12位ADC和DAC,这使得系统能够进行高精度的模拟信号采集和输出,适用于需要精细模拟控制的应用场景,如音频处理、传感器信号调节等。

另一方面,该芯片还支持多种低功耗模式 ,如睡眠模式和待机模式,能够有效延长电池供电设备的使用寿命,因此非常适合用于便携式设备或电池供电的应用场景。在开发和调试方面 ,STM32F103C8T6支持JTAG/SWD调试接口,为开发者提供了便捷的调试手段,能够快速定位问题并进行实时调试,大大提高了开发效率。

再加上STM32的丰富开发生态系统 ,包括HAL库、CubeMX工具以及Keil、IAR等集成开发环境,开发者可以借助这些工具快速搭建开发平台并实现项目需求。无论是进行裸机开发还是使用操作系统,STM32F103C8T6都能提供高效且稳定的支持。总的来说,STM32F103C8T6凭借其强大的处理能力、丰富的外设接口、灵活的GPIO配置、高精度模拟信号处理以及低功耗特性,为嵌入式系统开发提供了广泛的应用空间和灵活的解决方案,是开发人员进行各类中小型嵌入式项目的理想选择

STM32F103C8T6核心板在整个项目中扮演着至关重要的角色,它作为系统的"大脑",负责处理所有的逻辑运算和控制任务,确保系统高效、稳定地运行。首先,STM32F103C8T6以其亲民的价格和卓越的性能在嵌入式开发领域备受青睐,这使得它成为各种机器人和复杂电子项目中 理想的核心板。它搭载Cortex-M3内核,具备最高72MHz的工作频率,为项目提供足够的计算能力,能够应对多任务的并发处理,确保项目中的各项功能高效协同运行。

该核心板不仅在性能上达到高标准,而且具备足够的灵活性,可以轻松实现各种创意功能。无论是处理简单的传感器数据 ,还是执行复杂的运动控制、图像处理 等任务,STM32F103C8T6都能以高效、稳定的方式完成工作,保证了机器人的平稳运行。在外设接口 方面,STM32F103C8T6拥有丰富的功能,如USART、SPI、I2C等多种通信接口 ,这些接口为与外部设备的连接提供了极大的便利,使得机器人系统能够实现传感器数据的采集与传输、与其他模块的通信等多种功能。核心板提供的PWM输出还可以精确控制电机或舵机的转动,使机器人在运动控制中具备高度的精确性和响应速度。

更重要的是,STM32F103C8T6还具备低功耗特性 ,这对于电池供电的机器人系统 尤为关键。该芯片支持多种低功耗模式,如睡眠模式和待机模式 ,能够在不影响系统正常工作的前提下,降低功耗,延长机器人设备的使用时间,特别适用于需要长时间运行的嵌入式应用。由于其具备如此强大的性能和丰富的功能接口,STM32F103C8T6成为了项目开发中不可或缺的部分,无论是在传感器的实时数据处理、运动控制的精准执行,还是在其他复杂任务的管理中,它都能够高效地完成,并且提供了高度的灵活性以满足不同应用的需求。因此,STM32F103C8T6在整个机器人项目中不仅保证了功能的实现,还优化了系统的整体性能,是推动项目成功的核心驱动力

电路原理图:

4.2 光敏传感器(2个)

光敏传感器是一种能够感知光强度并将其转化为电信号的传感器,广泛应用于自动控制、照明调节、光线检测、机器人视觉系统等领域。它通过光电效应工作,当光照射到光敏元件上时,会引起电流或电压的变化。光敏传感器的种类繁多,常见的包括光电二极管、光敏电阻(LDR)、光电晶体管等。

光敏传感器的核心工作原理基于光电效应,它能够捕捉到光的强度变化,并相应地输出一个电信号。光敏电阻(LDR)是最常见的一种,它的电阻值随光照强度的变化而改变,在光强度较强时电阻较低,而在光照较弱时电阻较高。

通过测量光敏电阻两端的电压或电流,可以获得光的强弱信息。相比于传统的光源调节方式,光敏传感器具有更高的自动化水平和更精确的调节能力,可以在不同的光照条件下自动调节系统的工作状态。

智能家居系统 中,光敏传感器被广泛用于调节室内灯光的亮度或开启和关闭室内照明设备,依据实时光照的变化,自动实现节能控制和环境优化。此外,光敏传感器在环境监测农业领域中也有重要应用,它能够帮助监测不同时间段的自然光照情况,进而为植物生长提供科学依据。

随着光敏传感器技术的发展,现代光敏传感器不仅可以检测可见光,还能对紫外线、红外线等其他波长的光进行响应,使其应用场景更加广泛。光敏传感器 由于其简单、高效、低成本的特点,在各种自动化系统中扮演着重要角色,尤其是在智能监控系统光伏发电系统 以及智能交通管理等方面,能够实时感知环境光变化并做出相应反应,提升了系统的智能化水平和应用价值。

电路原理图:

4.3 烟雾传感器(2个):

烟雾传感器是一种用于检测空气中烟雾或火灾迹象的传感器,它能够在火灾初期或烟雾产生时迅速作出响应,发出警报或触发自动控制系统。烟雾传感器广泛应用于火灾报警系统、智能家居、工业安全、公共场所等领域,其主要功能是通过检测空气中的烟雾浓度,及时发现潜在的火灾风险,并通知用户采取防护措施或自动启动灭火装置。

烟雾传感器通常有两种工作原理,一种是基于光散射原理的光电烟雾传感器,另一种是基于电离原理的电离烟雾传感器。光电烟雾传感器通过向空气中发射一束光,并监测烟雾粒子对光的散射情况来判断空气中是否含有烟雾。当烟雾粒子进入传感器的光路时,会散射光线,导致传感器的接收器接收到的光信号发生变化,从而触发警报。

烟雾传感器 的应用在现代社会中非常广泛,尤其是在家庭、商业和工业场所,它可以有效地提高火灾预警能力,减少火灾造成的损失。现代的烟雾传感器不仅能提供传统的报警功能,还可以与智能家居系统、消防系统等其他设备进行联网,实现更高层次的自动化控制。在智能家居系统中,烟雾传感器与智能烟雾报警器结合使用,能够在火灾发生时自动关闭门窗、启动通风系统或联动灭火装置,增强安全性。在工业环境中,烟雾传感器能够在火灾发生初期就检测到烟雾,并通过自动控制系统及时启动灭火器,减少火灾蔓延。

烟雾传感器 的灵敏度和稳定性至关重要,它需要在检测到烟雾时能够迅速响应,并能够抵抗环境干扰,比如温度波动、湿度变化等因素。因此,开发高效、稳定的烟雾传感器对于提高火灾安全性和防范能力具有重要意义。随着技术的发展,烟雾传感器的体积变得越来越小,功耗更低,同时其可靠性、精准度和响应速度也有了显著提升,极大地推动了火灾安全防护技术的进步。总的来说,烟雾传感器作为一种重要的安全检测设备,不仅能够保护生命财产安全,还能提高自动化火灾应对系统的效能,是现代安全管理系统中不可或缺的一部分。

电路原理图:

4.4 OLED 显示屏(1个):

OLED显示屏 (有机发光二极管显示屏)是一种基于有机材料的发光显示技术,具有自发光特性,不需要背光源。它由多层有机薄膜组成,这些薄膜层位于两个电极之间,其中一个是透明电极。通过电流作用,有机材料会发光,显示器的每个像素点都能独立发光,因此OLED显示屏具有极高的对比度、宽广的视角和快速的响应时间。OLED显示屏的优势在于其能够实现更薄、更柔性、更轻便的显示效果,因而在许多领域得到了广泛应用,如智能手机、电视、可穿戴设备、汽车仪表盘、虚拟现实设备等。

与传统的液晶显示屏(LCD)不同,LCD依赖于背光源和液晶层控制光的通过,而OLED显示屏 的每个像素自发光,能够更精确地控制每个像素的亮度和颜色,从而提供更深的黑色、更鲜艳的颜色和更高的对比度。OLED显示屏的色彩表现非常丰富,能呈现更为生动和逼真的图像,特别是在显示黑色时,由于像素点完全不发光,可以实现真正的"黑色",从而大大提升了显示效果的深邃感和视觉冲击力。

此外,OLED显示屏 的响应时间非常快,几乎是即时响应,使得动态画面更加流畅,适合用于需要快速显示变化的应用场景,如游戏、视频播放和虚拟现实。由于OLED显示屏 具有自发光的特性,它不需要背光源,从而能够减少厚度和能耗。相比于传统的LCD显示屏,OLED显示屏不仅能够提供更轻薄的设计,而且能够在低功耗状态下提供高质量的图像,尤其在显示黑色时,只有部分像素发光,极大地减少了能耗,因此在智能手机、电视等设备中,OLED显示屏能够实现更长的电池续航。

OLED显示屏 还具有广视角的特点,几乎在任何角度下观看时,图像质量都不会受到明显的影响,这使得它在大型显示屏和广告屏幕中得到了广泛应用。同时,OLED显示屏 的柔性版本也正在成为一种趋势,因其能够弯曲或卷曲,适应更多不同的设计需求,例如弯曲电视屏、可折叠手机屏幕等。尽管OLED显示屏具有诸多优点,但其也有一定的缺点,主要体现在较短的使用寿命和烧屏现象。

由于OLED的有机材料在长时间高亮度使用下会逐渐老化,从而影响显示效果,因此需要特别注意避免长时间显示相同的图像。为了克服这些问题,OLED显示屏 技术不断发展,制造商正在采取先进的技术手段来延长其使用寿命和减少烧屏现象的发生。总的来说,OLED显示屏凭借其卓越的显示效果、灵活的设计、低功耗和广泛的应用前景,已经成为现代显示技术中的重要突破之一,并且在未来会在更多领域展现出其巨大的潜力。

电路原理图:

4.5 DHT11传感器(1个):

DHT11传感器 是一款常见的数字温湿度传感器,用于测量环境的温度和湿度。它通过内部集成的温湿度传感元件和数字信号处理电路,将模拟的温湿度数据转化为数字信号输出,便于微控制器(如Arduino、Raspberry Pi等)进行读取和处理。DHT11传感器的工作原理基于电容式湿度传感器和热敏电阻的组合,当空气湿度变化时,传感器内部的电容值会随之变化,而温度变化则会影响其热敏电阻的电阻值。这些变化通过传感器内部的电路转换成数字信号,最终通过单线制的通信协议输出给外部设备。

DHT11传感器 的主要特点是体积小巧、易于使用,且具有较低的成本,因此在许多入门级的DIY项目中得到了广泛应用。它适用于家庭自动化、气象站、环境监测等领域。尽管DHT11传感器的测量范围和精度相比于其他高端传感器有所限制,但它依然能够满足一般应用场景中的温湿度监测需求。

DHT11传感器 的工作温度范围通常为0到50摄氏度,湿度范围为20%到80%,精度上,温度的误差为±2℃,湿度的误差为±5%RH。对于需要高精度温湿度数据的场合,可能需要选择更高规格的传感器,但在大多数基础项目中,DHT11传感器 已经能够提供足够的数据。DHT11传感器通过单总线接口与控制器进行通信,这意味着它只需要一根数据线即可完成数据传输,这对于减少接线的复杂性非常有帮助。

该传感器的电压范围为3.3V至5V,工作电流较低,非常适合嵌入式系统和低功耗设备。在实际应用中,DHT11传感器 常常与开发板结合使用,用户可以通过简单的编程实现温湿度数据的实时监控和显示。由于其易用性和低成本,DHT11传感器 广泛应用于环境控制系统、农业温湿度监测、室内空气质量检测等场合,尤其适合初学者进行项目开发。虽然DHT11传感器的测量精度和稳定性存在一定的局限性,但其稳定的工作性能和简单的接线方式使得它在教育、科研以及各类基础应用中依然有着重要的地位。

随着物联网和智能家居的兴起,DHT11传感器 也成为了许多低成本智能监控系统的核心组件,帮助用户在多种环境中实现温湿度数据的采集与监控。总的来说,DHT11传感器以其简单、低廉、可靠的特点,成为了一个非常适合初学者和小型项目的选择,尤其在温湿度监测领域中具有不可替代的作用。

电路原理图:

4.6 蜂鸣器(1个):

蜂鸣器是一种广泛使用的电子元件,能够通过电声转换原理发出声音警告或提示信号。它通常由一个振动膜和驱动电路组成,当电流通过蜂鸣器内部的电磁线圈或压电陶瓷材料时,振动膜受到驱动并产生振动,从而发出声音。

根据其工作原理,蜂鸣器 可以分为两种主要类型:有源蜂鸣器无源蜂鸣器有源蜂鸣器 内置了驱动电路,当提供直流电源时,它会自动产生声音,因此无需外部频率信号的输入。而无源蜂鸣器 则需要外部电路提供频率信号,驱动其产生声音。蜂鸣器在许多电子产品中都得到了广泛的应用,包括家电、玩具、仪器、报警设备等,它们通过产生不同频率和音量的声音来提示用户发生了某种事件或状态变化。

例如,当家电设备完成任务时,蜂鸣器 可以发出提示音;当温度、湿度传感器达到设定阈值时,蜂鸣器 可以用于报警。蜂鸣器 的优点在于其简单的结构和较低的成本,使得它成为嵌入式系统中不可或缺的组成部分。它的工作电压通常为3V、5V或12V,并且对电流的要求较低,适合于与微控制器如Arduino、树莓派等连接使用。由于蜂鸣器 的响应速度快,可以迅速发出声音信号,因此它也常被用于需要即时反馈的应用场合。对于一些设计复杂的系统,蜂鸣器能够通过不同频率的音调变化和节奏差异,传达不同的信号含义,增强系统的可操作性和安全性。

比如,在一些报警系统中,蜂鸣器 的响声可以通过改变频率的高低来区分不同的警报类型,例如火灾、入侵或电池电量低等情况。此外,蜂鸣器 的音量和音调可通过调节输入电压和频率来进行控制,这使得它在实际应用中具有较大的灵活性。在某些高端应用中,蜂鸣器 的音频输出也可以与其他报警信号(如闪光灯、显示屏提示等)结合使用,提供更加直观和醒目的警报效果。然而,尽管蜂鸣器有着众多优点,但它也有一定的限制。

例如,由于声音的传播距离受限,蜂鸣器 产生的声音可能在嘈杂的环境中不容易被听到,因此在某些情况下需要与其他设备联合使用。此外,蜂鸣器 的声音输出通常是单一音调,对于需要多音调或者复杂音效的场合,可能需要选择更加专业的音响系统或音频模块。总的来说,蜂鸣器凭借其简便的控制方式、低成本、高效的信号传递能力,已经成为现代电子产品中不可或缺的警示与提示工具,广泛应用于各种工业、家庭、安防及消费电子设备中。

电路原理图:

4.7 esp8266WiFi模块(1个):

ESP8266 WiFi模块 是一款基于ESP8266芯片的低成本、高性能的WiFi通信模块,广泛应用于物联网(IoT)项目中。它由中国乐鑫科技(Espressif Systems)推出,具有集成度高、功耗低、传输速率快等特点,成为许多嵌入式系统中必不可少的无线通信组件。ESP8266 WiFi模块 支持802.11b/g/n标准的WiFi协议,能够通过WiFi网络进行数据的发送和接收,广泛用于智能家居、传感器数据采集、远程控制等应用场景。它的工作原理是通过内置的WiFi芯片与路由器或WiFi热点连接,建立起数据通信通道,从而实现与其他设备或云平台的远程数据交互。ESP8266 WiFi模块的核心是一个功能强大的32位RISC架构的微处理器,具备独立运行的能力,可以单独执行应用程序,无需依赖其他控制器。这意味着开发者可以直接在模块上编程,进行数据采集、处理和网络通信等操作,省去了额外的硬件支持。

ESP8266 WiFi模块 不仅支持TCP/IP协议栈,还具有强大的AP(接入点)模式和STA(站点)模式,可以作为WiFi接入点或WiFi客户端,灵活适应不同的网络拓扑结构。在实际应用中,ESP8266 WiFi模块 的配置和编程相对简单,开发者可以通过Arduino IDE、Lua脚本或者直接使用AT命令对模块进行控制和管理。对于初学者来说,使用ESP8266 WiFi模块 进行物联网项目开发非常方便,模块的开源软件和大量的社区支持使得开发者能够快速实现自己的想法。ESP8266 WiFi模块的引脚数量不多,通常为8到16个引脚,模块本身的尺寸也非常小巧,适合嵌入到各种小型设备中。

它的工作电压一般为3.3V,尽管部分开发板可以支持5V输入,但通常需要使用稳压模块将电压降低到3.3V,以确保模块的稳定运行。在无线通信方面,ESP8266 WiFi模块 支持较长的通信距离,通常在几十米范围内具有较强的信号稳定性,但在具体环境中,信号强度可能会受到障碍物和电磁干扰的影响。在功耗方面,ESP8266 WiFi模块相较于传统的WiFi模块具有显著的优势,特别是在低功耗模式下,能够为电池供电的物联网设备提供较长时间的运行能力,因此在移动设备和远程传感器中应用广泛。

作为物联网设备的核心组件之一,ESP8266 WiFi模块 具有较强的扩展性,开发者可以通过GPIO引脚与外部传感器或执行器连接,实现多种功能。例如,ESP8266 WiFi模块 可以与温湿度传感器、光照传感器、继电器、摄像头等硬件结合,通过WiFi进行数据上传或远程控制。在智能家居领域,ESP8266 WiFi模块 常常用来控制灯光、窗帘、温度和湿度等设备,通过互联网连接实现远程操作和自动化控制。由于其低成本、易用性和广泛的开发支持,ESP8266 WiFi模块 已成为物联网应用开发中最受欢迎的选择之一,适合用于各种工业、商业和家庭自动化系统中。总之,ESP8266 WiFi模块以其高效的WiFi通信能力、低功耗、小尺寸和强大的功能,成为了嵌入式系统和物联网设备中不可或缺的重要模块,特别适合那些需要无线联网、远程控制及数据传输的应用场景。

电路原理图:

4.8 驱动模块(1个):

驱动模块 是电子系统中用于控制其他元件(如电机、LED、蜂鸣器等)的电流和电压的电路模块。它通常作为中间层,连接控制器(如微控制器、单片机、开发板等)与需要驱动的负载元件之间。由于许多负载元件需要的电流和电压远高于控制器本身能够提供的水平,驱动模块的作用就是将微控制器输出的低功率信号转化为能够驱动负载所需的高功率信号,从而使得微控制器能够控制更强大的设备。

常见的驱动模块有电机驱动模块、LED驱动模块、继电器驱动模块、步进电机驱动模块等。每种驱动模块的工作原理和应用场景略有不同,但它们的核心功能都是为了将控制信号放大,以便能控制大功率负载。

电机驱动模块 为例,它能够根据输入的控制信号,通过内部电路控制电机的启停、转速、方向等参数。电机驱动模块 广泛应用于机器人、自动化设备、电动玩具等领域。最常见的电机驱动模块有L298N、L293D等,它们可以控制直流电机、步进电机或伺服电机的运转。对于高功率的设备,通常会使用专用的驱动模块 ,比如用于LED灯带的LED驱动模块,它们能够调节电流,确保LED在适宜的工作电流下发光,防止电流过大烧毁LED。

对于继电器驱动模块 ,它用于通过控制低电平的信号(如微控制器输出的GPIO信号)来控制继电器的开关,从而间接控制家电、照明等高功率设备的开关状态。驱动模块 的核心功能通常包括信号放大、功率转换、方向控制等,且在工作时可以实现精准的控制,如PWM(脉宽调制)控制信号用于调节电机速度或LED亮度。控制信号通过驱动模块后,可以提供足够的电流和电压,驱动更高功率的负载设备。在现代嵌入式系统中,驱动模块扮演着重要的角色,尤其是在智能家居、自动化控制、机器人等应用中,它能够有效地扩展微控制器的控制能力,确保系统可以操作更复杂、更高功率的设备。

驱动模块 的使用可以大大简化硬件设计,避免直接使用复杂的高功率控制电路,同时保护微控制器等控制单元免受电流过大的损害。总的来说,驱动模块通过将微控制器低电压、低电流的输出信号转化为足够强大的电力来控制负载,它在电子设计中起到了至关重要的作用,几乎是所有需要控制大功率设备的电子系统中不可或缺的一部分。

电路原理图:

4.9 二氧化碳传感器(2个):

二氧化碳传感器 是一种能够检测空气中二氧化碳(CO₂)浓度的电子设备,它广泛应用于环境监测、智能家居、工业控制和空气质量检测等领域。二氧化碳传感器 通常通过化学、红外或电化学原理来感知空气中的二氧化碳浓度,并输出相应的电信号,供后续的处理系统或控制设备使用。在家庭和办公环境中,二氧化碳传感器 常用于空气质量监控系统,通过监测空气中的CO₂浓度,自动调节通风系统或空调设备,以维持室内空气的新鲜度和舒适度。在工业环境中,二氧化碳传感器被用来检测二氧化碳泄漏,确保操作环境的安全,尤其在高温高压的生产环境中,如制药、化工厂等,它能够有效防止由于二氧化碳泄漏引起的事故。

二氧化碳传感器的工作原理主要分为红外吸收法、电化学法和化学法三种。红外吸收法基于二氧化碳分子对特定波长红外光的吸收特性,通过测量红外光的变化来计算CO₂的浓度。这种方法准确度高,响应速度快,常用于高精度要求的场景,如实验室、温室控制等。电化学法则通过化学反应产生的电流变化来反映气体浓度,通常具有较高的稳定性和较长的使用寿命,适合用于中低精度的测量,广泛应用于室内空气质量监控和智能家居系统。化学法则是利用二氧化碳与某些化学物质发生反应时改变颜色的原理,经过颜色变化的程度来推测气体浓度,虽然这种方法较为简单,但其精度和灵敏度相对较低,主要用于教育或低成本的应用场景。

二氧化碳传感器 的测量精度和响应时间与其类型、应用环境和技术特性有关。在实际应用中,许多二氧化碳传感器 可以通过I2C、UART或模拟输出与其他系统进行通信,以便将采集到的二氧化碳浓度数据传输给控制系统或监控平台。现代的二氧化碳传感器 不仅具备高灵敏度、低功耗、体积小等特点,还能在温湿度变化较大的环境下稳定工作,一些高端型号还具备自我校准和自动温湿度补偿的功能,进一步提高了测量精度和稳定性。随着空气质量问题日益受到重视,二氧化碳传感器在智能建筑、智能农业、环境监测等领域的应用前景广阔。

例如,在智能农业中,二氧化碳传感器 用于温室环境的气候调节,通过控制CO₂浓度来优化植物的光合作用,提升产量;在环境监测中,它可用于实时监测城市空气质量,及时发现污染源,为公众健康提供预警。二氧化碳传感器 在物联网(IoT)应用中尤为重要,随着物联网技术的发展,越来越多的设备和系统通过集成二氧化碳传感器 来实现智能化控制,如智能空气净化器、自动通风系统等,这些设备能够根据二氧化碳浓度自动调整运行状态,为用户提供舒适健康的生活环境。总的来说,二氧化碳传感器作为一种精确的气体传感器,通过实时监测二氧化碳浓度,能够为各类环境的优化提供有效数据支持,推动智能控制和自动化系统的发展,具有广泛的应用价值和发展潜力。

电路原理图:

4.10 整体电路设计:

组件名称 引脚号 功能描述
STM32F103C8T6 单片机 VCC 电源输入
A0-A15 模拟/数字输入输出引脚
光敏传感器 H1, H2 检测光照强度
烟雾传感器 H3, H4 检测烟雾浓度
DHT11 传感器 H5, H6 温湿度传感器
蜂鸣器 H7 发声,用于提示
WIFI 模块 H8-H10 无线通信模块
驱动模块 H11-H12 控制其他设备的驱动信号
OLED 显示屏 H13-H14 显示信息
二氧化碳传感器 H15 检测环境中的二氧化碳浓度

在本项目中,我们使用了STM32F103C8T6单片机 作为核心控制单元,负责整个系统的运作和协调。该单片机的VCC引脚 为电源输入,确保系统能够正常工作。其A0-A15引脚则被配置为模拟和数字输入输出引脚,以便与各种传感器和其他外设进行交互。

光敏传感器 通过H1和H2引脚 连接,能够实时检测周围环境的光照强度,为系统提供光照变化的信息,这在智能家居自动化控制 中具有重要意义。烟雾传感器 连接于H3和H4引脚 ,负责监测空气中的烟雾浓度,及时发出警报以保障安全。此外,DHT11传感器 通过H5和H6引脚与单片机连接,能够同时测量温度和湿度,为环境监控提供必要的数据支持。

为了增强用户体验,系统中还集成了一个蜂鸣器 ,通过H7引脚 发声,用于提示用户系统状态或报警信息。无线通信模块 通过H8-H10引脚连接,能够实现远程数据传输和控制功能,使得用户可以通过手机或计算机对系统进行监控和管理。

驱动模块 连接于H11和H12引脚 ,负责控制其他设备的驱动信号,确保外部设备能够根据系统的指令进行相应操作,如开关灯或调节风扇等。同时,OLED显示屏 通过H13和H14引脚连接,实时显示系统的工作状态、传感器数据和其他重要信息,以便用户快速获取相关信息。

最后,二氧化碳传感器 通过H15引脚 监测环境中的二氧化碳浓度,为室内空气质量提供重要数据,确保用户的健康与安全。综上所述,本设计综合了多种传感器和模块,形成一个智能、综合的环境监测系统,既能实现实时数据采集,又能通过显示和提示功能增强用户体验,具有良好的实用价值和应用前景。

五、软件设计:

基于 STM32 微控制器的一个嵌入式应用程序,涉及多个传感器数据采集、处理和显示,以及通过 OneNET 平台发送数据的功能。

传感器数据采集:读取光照、烟雾、温湿度和 CO2 等传感器的数据。

UI 控制:通过按钮控制用户界面(UI),显示不同的传感器数据和设置界面。

OLED 显示:在 OLED 屏幕上显示相关数据。

报警控制:根据传感器数据触发蜂鸣器和风扇。

数据上传:将传感器数据发送到 OneNET 平台。

5.1 stm32源码主要组件分析:

5.1.1 传感器数据采集

  • 光照传感器 :通过 adc_data.Light1adc_data.Light2 读取光照数据。
  • 烟雾传感器 :通过 adc_data.fumes1adc_data.fumes2 读取烟雾数据。
  • 温湿度传感器DHT11 传感器的温湿度数据分别通过 DH11_data_1DH11_data_2 获取。
  • CO2 传感器 :通过 voc_ch2o_co2_data.co2voc_ch2o_co2_data_2.co2 获取 CO2 数据。

5.1.2 用户界面控制(UI)

  • UI 变量控制当前的用户界面状态,UI 的取值决定了显示什么内容以及按钮的功能:

    • UI == 0:显示传感器的实时数据。
    • UI == 1:设置温度阈值 temp_F
    • UI == 2:设置湿度阈值 humi_F
    • UI == 3:设置光照阈值 light_F
    • UI == 4:设置烟雾阈值 fumes_F
    • UI == 5:设置 CO2 阈值 CO2_F
  • 按钮控制:GPIO_PIN_12GPIO_PIN_13 控制增加和减少阈值,GPIO_PIN_15 切换显示界面。

5.1.3 报警和控制逻辑

  • 根据不同传感器的读取值与设定的阈值进行对比,决定是否触发报警和风扇。
    • 如果光照、烟雾、温湿度或 CO2 的数据超过设定的阈值,就触发蜂鸣器和风扇。
    • Buzzer_ControlMotor_Control 函数用于控制蜂鸣器和风扇的状态。

5.1.4 OLED 显示

  • OLED 屏幕通过 OLED_ShowData 函数显示当前的传感器数据或设置界面。根据 UI 变量的值,显示不同的内容:
    • UI == 0 显示光照、烟雾、温湿度和 CO2 数据。
    • UI == 1 显示当前的温度阈值设置。
    • UI == 2 显示湿度阈值设置。
    • UI == 3 显示光照阈值设置。
    • UI == 4 显示烟雾阈值设置。
    • UI == 5 显示 CO2 阈值设置。

5.1.5 OneNET 数据发送

  • Send_Data 函数定期将传感器数据和设备状态发送到 OneNET 云平台。发送的数据包括:
    • 光照、烟雾、温湿度、CO2 数据。
    • 各个阈值设置(如 temp_F, humi_F, light_F, fumes_F, CO2_F)。
    • 风扇状态 (fan) 和蜂鸣器状态 (buzzer)。
  • Get_Send_Pack 用于构建要发送的数据包,SendData_Onenet 则执行发送操作。

5.1.6 定时任务和中断

  • DHT11 数据更新:每 30 次主循环更新一次 DHT11 传感器的数据。
  • 逻辑处理:定期检查传感器数据是否超过设定的阈值,以决定是否触发风扇和蜂鸣器。
  • 蜂鸣器和风扇控制:在传感器数据异常时,启动蜂鸣器和风扇,并在一定时间后关闭。

5.2 stm32源码函数实现细节

5.2.1 HAL_GPIO_EXTI_Callback

这是一个外部中断回调函数,响应按钮按下事件。按下不同的按钮 (GPIO_PIN_12, GPIO_PIN_13, GPIO_PIN_15) 会执行不同的操作,如调整阈值或切换 UI。

5.2.2 Buzzer_ControlMotor_Control

这两个函数分别控制蜂鸣器和风扇的状态。通过 PWM 输出控制风扇的速度,并通过数字输出控制蜂鸣器的开关。

5.2.3 Logic_Process

此函数检查传感器的值是否超过设定的阈值。如果超过,触发蜂鸣器和风扇;否则,定时关闭蜂鸣器和风扇。

5.2.4 OLED_ShowData

根据 UI 变量的值,在 OLED 屏幕上显示不同的信息。UI 变量控制显示内容,比如传感器数据或阈值设置。

5.2.5 Send_Data

定期将所有传感器数据及设备状态发送到 OneNET 平台。每次发送后,延时 100 毫秒。

5.2.6 SystemClock_Config

配置系统时钟,为 MCU 提供时钟源,确保 ADC 和其他外设的正常工作。

5.3 stm32源码核心主程序:

cpp 复制代码
#include "main.h"
#include "adc.h"
#include "dma.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "oled.h"
#include "get_adc.h"
#include "dht11.h"
#include "voc_ch2o_co2.h"
#include "voc_ch2o_co2_2.h"
#include "Onenet.h"
#include "dht11_2.h"
#include "Onenet.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */
char oled_buf[20];			//OLED显示缓冲区

uint8_t UI=0;				//UI界面

uint16_t DHT11_Timer=0;		//温湿度读取周期

uint16_t buzzer_time=0;

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/** 按键中断 **/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	HAL_Delay(20);
    switch(GPIO_Pin)
    {
        case GPIO_PIN_12:		//阈值加
        {
            HAL_Delay(10);
            if(UI == 1)
			{
				app_data.temp_F++;
			}
			else if(UI == 2)
			{
				app_data.humi_F++;
			}
			else if(UI == 3)
			{
				app_data.light_F++;
			}
			else if(UI == 4)
			{
				app_data.fumes_F++;
			}
			else if(UI == 5)
			{
				app_data.CO2_F++;
			}
            break;
        }
		case GPIO_PIN_13:		//阈值减
        {
            HAL_Delay(10);
            if(UI == 1)
			{
				app_data.temp_F--;
			}
			else if(UI == 2)
			{
				app_data.humi_F--;
			}
			else if(UI == 3)
			{
				app_data.light_F--;
			}
			else if(UI == 4)
			{
				app_data.fumes_F--;
			}
			else if(UI == 5)
			{
				app_data.CO2_F--;
			}
            break;
        }
		case GPIO_PIN_14:
        {
            HAL_Delay(10);
            
            break;
        }
		case GPIO_PIN_15:		//界面切换
        {
            HAL_Delay(10);
            UI++;
			if(UI>5)UI=0;
			OLED_Clear();
            break;
        }
    }
	HAL_Delay(20);
	__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
}

/** 蜂鸣器控制 **/
void Buzzer_Control(unsigned char val)
{
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,val);
	app_data.buzzer = val;		//更新蜂鸣器状态
}

/** 电机控制 **/
void Motor_Control(unsigned char val)
{
	if(val == 1)
	{
		HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);		//开启定时器PWM
		__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, 75);//设置PWM占空比为75
		app_data.fan = val;	//更新风扇状态
	}
	else if(val == 0)
	{
		HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);		//开启定时器PWM
		__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, 0);//设置PWM占空比为0
		app_data.fan = val;	//更新风扇状态
	}
}

/** 逻辑处理 **/
void Logic_Process(void)
{
	if(adc_data.Light1 > app_data.light_F || adc_data.Light2 > app_data.light_F)		//光照1-2
	{
		Buzzer_Control(1);	//打开蜂鸣器
		Motor_Control(1);	//打开风扇
	}
	else if(adc_data.fumes1 > app_data.fumes_F || adc_data.fumes2 > app_data.fumes_F)		//烟雾1-2
	{
		Buzzer_Control(1);	//打开蜂鸣器
		Motor_Control(1);   //打开风扇
	}
	else if(DH11_data_1.temp > app_data.temp_F || DH11_data_1.humidity > app_data.humi_F)		//温湿度1
	{
		Buzzer_Control(1);	//打开蜂鸣器
		Motor_Control(1);   //打开风扇
	}
	else if(DH11_data_2.temp > app_data.temp_F || DH11_data_2.humidity > app_data.humi_F)		//温湿度2
	{
		Buzzer_Control(1);	//打开蜂鸣器
		Motor_Control(1);   //打开风扇
	}
	else if(voc_ch2o_co2_data.co2 > app_data.CO2_F || voc_ch2o_co2_data_2.co2 > app_data.CO2_F)		//二氧化碳1-2
	{
		Buzzer_Control(1);	//打开蜂鸣器
		Motor_Control(1);   //打开风扇
	}
	else
	{
		if(++buzzer_time > 50)
		{
			buzzer_time=0;
			Buzzer_Control(0);	//关闭蜂鸣器
			Motor_Control(0);   //关闭风扇
		}
		
	}
}

/** OLED显示 **/
void OLED_ShowData(void)
{
	if(UI == 0)		//界面0,显示各个传感器参数
	  {
		memset(oled_buf, 0, sizeof(oled_buf));
		sprintf(oled_buf,"L1:%d  L2:%d ",adc_data.Light1,adc_data.Light2);			//光照
		OLED_ShowString(0,0,(uint8_t *)oled_buf,16);
		  
		memset(oled_buf, 0, sizeof(oled_buf));
		sprintf(oled_buf,"F1:%d  F2:%d ",adc_data.fumes1,adc_data.fumes2);			//烟雾
		OLED_ShowString(0,2,(uint8_t *)oled_buf,16);
	  
		memset(oled_buf, 0, sizeof(oled_buf));
		sprintf(oled_buf,"1:%d-%d 2:%d-%d ",DH11_data_1.temp,DH11_data_1.humidity,DH11_data_2.temp,DH11_data_2.humidity);			//温湿度
		OLED_ShowString(0,4,(uint8_t *)oled_buf,16);
	  
		memset(oled_buf, 0, sizeof(oled_buf));
		sprintf(oled_buf,"CO2:%d  CO2:%d ",voc_ch2o_co2_data.co2,voc_ch2o_co2_data_2.co2);		//二氧化碳	
		OLED_ShowString(0,6,(uint8_t *)oled_buf,16);
	  }
	  else if(UI == 1)		//界面1,显示温度阈值
	  {
		memset(oled_buf, 0, sizeof(oled_buf));
		sprintf(oled_buf,"  Set Temp_F     ");			//设置温度阈值
		OLED_ShowString(0,0,(uint8_t *)oled_buf,16);
		  
		memset(oled_buf, 0, sizeof(oled_buf));
		sprintf(oled_buf,"  Temp_F:%d     ",app_data.temp_F);	//显示阈值
		OLED_ShowString(0,2,(uint8_t *)oled_buf,16);
		  
		memset(oled_buf, 0, sizeof(oled_buf));
		sprintf(oled_buf,"                ");		
		OLED_ShowString(0,4,(uint8_t *)oled_buf,16);
		OLED_ShowString(0,6,(uint8_t *)oled_buf,16);
	  }
	  else if(UI == 2)		//界面2,显示湿度阈值
	  {
		memset(oled_buf, 0, sizeof(oled_buf));
		sprintf(oled_buf,"  Set Humi_F     ");			//设置湿度阈值
		OLED_ShowString(0,0,(uint8_t *)oled_buf,16);
		  
		memset(oled_buf, 0, sizeof(oled_buf));
		sprintf(oled_buf,"  Humi_F:%d     ",app_data.humi_F);			//显示阈值
		OLED_ShowString(0,2,(uint8_t *)oled_buf,16);
	  }
	  else if(UI == 3)		//界面3,显示光照阈值
	  {
		memset(oled_buf, 0, sizeof(oled_buf));
		sprintf(oled_buf,"  Set Light_F     ");			//设置光照阈值
		OLED_ShowString(0,0,(uint8_t *)oled_buf,16);
		  
		memset(oled_buf, 0, sizeof(oled_buf));
		sprintf(oled_buf,"  Light_F:%d     ",app_data.light_F);			//显示阈值
		OLED_ShowString(0,2,(uint8_t *)oled_buf,16);
	  }
	  else if(UI == 4)		//界面4,显示烟雾阈值
	  {
		memset(oled_buf, 0, sizeof(oled_buf));
		sprintf(oled_buf,"  Set fumes_F     ");			//设置烟雾阈值
		OLED_ShowString(0,0,(uint8_t *)oled_buf,16);
		  
		memset(oled_buf, 0, sizeof(oled_buf));
		sprintf(oled_buf,"  fumes_F:%d     ",app_data.fumes_F);			//显示阈值
		OLED_ShowString(0,2,(uint8_t *)oled_buf,16);
	  }
	  else if(UI == 5)		//界面5,显示二氧化碳阈值
	  {
		memset(oled_buf, 0, sizeof(oled_buf));
		sprintf(oled_buf,"  Set CO2_F     ");			//设置CO2阈值
		OLED_ShowString(0,0,(uint8_t *)oled_buf,16);
		  
		memset(oled_buf, 0, sizeof(oled_buf));
		sprintf(oled_buf,"  CO2_F:%d     ",app_data.CO2_F);			//显示阈值
		OLED_ShowString(0,2,(uint8_t *)oled_buf,16);
	  }
}

/** 发送数据到ONENET云平台 **/
void Send_Data(void)
{
	static uint16_t sen_time=0;
	sen_time++;
	if(sen_time > 10)
	{
		Get_Send_Pack("light1",adc_data.Light1,1);			//光照1
		
		Get_Send_Pack("light2",adc_data.Light2,1);			//光照2
		
		Get_Send_Pack("light_F",app_data.light_F,0);		//光照阈值
		
		SendData_Onenet();		//发送数据
		
		HAL_Delay(100);
		
		Get_Send_Pack("fumes1",adc_data.fumes1,1);			//烟雾1
		
		Get_Send_Pack("fumes2",adc_data.fumes2,1);			//烟雾2
		
		Get_Send_Pack("fumes_F",app_data.fumes_F,0);		//烟雾阈值
		
		SendData_Onenet();		//发送数据
		
		HAL_Delay(100);
		
		Get_Send_Pack("temp1",DH11_data_1.temp,1);			//温度1
		
		Get_Send_Pack("temp2",DH11_data_2.temp,1);			//温度2
		
		Get_Send_Pack("temp_F",app_data.temp_F,0);			//温度阈值
		
		SendData_Onenet();		//发送数据
		
		HAL_Delay(100);
		
		Get_Send_Pack("humi1",DH11_data_1.humidity,1);		//湿度1
		
		Get_Send_Pack("humi2",DH11_data_2.humidity,1);		//湿度2
		
		Get_Send_Pack("humi_F",app_data.humi_F,0);			//湿度阈值
		
		SendData_Onenet();		//发送数据
		
		HAL_Delay(100);
		
		Get_Send_Pack("CO2_1",voc_ch2o_co2_data.co2,1);		//二氧化碳1
		
		Get_Send_Pack("CO2_2",voc_ch2o_co2_data_2.co2,1);	//二氧化碳2
		
		Get_Send_Pack("CO2_F",app_data.CO2_F,0);			//二氧化碳阈值
		
		SendData_Onenet();		//发送数据
		
		HAL_Delay(100);
		
		Get_Send_Pack("buzzer",DH11_data_1.humidity,1);		//蜂鸣器
		
		Get_Send_Pack("fan",app_data.fan,0);				//风扇
		
		SendData_Onenet();		//发送数据
		
		HAL_Delay(100);
		
		sen_time=0;
	}
}

/* USER CODE END 0 */

/**
  * @brief  应用程序入口。
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU配置--------------------------------------------------------*/

  /* 复位所有外设,初始化Flash接口和Systick。 */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* 配置系统时钟 */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* 初始化所有配置的外设 */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_ADC1_Init();
  MX_TIM1_Init();
  MX_USART1_UART_Init();
  MX_USART2_UART_Init();
  MX_USART3_UART_Init();
  MX_TIM2_Init();
  /* USER CODE BEGIN 2 */
	
	HAL_Delay(100);		//等待稳定

	OLED_Init();		//初始化OLED
	OLED_Clear();		//OLED清屏
	
	VOC_CH2O_CO2_Init_1();		//初始化CO2模块1
	VOC_CH2O_CO2_Init_2();		//初始化CO2模块2
	
	Onenet_Init();				//连接ONENET云平台
	
//	app_data.light_F = 90;	//光照阈值
//	app_data.fumes_F = 80;	//烟雾阈值
//	app_data.temp_F = 60;	//温度阈值
//	app_data.humi_F = 80;	//湿度阈值
//	app_data.CO2_F = 70;	//二氧化碳阈值
	
  /* USER CODE END 2 */

  /* 无限循环 */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  /** ADC采集(光照,烟雾) **/
	  Get_Adc_Data(4);
	  
	  /** 温湿度采集 **/
	  DHT11_Timer++;
	  if(DHT11_Timer > 30)	
	  {
		  DHT11_Timer=0;
		  DH11_Task_1();	//采集第一个DHT11模块
		  DH11_Task_2();	//采集第二个DHT11模块
	  }
	  
	  /** 逻辑处理 **/
	  Logic_Process();
	  
	  /** OLED显示 **/
	  OLED_ShowData();
	  
	  /** 发送数据到ONENET云平台 **/
	  Send_Data();
	  
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

/**
  * @brief 系统时钟配置
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
  /** 
    * @brief  配置主振荡器、PLL和系统时钟。
    * @retval None
    */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV1;
  RCC_OscInitStruct.PLL.PLLN = 336;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 7;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** 
    * @brief  初始化CPU、AHB和APB总线时钟。
    * @retval None
    */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
                                | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
  {
    Error_Handler();
  }
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1 | RCC_PERIPHCLK_USART2
                                      | RCC_PERIPHCLK_USART3 | RCC_PERIPHCLK_ADC;
  PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
  PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;
  PeriphClkInit.Usart3ClockSelection = RCC_USART3CLKSOURCE_PCLK1;
  PeriphClkInit.AdcClockSelection = RCC_ADCPLLCLK_DIV2;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    Error_Handler();
  }
}

/**
  * @brief  错误处理函数。
  * @retval None
  */
void Error_Handler(void)
{
  /* 用户可以在此处添加自己的错误处理代码 */
  __disable_irq();
  while (1)
  {
  }
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  报告发生断言错误的文件名和行号。
  * @param  file: 指向发生错误的源文件名的指针
  * @param  line: 发生错误的行号
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* 用户可以在此处添加自己的断言处理代码 */
  printf("Wrong parameters value: file %s on line %d\r\n", file, line);
}
#endif /* USE_FULL_ASSERT */

5.4 QT源码分析

5.4.1. 代码结构

代码主要分为以下几个部分:

  • 宏定义:定义了与 OneNet 平台交互的 URL、请求头、数据标识符等。
  • 变量定义:定义了用于存储从 OneNet 平台获取的数据的变量。
  • 构造函数和析构函数:初始化 UI 和定时器,管理 HTTP 请求。
  • 槽函数:处理按钮点击事件、定时器事件、HTTP 请求完成事件等。
  • 数据处理函数:解析从 OneNet 平台接收的 JSON 数据,并更新 UI。
  • HTTP 请求函数:发送 GET 和 POST 请求到 OneNet 平台。

5.4.2. 宏定义

GET 请求相关
  • URL_GET:获取设备属性的 URL。
  • ACCEPT:HTTP 请求头中的 Accept 字段。
  • AUTHOR_GET:用于身份验证的 authorization 字段。
POST 请求相关
  • URL_POST:推送数据到设备的 URL。
  • CONTENT_POST:HTTP 请求头中的 Content-Type 字段。
  • AUTHOR_POST:用于身份验证的 Authorization 字段。
数据标识符
  • 定义了设备属性的标识符,例如 TEMP1_FLAGHUMI1_FLAG 等,用于解析 JSON 数据。

5.4.3. 变量定义

  • 定义了多个 uint8_t 类型的变量,用于存储从 OneNet 平台获取的设备数据,例如温度、湿度、光照、CO2 浓度等。
  • 还定义了控制设备的变量,例如 Buzzer(蜂鸣器)和 Fan(风扇)。

5.4.4. 构造函数和析构函数

  • 构造函数
    • 初始化 UI。
    • 启动一个定时器,每隔 1.5 秒触发一次 time() 槽函数。
    • 实例化 QNetworkAccessManager,用于发送 HTTP 请求。
  • 析构函数
    • 释放 UI 资源。

5.4.5. 槽函数

按钮点击事件
  • on_P_CO2_clicked()on_P_Fumes_clicked() 等函数:

    • 从 UI 中获取用户输入的数据。
    • 调用 Post_Onenet_Data() 函数,将数据推送到 OneNet 平台。
  • on_P_FAN_clicked()on_P_Buzzer_clicked()

    • 控制风扇和蜂鸣器的开关状态。
    • 根据当前状态发送相应的数据到 OneNet 平台。
定时器事件
  • time()
    • 每 1.5 秒更新一次系统时间。
    • 调用 Get_Onenet_Data() 函数,从 OneNet 平台获取设备数据。
HTTP 请求完成事件
  • On_finished()
    • 接收从 OneNet 平台返回的数据。
    • 调用 Get_Data_Deal() 函数解析数据。
    • 调用 Data_Show() 函数更新 UI。

5.4.6. 数据处理函数

Get_Data_Deal()
  • 解析从 OneNet 平台接收的 JSON 数据。
  • 使用 strstr() 函数查找特定的数据标识符(如 TEMP1_FLAGHUMI1_FLAG 等)。
  • 使用 atoi() 函数将字符串转换为整数,并存储到对应的变量中。
Data_Show()
  • 将解析后的数据显示在 UI 上。

5.4.7. HTTP 请求函数

Get_Onenet_Data()
  • 发送 GET 请求到 OneNet 平台,获取设备数据。
  • 设置请求头,包括 Acceptauthorization
  • 使用 QNetworkAccessManager 发送请求,并通过信号槽机制处理返回的数据。
Post_Onenet_Data()
  • 发送 POST 请求到 OneNet 平台,推送数据到设备。
  • 设置请求头,包括 AcceptContent-TypeAuthorization
  • 构造 JSON 数据包,并发送到 OneNet 平台。

5.4.8. 代码亮点

  • 模块化设计:将 HTTP 请求、数据处理、UI 更新等功能分离,代码结构清晰。
  • 信号槽机制:利用 Qt 的信号槽机制处理异步 HTTP 请求,提高了代码的可维护性。
  • JSON 数据处理:通过字符串操作解析 JSON 数据,适用于简单的 JSON 格式。

5.4.9. 改进建议

  1. JSON 解析库

    • 目前使用 strstr()atoi() 解析 JSON 数据,代码较为繁琐且容易出错。
    • 建议使用 Qt 提供的 QJsonDocumentQJsonObject 类解析 JSON 数据。
  2. 错误处理

    • 当前代码缺少对 HTTP 请求失败的处理逻辑。
    • 可以添加对 QNetworkReply::error() 信号的处理,以应对网络错误。
  3. 代码复用

    • Get_Data_Deal() 函数中的代码重复较多,可以通过循环或函数封装减少重复代码。
  4. 安全性

    • AUTHOR_GETAUTHOR_POST 中的签名信息是硬编码的,存在安全风险。
    • 建议将签名信息存储在配置文件中,或动态生成。

代码实现了一个简单的物联网设备管理工具,能够从 OneNet 平台获取设备数据并控制设备。代码结构清晰,功能完整,但在 JSON 解析、错误处理和代码复用方面还有改进空间。通过优化这些部分,可以进一步提高代码的健壮性和可维护性。

5.5 QT源码详解:

5.5.1 头文件和宏定义

cpp 复制代码
#include "widget.h"
#include "ui_widget.h"

/****************************
 * 获取Onenet数据格式(Get)
 ****************************/
#define URL_GET      "http://iot-api.heclouds.com/thingmodel/query-device-property?product_id=125HxYB8Pk&device_name=Device1"
#define ACCEPT       "application/json, text/plain, */*"
#define AUTHOR_GET   "version=2018-10-31&res=products%2F125HxYB8Pk%2Fdevices%2FDevice1&et=1764677682&method=sha1&sign=2IfwOZ43J098uQ%2Fe%2FonhTNU61aI%3D"

/****************************
 * 推送数据格式(Post)
 ****************************/
#define URL_POST     "http://iot-api.heclouds.com/datapoint/synccmds?product_id=125HxYB8Pk&device_name=Device1&timeout=10"
#define CONTENT_POST "application/json"
#define AUTHOR_POST  "version=2018-10-31&res=products%2F125HxYB8Pk&et=1764677682&method=sha1&sign=7EJ0F%2FRAjmVa%2BZF9B4kLiycz%2FVI%3D"

/* 数据JSON处理 */
#define VALUE        "value\":\""

/***************************
 * 获取Oneent设备数据标识符
 ***************************/
#define TEMP1_FLAG    "temp1"      // 温度1标识符
#define TEMP2_FLAG    "temp2"      // 温度2标识符
#define TEMP_F_FLAG   "temp_F"     // 温度F标识符
#define HUMI1_FLAG    "humi1"      // 湿度1标识符
#define HUMI2_FLAG    "humi2"      // 湿度2标识符
#define HUMI_F_FLAG   "humi_F"     // 湿度F标识符
#define FUMES1_FLAG    "fumes1"    // 烟雾1标识符
#define FUMES2_FLAG    "fumes2"    // 烟雾2标识符
#define FUMES_F_FLAG   "fumes_F"   // 烟雾F标识符
#define CO2_1_FLAG    "CO2_1"      // CO2浓度1标识符
#define CO2_2_FLAG    "CO2_2"      // CO2浓度2标识符
#define CO2_F_FLAG    "CO2_F"      // CO2浓度F标识符
#define LIGHT1_FLAG   "light1"     // 光照1标识符
#define LIGHT2_FLAG   "light2"     // 光照2标识符
#define LIGHT_F_FLAG   "light_F"   // 光照F标识符

#define BUZZER_FLAG      "buzzer"  // 蜂鸣器标识符
#define FAN_FLAG       "fan"       // 风扇标识符

5.5.2. 接收数据变量

cpp 复制代码
/***************************
 * 接收数据变量
 ***************************/
uint8_t Temp_1 = 0;  // 温度1
uint8_t Temp_2 = 0;  // 温度2
uint8_t Temp_F = 0;  // 温度F

uint8_t Humi_1 = 0;  // 湿度1
uint8_t Humi_2 = 0;  // 湿度2
uint8_t Humi_F = 0;  // 湿度F

uint8_t Fumes_1 = 0; // 烟雾1
uint8_t Fumes_2 = 0; // 烟雾2
uint8_t Fumes_F = 0; // 烟雾F

uint8_t Light_1 = 0; // 光照1
uint8_t Light_2 = 0; // 光照2
uint8_t Light_F = 0; // 光照F

uint8_t CO2_1 = 0;   // CO2浓度1
uint8_t CO2_2 = 0;   // CO2浓度2
uint8_t CO2_F = 0;   // CO2浓度F

uint8_t Buzzer = 0;  // 蜂鸣器状态
uint8_t Fan = 0;     // 风扇状态

5.5.3构造函数和析构函数

cpp 复制代码
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    /* 获取系统时间 */
    timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(time()));
    timer->start(1500); /* 1.5秒刷新一次 */

    /* HTTP请求实例化 */
    manager = new QNetworkAccessManager(this);

    /* 显示温度符号 */
    ui->L_Temp_Fuhao->setText("\u00B0C");  // 温度符号(摄氏度)
    ui->L_Temp_F_Fuhao->setText("\u00B0C");
    ui->L_Temp_Fuhao_5->setText("\u00B0C");
}

Widget::~Widget()
{
    delete ui;  // 释放UI资源
}

5.5.4 按钮点击事件

cpp 复制代码
void Widget::on_P_CO2_clicked()
{
    int Data = ui->LineEdit_Data->text().toInt();  // 获取用户输入的数据
    Post_Onenet_Data("CO2_F", Data);              // 推送数据到OneNet平台
}

void Widget::on_P_Fumes_clicked()
{
    int Data = ui->LineEdit_Data->text().toInt();
    Post_Onenet_Data("fumes_F", Data);
}

void Widget::on_P_Light_clicked()
{
    int Data = ui->LineEdit_Data->text().toInt();
    Post_Onenet_Data("light_F", Data);
}

void Widget::on_P_Temp_clicked()
{
    int Data = ui->LineEdit_Data->text().toInt();
    Post_Onenet_Data("temp_F", Data);
}

void Widget::on_P_Humi_clicked()
{
    int Data = ui->LineEdit_Data->text().toInt();
    Post_Onenet_Data("humi_F", Data);
}

void Widget::on_P_FAN_clicked()
{
    if(ui->P_FAN->text() == "打开风扇")
    {
        Post_Onenet_Data("fan", 1);  // 打开风扇
        ui->P_FAN->setText("关闭风扇");
    }
    else if(ui->P_FAN->text() == "关闭风扇")
    {
        Post_Onenet_Data("fan", 0);  // 关闭风扇
        ui->P_FAN->setText("打开风扇");
    }
}

void Widget::on_P_Buzzer_clicked()
{
    if(ui->P_Buzzer->text() == "打开蜂鸣器")
    {
        Post_Onenet_Data("buzzer", 1);  // 打开蜂鸣器
        ui->P_Buzzer->setText("关闭蜂鸣器");
    }
    else if(ui->P_Buzzer->text() == "关闭蜂鸣器")
    {
        Post_Onenet_Data("buzzer", 0);  // 关闭蜂鸣器
        ui->P_Buzzer->setText("打开蜂鸣器");
    }
}

5.5.5 定时器事件

cpp 复制代码
void Widget::time()
{
    /* 系统时间定时1.5秒更新 */
    QTime time = QTime::currentTime();
    QString txtTime = time.toString("hh:mm:ss");

    /* 1.5秒发送获取OneNet云平台数据的指令 */
    Get_Onenet_Data();
}

5.5.6 数据处理和显示

cpp 复制代码
/*
 * 将接收到的数据进行显示
 */
void Widget::Data_Show()
{
    /* 显示温度 */
    ui->L_Temp_1->setNum(Temp_1);
    ui->L_Temp_2->setNum(Temp_2);
    ui->L_Temp_F->setNum(Temp_F);

    /* 显示湿度 */
    ui->L_Humi_1->setNum(Humi_1);
    ui->L_Humi_2->setNum(Humi_2);
    ui->L_Humi_F->setNum(Humi_F);

    /* 显示烟雾 */
    ui->L_Fumes_1->setNum(Fumes_1);
    ui->L_Fumes_2->setNum(Fumes_2);
    ui->L_Fumes_F->setNum(Fumes_F);

    /* 显示光照 */
    ui->L_Light_1->setNum(Light_1);
    ui->L_Light_2->setNum(Light_2);
    ui->L_Light_F->setNum(Light_F);

    /* 显示CO2浓度 */
    ui->L_CO2_1->setNum(CO2_1);
    ui->L_CO2_2->setNum(CO2_2);
    ui->L_CO2_F->setNum(CO2_F);

    /* 显示风扇状态 */
    if(Fan)
        ui->L_FAN->setText("打开");
    else
        ui->L_FAN->setText("关闭");

    /* 显示蜂鸣器状态 */
    if(Buzzer)
        ui->L_Buzzer->setText("打开");
    else
        ui->L_Buzzer->setText("关闭");
}

5.5.7 HTTP请求函数

cpp 复制代码
/*
 * 获取OneNet云平台数据
 */
void Widget::Get_Onenet_Data()
{
    /* Onenet平台需要url格式请求 */
    QString url = QString(URL_GET);
    QNetworkRequest request(url);

    /* 设置请求头 */
    request.setRawHeader("Accept", ACCEPT);
    request.setRawHeader("authorization", AUTHOR_GET);

    /* 发送GET请求 */
    QNetworkReply *reply = manager->get(request);

    /* 利用信号判断是否完成接收OneNet云平台数据 */
    connect(reply, &QNetworkReply::finished, this, &Widget::On_finished);
}

/*
 * 推送数据到MCU
 */
void Widget::Post_Onenet_Data(QString Flag, unsigned char Data)
{
    /* Onenet平台需要url格式请求 */
    QString url = QString(URL_POST);
    QNetworkRequest request(url);

    /* 设置请求头 */
    request.setRawHeader("Accept", ACCEPT);
    request.setRawHeader("Content-Type", CONTENT_POST);
    request.setRawHeader("Authorization", AUTHOR_POST);

    /* 格式转换,直接推送到MCU */
    request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json;charset=UTF-8"));

    /* 构造JSON数据 */
    QJsonObject json;
    json.insert(Flag, Data);

    QJsonDocument document;
    document.setObject(json);
    QByteArray dataArray = document.toJson(QJsonDocument::Compact);

    /* 推送url头和JSON数据包 */
    manager->post(request, dataArray);
}

实现了一个基于 Qt 的物联网设备管理工具,能够从 OneNet 平台 获取设备数据并控制设备。代码结构清晰,功能完整,涵盖了 HTTP 请求、JSON 数据处理、UI 更新等功能。通过详细的注释,您可以更好地理解每一部分的实现逻辑。

5.6 QT 实现的打包app

六、 尾言

该系统通过结合 STM32 微控制器Qt 图形用户界面 ,实现了对粮仓环境的实时监测、数据处理、可视化展示、报警管理、远程监控以及历史数据分析等功能。环境数据采集 是系统的核心基础,通过多种传感器(如温度传感器、湿度传感器、气体传感器等)对粮仓内部的环境进行实时监测,采集相关数据。这些传感器通过模拟信号或数字信号(如 I2C、SPI)将数据传输到 STM32 微控制器,确保数据的实时性和准确性。数据处理 是系统的关键环节,STM32 微控制器负责对采集到的数据进行处理与分析,包括滤波、校准等操作,并根据设定的阈值判断环境是否处于安全状态。如果数据超出预设的安全阈值(如温度、湿度、气体浓度的上限和下限),STM32 会触发报警信号,并通过通信模块(如 Wi-Fi、4G)将数据上传到服务器或 Qt 界面。

数据展示 是系统的重要功能之一,通过 Qt 界面将处理后的环境数据可视化,用户可以实时查看粮仓的温湿度变化、气体浓度等信息。Qt 界面提供友好的图形用户界面,支持数据可视化(如曲线图、柱状图),帮助用户直观了解环境变化趋势。同时,用户可通过界面设置阈值、查看历史数据、手动控制设备(如风扇、蜂鸣器),实现高效的用户交互。报警系统 是系统的安全保障,当监测到的环境数据超过安全阈值时,系统会触发报警机制,及时通知管理人员采取措施,确保粮仓安全。报警方式包括本地报警(如蜂鸣器鸣响、LED 灯闪烁)和远程报警(如短信、邮件或 Qt 界面弹窗通知),同时记录每次报警的时间、类型和具体数据,便于后续分析和处理。

远程监控 是系统的扩展功能,通过 Wi-Fi、4G 或以太网将环境数据上传到云端或远程服务器,支持 MQTT、HTTP 等通信协议,确保数据传输的实时性和可靠性。管理人员可通过网络访问 Qt 界面或移动端应用,实时查看粮仓环境数据,并进行远程控制。数据记录与分析 是系统的增值功能,系统定期将环境数据存储到本地或云端数据库,形成历史记录,并提供数据分析工具,帮助用户了解环境变化趋势(如温度波动、湿度变化)。通过生成报表或图表,辅助管理人员做出科学决策。

用户交互 是系统的核心体验,Qt 作为图形用户界面框架,提供友好的操作界面,便于用户进行设置、查看和管理。通过结合 STM32 的强大处理能力和 Qt 的界面交互功能,该系统能够有效提高粮仓管理的智能化水平,确保粮食安全和质量。系统优势 在于其智能化管理、高效性、用户友好性和可扩展性。通过实时监测和报警功能,显著提高粮仓管理的智能化水平;STM32 微控制器的高性能处理能力,确保系统能够快速响应环境变化;Qt 界面提供直观的操作体验,降低用户使用门槛;系统支持多种传感器和通信模块,可根据需求灵活扩展功能。

应用场景 不仅限于粮仓管理,还可扩展应用于温室大棚、养殖场等农业场景,以及需要环境监测的工业场景,如仓库、车间等。未来改进方向 包括引入 AI 算法,预测环境变化趋势,提前预警;实现多粮仓或多区域的集中监控与管理;开发移动端应用,方便用户随时随地查看数据。通过不断优化和扩展,该系统将进一步提升其实用性和智能化程度,为粮仓管理和其他相关领域提供更加全面和高效的解决方案。

资源获取方式:毕设&课设&项目&实训-Altium-粮仓环境监测-2025-01-03.zip资源-CSDN文库

资源详情:

APP安装包:

KEIL:

QT:

原理图:

相关推荐
智商偏低1 小时前
单片机之helloworld
单片机·嵌入式硬件
青牛科技-Allen3 小时前
GC3910S:一款高性能双通道直流电机驱动芯片
stm32·单片机·嵌入式硬件·机器人·医疗器械·水泵、
白鱼不小白5 小时前
stm32 USART串口协议与外设(程序)——江协教程踩坑经验分享
stm32·单片机·嵌入式硬件
S,D5 小时前
MCU引脚的漏电流、灌电流、拉电流区别是什么
驱动开发·stm32·单片机·嵌入式硬件·mcu·物联网·硬件工程
芯岭技术8 小时前
PY32F002A单片机 低成本控制器解决方案,提供多种封装
单片机·嵌入式硬件
youmdt9 小时前
Arduino IDE ESP8266连接0.96寸SSD1306 IIC单色屏显示北京时间
单片机·嵌入式硬件
嘿·嘘9 小时前
第七章 STM32内部FLASH读写
stm32·单片机·嵌入式硬件
Meraki.Zhang9 小时前
【STM32实践篇】:I2C驱动编写
stm32·单片机·iic·驱动·i2c
源码站~11 小时前
基于Flask+Vue的豆瓣音乐分析与推荐系统
vue.js·python·flask·毕业设计·毕设·校园·豆瓣音乐
Mr_Xuhhh11 小时前
网络基础(1)
c语言·开发语言·网络·c++·qt·算法