• 正文
  • 相关推荐
申请入驻 产业图谱

基于STM32设计的大棚自动通风系统

02/17 11:00
2918
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

一、前言

1.1 项目开发背景

随着现代农业的快速发展,温室大棚已成为提高作物产量和质量的重要设施。然而,大棚环境的控制和管理仍面临诸多挑战,尤其是温湿度的调节。大棚内的温湿度直接影响作物的生长和产量,而传统的人工管理方式存在不小的局限性,如劳动强度大、反应速度慢和操作不精确等。因此,采用自动化控制系统对大棚环境进行监测和调节,成为提高生产效率和降低人工成本的关键。

近年来,物联网技术嵌入式系统的迅速发展为智能农业提供了新的解决方案。通过集成传感器执行器无线通信模块硬件设备,结合先进的控制算法,可以实时监控大棚内的环境变化,并自动进行调节。这不仅能够确保大棚内的温湿度始终维持在作物生长的最佳范围,还能实现远程监控与管理,使农业生产更加智能化、精准化。

为了应对这一需求,本项目基于STM32开发了一套大棚自动通风系统,旨在通过温湿度监测、自动风扇控制、报警功能等一系列自动化操作,优化大棚内的环境条件。该系统能够实时采集温湿度数据,并根据预设的阈值自动开启或关闭风扇,确保大棚内的温湿度始终处于适宜范围。此外,通过手动控制、数据可视化、历史数据记录等功能,用户可以灵活地调整和查看大棚环境数据,从而实现更高效的管理。

在硬件方面,选用了STM32F103RCT6主控芯片,其具备较强的处理能力和丰富的外设接口,能够满足本项目对实时监控和控制的需求。温湿度传感器SHT30提供高精度的温湿度测量,Wi-Fi模块ESP8266则支持数据远程传输,便于实现大棚远程监控和控制。通过集成这些硬件,系统能够提供一个高效、稳定、智能的环境控制方案,进一步推动智能农业的发展。

1.2 设计实现的功能

(1)环境监测功能
系统通过温湿度传感器SHT30实时监测大棚内的温度和湿度,并提供实时的数据反馈。传感器能够精确地获取环境数据,为后续的控制和决策提供可靠的依据。

(2)自动开关风扇控制
根据监测到的温湿度数据,系统能够自动控制风扇的开启或关闭。当温度超过设定的上限值时,系统自动开启风扇进行通风,帮助降低温度;当温湿度恢复到设定的范围内时,系统自动关闭风扇,从而保证大棚内的环境始终处于适宜范围。

(3)手动控制功能
在自动控制模式下,用户可以通过按键或手机APP手动控制风扇的开关,便于应对特殊情况或紧急需求。该功能提供灵活性,确保用户能够随时对系统进行干预。

(4)数据可视化
系统通过OLED显示屏实时显示大棚内的温湿度数据,用户可以直观地查看当前环境状况。该功能简化了信息呈现,帮助用户快速获取重要数据,做出相应决策。

(5)报警功能
当温度或湿度超过设定的阈值时,系统会发出警报,提醒用户进行干预。警报通过蜂鸣器发出声音信号,确保用户能够及时发现问题并采取措施。

(6)历史数据记录
系统能够存储一定时间范围内的温湿度数据,并允许用户查看历史数据。通过记录历史数据,用户可以进行数据分析和趋势预测,帮助调整大棚管理策略。

(7)定时功能
系统支持定时开关风扇的功能,用户可以设置特定时间段内自动进行通风。这一功能能够减少人工干预,优化工作流程,提升系统的自动化水平。

(8)远程控制与监控功能
通过Wi-Fi模块ESP8266,系统可以将温湿度数据实时传输至可视化网页,用户可以通过浏览器远程查看大棚的环境数据并控制风扇的开关。这一功能使得用户能够随时随地监控和管理大棚的环境,提高系统的智能化水平。

(9)服务器后端与数据处理
本系统的后端服务器采用Python语言进行开发,负责接收从设备端上传的数据,并将其展示在可视化网页上。用户可以通过网页查看大棚的实时数据与历史记录。此外,服务器支持本地部署和云端部署两种方式,满足不同用户需求。

1.3 项目硬件模块组成

(1)主控芯片:STM32F103RCT6
STM32F103RCT6是一款基于ARM Cortex-M3架构的微控制器,具备强大的处理能力和丰富的外设接口,适用于本项目对实时控制和数据处理的需求。它负责处理传感器采集的数据、控制风扇开关、管理报警功能以及与Wi-Fi模块通信。

(2)温湿度传感器:SHT30
SHT30是一款高精度的温湿度传感器,能够实时监测大棚内的温度和湿度。其测量范围广、响应速度快、精度高,适合用于大棚环境的实时监测,提供准确的数据输入给主控芯片进行后续处理和控制。

(3)通风风扇:继电器控制
风扇通过继电器进行控制。继电器的作用是根据主控芯片发出的控制信号,开关风扇电源,从而实现风扇的启停。继电器的选择要考虑其负载能力,以确保稳定可靠地控制风扇。

(4)Wi-Fi模块:ESP8266
ESP8266是一个低功耗的Wi-Fi模块,支持与主控芯片进行无线通信,将温湿度数据上传到服务器,并支持远程控制风扇的开关。ESP8266能够实现大棚环境数据的无线传输和远程监控功能,使用户可以通过智能设备或网页实时查看数据并进行操作。

(5)显示屏:0.96寸OLED
0.96寸OLED显示屏用于显示大棚内的实时温湿度数据。OLED显示屏具有高对比度、低功耗、清晰可读等优点,适合用于小型嵌入式显示应用。用户可以通过此显示屏直观地查看环境数据。

(6)水汽检测:雨滴传感器
雨滴传感器用于检测大棚内的水汽状况,能够在出现水滴或潮湿情况时发出信号。该模块有助于检测是否有过多水分积聚,从而对大棚的湿度进行更精确的控制和预警。

(7)蜂鸣器:有源蜂鸣器
蜂鸣器用于系统的报警功能。当温湿度超出设定阈值时,蜂鸣器会发出警报声,提醒用户进行干预。此蜂鸣器采用高电平触发方式,能够在短时间内提供明显的声音提示。

(8)电源模块
电源模块为系统提供稳定的电力支持。系统中的各个硬件组件(如主控芯片、Wi-Fi模块、风扇等)都需要稳定的电源来保障其正常工作。电源模块会根据需要为不同模块提供相应的电压和电流

1.4 设计思路

本项目的设计思路是以温湿度控制为核心,结合现代物联网技术,通过集成多种传感器和执行器,打造一个自动化、大数据化、远程可控的大棚环境监测与控制系统。系统的设计遵循智能化、自动化、稳定性和用户友好的原则,目的是通过自动化手段降低人工干预,提高大棚环境的管理效率和作物生长条件的优化。

系统通过高精度的温湿度传感器SHT30实时监测大棚内的温度和湿度数据。温湿度是影响作物生长的关键因素,因此实时监测这些数据是系统的基础。通过STM32F103RCT6微控制器采集并处理传感器数据,控制风扇及报警系统,根据预设的阈值进行自动调节。当温湿度超出设定范围时,控制风扇自动启动或停止,维持大棚内的环境在最适宜的范围内。

为了提升系统的智能化水平,本设计加入了Wi-Fi模块ESP8266,将大棚内的温湿度数据通过无线网络上传至远程服务器。服务器将数据进行处理并展示在网页端,用户可以随时随地通过浏览器查看大棚内的环境状态。此外,系统还提供远程控制风扇开关的功能,用户可在不同地点通过智能设备实现对大棚的实时管理和调控,进一步提高了系统的灵活性与可控性。

在设计过程中,还特别考虑到用户的易用性和操作便捷性。系统提供了OLED显示屏,用于实时显示当前温湿度数据,用户无需额外工具就能快速查看大棚的环境状态。同时,系统还具有手动控制功能,用户可以通过按键或APP随时干预系统工作,解决特殊情况下的紧急需求。为了确保安全与及时干预,系统设定了温湿度报警功能,当环境参数异常时,蜂鸣器将发出警报,提醒用户采取行动。

为了确保数据的长期稳定性和参考价值,系统具有历史数据记录和分析功能。系统会定期保存温湿度数据,用户可以查看历史记录,分析环境变化趋势,进而做出更精确的管理决策。此外,定时功能的加入让风扇的控制更具灵活性,用户可以设置在特定时间段自动开启风扇,进一步减少了人工操作的频次。

整体设计将硬件和软件紧密结合,注重每个环节的性能与稳定性。通过高效的数据采集、智能的控制策略和简便的操作界面,系统能够为大棚管理提供强有力的支持,帮助用户轻松实现环境的自动调节与监控,优化大棚的生产效率和作物的生长环境。

1.5 系统功能总结

功能模块 功能描述
环境监测功能 通过温湿度传感器实时监测大棚内的温度和湿度,提供实时数据反馈。
自动开关风扇控制 根据温湿度数据自动控制风扇的开关,保持大棚内的温湿度在预设范围内。
手动控制功能 提供手动模式,用户可通过按键或APP控制风扇开关,适应特殊情况或紧急需求。
数据可视化 通过OLED显示屏显示实时的温湿度数据,方便用户查看大棚环境状况。
报警功能 当温湿度超过设定阈值时,通过蜂鸣器发出报警信号,提醒用户采取措施。
历史数据记录 存储一段时间内的温湿度数据,支持用户查看历史记录,进行数据分析和趋势预测。
定时功能 支持设置定时开关风扇的功能,用户可以设定特定时间段内自动开启风扇。
远程控制与监控功能 通过Wi-Fi模块,远程上传温湿度数据并在网页端展示,用户可以通过智能设备远程查看并控制风扇。
服务器数据处理 后端服务器使用Python接收数据并展示在可视化网页上,支持本地和云端部署,满足不同的访问需求。

1.6 参考文献

1. 应耿宁,陈启东,楼泽华等.基于STM32的大棚智能通风系统的设计与研究[J].机电工程技术,2019.
2. 潘金珠,王兴元,肖云龙等.基于物联网的温室大棚系统设计[J].传感器与微系统,2014.
3. 哈尔滨石油学院.基于ZigBee的智能农业温室大棚控制系统的设计[J].长江信息通信,2024.
4. 沈筱予,黄葆华,徐超等.基于STM32和物联网云平台的农业环境监控系统的设计[J].现代信息科技,2022.
5. 刘文生.基于物联网智慧温室大棚监测控制系统[J].电子元器件与信息技术,2021.
6. 陈卓.基于树莓派的大棚联网监控系统的研究与设计[D].西安工业大学,2018.
7. 齐齐哈尔大学计算机与控制工程学院.基于无线Mesh网络的智慧农业大棚监控系统[J].现代电子技术,2016.
8. 彭高丰.温室大棚环境智能自动测量与调节系统研究[J].计算机测量与控制,2012.
9. 陈荣荣,顾靖峰.智能农业温室环境远程监控系统在蔬菜基地的实践应用[J].农业装备技术,2014.
10. PDFC. Saha, Qianying Yi et al. “Opening Size Effects on Airflow Pattern and Airflow Rate of a Naturally Ventilated Dairy Building—A CFD Study.” Applied Sciences(2020).
11. 付克兰.基于物联网的温室大棚智能监测控制系统[J].科技资讯,2017.
12. 孔国利,苏玉.日照温室大棚自动卷帘机与智能通风控制系统设计[J].湖北农业科学,2015.
13. PDFU. Yeo, Sang-yeon Lee et al. “Rooftop Greenhouse: (1) Design and Validation of a BES Model for a Plastic-Covered Greenhouse Considering the Tomato Crop Model and Natural Ventilation Characteristics.” Agriculture(2022).
14. 朱宇娟.智能温室大棚全方位调温系统创新设计与应用[J].黑龙江粮食,2023.
15. 郭琳,张孝存,韩文霆等.基于多能互补的光伏木耳大棚智慧控制系统设计[J].西北农林科技大学学报(自然科学版),2019.
16. 上海理工大学光电信息与计算机工程学院2. 北京东方振动和噪声技术研究所.基于嵌入式的智能农场设计与实现.第十一届全国信号和智能信息处理与应用学术会议专刊,2017. 
17. PDFLei. Zhang, Xingan Liu et al. “A microenvironment prediction model for Chinese solar greenhouses based on the bond graph approach.” PLoS ONE(2022).
18. 朱李寒.北方温室大棚卷帘控制系统设计[J].农技服务,2017.
19. 张逢雪,王香婷,王通生等.基于STM32单片机的无线智能家居控制系统[J].自动化技术与应用,2011.
20. 宋德俊,王冰峰.模糊控制在温室喷灌自动控制中的应用[J].控制工程,2005.
21. 李凯,麻红昭.基于STM32的温室环境监控系统的设计与实现[J].工业控制计算机,2015.
22. 吴佳伟,朱桂兵,王成等.基于PLC的小型智慧大棚蔬果生长环境监控系统设计[J].福建农机,2022.
23. PDFA. Bekraoui, H. Fatnassi et al. “Study of Microclimate and Sapling Citrus Plant Transpiration in Tunnel Greenhouse Under Mediterranean Conditions.” Acta Technologica Agriculturae(2022).. Nitra, Slovaca Universitas Agriculturae Nitriae.
24. 张道辉,曲健禄,黄华等.果蔬保护地栽培棚温自动调控系统[J].农业机械,2004.
25. 韩永佳.基于Arduino的蔬菜大棚智能灌溉控制系统设计[J].山西水利科技,2016.
26. 刘永涛,刘佳,吴金顺.基于MSP430与单总线的温室监控终端的设计[J].中国农机化学报,2015.
27. 陈高锋,熊刚,龙建明等.基于STM32和ZigBee的小型温室环境控制系统设计[J].江苏农业科学,2017.
28. PDFG. Zhao, Haiyan Tu et al. “A Design of Magic Cube Robot Based on STM32.” IOP Conference Series: Materials Science and Engineering(2018).. Guoyou Zhao.
29. PDFU. El-Behairy. “Simple Substrate Culture in Arid Lands.” (2015).. IntechOpen.
30. 华中师范大学物理科学与技术学院.基于物联网的智能浇花系统[J].电子测量技术,2020.

1.7 模块的技术详情介绍

1. 主控芯片:STM32F103RCT6

STM32F103RCT6是意法半导体(STMicroelectronics)推出的基于ARM Cortex-M3架构的32位微控制器。它拥有高效的运算能力和丰富的外设接口,适合进行嵌入式系统开发。该芯片的主频可达72MHz,具备64KB的Flash存储和20KB的SRAM,适用于实时数据处理和控制任务。STM32F103RCT6支持多种通信协议(如SPII2C、USART等),能够与传感器、显示器、继电器、Wi-Fi模块等设备进行高效通信,是本系统中核心的数据处理和控制单元。

2. 温湿度传感器:SHT30

SHT30是由瑞士Sensirion公司生产的高精度数字温湿度传感器。它使用I2C通信协议,能够提供温度和湿度的实时数字输出,精度高,响应速度快。其测量范围为温度-40°C至+125°C,湿度0%RH至100%RH,适用于各种环境监测。SHT30的低功耗特点使其非常适合长时间工作的嵌入式系统,且其稳定性和可靠性在环境监测中表现优异。

3. 通风风扇:继电器控制

在本项目中,通风风扇通过继电器进行控制。继电器是一种电磁开关设备,可以在主控芯片通过低电平信号激活时打开或关闭风扇电源。继电器通常用于控制较大电流的负载,如风扇等电器设备。本项目使用的继电器具备较高的负载能力,可以可靠地驱动风扇工作,同时避免直接使用微控制器直接驱动高电流负载的风险。

4. Wi-Fi模块:ESP8266

ESP8266是一款低功耗的Wi-Fi模块,由Espressif Systems公司生产,广泛应用于物联网(IoT)设备中。它具有内置的Wi-Fi功能,支持802.11 b/g/n协议,能够实现无线通信,将数据从传感器上传到服务器,或者接收控制命令。ESP8266支持AT指令集,也可以通过Arduino或其他平台进行编程控制。在本项目中,ESP8266用于将温湿度数据上传至远程服务器,并支持通过网页进行远程控制。

5. 显示屏:0.96寸OLED

0.96寸OLED显示屏是一款小尺寸、高对比度的显示模块,常用于嵌入式项目中。它通常使用I2C通信协议,与主控芯片连接,能够显示温湿度等实时数据。OLED屏幕没有背光,显示效果清晰且省电,尤其适合在低功耗的嵌入式系统中使用。该显示屏具有128x64像素的分辨率,能够清晰地呈现温度和湿度数据,帮助用户快速查看大棚环境状况。

6. 水汽检测:雨滴传感器

• 雨滴传感器用于检测大棚内的水滴或湿气状况,能够感知环境中的水分变化。该传感器采用电阻式或电容式工作原理,在感应到水滴或湿气时改变其电阻值或电容值,从而向主控芯片发送信号。在本项目中,雨滴传感器可用于检测大棚内是否有积水或潮湿现象,协助监控大棚的湿度,防止过多水分影响作物生长。

7. 蜂鸣器:有源蜂鸣器

有源蜂鸣器是一种能够发出声音信号的电子元件。它内部自带振荡电路,只需要提供适当的电源即可发出声音。在本项目中,蜂鸣器用于报警功能,当大棚内的温湿度超过设定阈值时,蜂鸣器将通过高电平触发发出警报,提醒用户及时处理异常情况。蜂鸣器的音量和频率足以引起用户的注意,确保及时采取措施。

8. 电源模块

电源模块负责为系统中的所有硬件组件提供稳定的电力供应。电源模块一般包括DC-DC转换器,能够将输入的电压转换为适合各个模块的工作电压(例如3.3V、5V等)。在本项目中,电源模块必须能够支持STM32、ESP8266、传感器、显示屏和风扇等模块的电力需求,同时保证电压稳定,避免电源波动对系统的影响。电源模块的稳定性是保证系统正常运行的基础。

二、服务器设计

设备通过TCP协议向服务器上传温湿度数据,并在HTML前端进行展示。

2.1 服务器后端代码 (Python + Flask)

服务器后端将使用TCP协议接收来自设备端的数据,并将数据存储在内存中。同时,Flask用于提供网页界面,让用户能够实时查看温湿度数据。

# server.py
import socket
import threading
from flask import Flask, render_template
import time

# 创建Flask应用
app = Flask(__name__)

# 存储接收到的温湿度数据
temperature = None
humidity = None

# TCP服务器设置
TCP_IP = "0.0.0.0"  # 监听所有IP
TCP_PORT = 5005
BUFFER_SIZE = 1024

def handle_client(client_socket):
    global temperature, humidity
    while True:
        try:
            # 接收数据
            data = client_socket.recv(BUFFER_SIZE).decode("utf-8")
            if not data:
                break
            print(f"Received data: {data}")
            
            # 解析温湿度数据 (假设数据格式为 "temp:<temperature>,hum:<humidity>")
            if "temp" in data and "hum" in data:
                temp_data = data.split(",")
                temperature = temp_data[0].split(":")[1]
                humidity = temp_data[1].split(":")[1]
        except Exception as e:
            print(f"Error: {e}")
            break
    
    client_socket.close()

def start_tcp_server():
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind((TCP_IP, TCP_PORT))
    server_socket.listen(5)
    print(f"Listening on {TCP_IP}:{TCP_PORT}...")
    
    while True:
        client_socket, addr = server_socket.accept()
        print(f"Connection from {addr}")
        client_handler = threading.Thread(target=handle_client, args=(client_socket,))
        client_handler.start()

# 启动TCP服务器
threading.Thread(target=start_tcp_server, daemon=True).start()

# 主页路由,渲染HTML页面,显示最新的温湿度数据
@app.route('/')
def index():
    return render_template('index.html', temperature=temperature, humidity=humidity)

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=5000)

说明:

• TCP Server:服务器通过TCP协议接收数据。设备端通过TCP发送温湿度数据到服务器,数据格式为"temp:<temperature>,hum:<humidity>"。服务器解析这些数据并存储在全局变量temperaturehumidity中。

• Flask Web Server:Flask用于提供网页界面,用户访问/路径时,Flask会渲染index.html页面,并将最新的温湿度数据传递给前端显示。

• 多线程处理:使用threading模块实现了TCP服务器的多线程处理,允许多个设备同时连接并发送数据。

2.2 HTML前端代码 (index.html)

HTML页面用于显示实时的温湿度数据。页面会定时刷新,以便实时查看数据变化。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>温湿度监控系统</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            background-color: #f4f4f4;
            text-align: center;
            margin-top: 50px;
        }
        h1 {
            color: #333;
        }
        .data-box {
            background-color: #fff;
            padding: 20px;
            margin: 20px;
            border-radius: 10px;
            box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
        }
        .data-box h2 {
            font-size: 2em;
            margin-bottom: 10px;
        }
        .data-box p {
            font-size: 1.5em;
        }
        .refresh-button {
            margin-top: 20px;
            padding: 10px 20px;
            background-color: #4CAF50;
            color: white;
            border: none;
            border-radius: 5px;
            cursor: pointer;
        }
        .refresh-button:hover {
            background-color: #45a049;
        }
    </style>
</head>
<body>

    <h1>大棚温湿度监控系统</h1>
    
    <div class="data-box">
        <h2>实时温度: <span id="temperature">{{ temperature if temperature else '无数据' }}</span>°C</h2>
        <p>实时湿度: <span id="humidity">{{ humidity if humidity else '无数据' }}</span>%</p>
    </div>
    
    <button class="refresh-button" onclick="refreshData()">刷新数据</button>

    <script>
        // 每5秒刷新一次页面,确保数据实时更新
        function refreshData() {
            window.location.reload();
        }

        setInterval(refreshData, 5000); // 每5秒自动刷新
    </script>

</body>
</html>

说明:

• 实时数据展示{{ temperature }}{{ humidity }}是Flask传递给模板的数据。通过Jinja模板语法,Flask将Python中的数据动态插入到HTML中。

• 定时刷新:每5秒通过JavaScript的setInterval方法自动刷新页面,以保证前端能够实时获取最新的温湿度数据。

• 刷新按钮:用户也可以通过点击“刷新数据”按钮手动刷新数据。

2.3 运行项目

确保Python环境已安装Flask模块,使用以下命令安装:

pip install flask

启动Flask应用:

python server.py

• 服务器将启动在http://0.0.0.0:5000,并且能够接收设备数据。

• 确保设备已正确连接至网络,并能够向服务器的IP和端口发送数据。

2.4 HTML网页-静态测试页面

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>大棚自动通风系统监控</title>
    <style>
        body {
            font-family: 'Orbitron', sans-serif;
            background-color: #000;
            color: #0f0;
            padding: 20px;
            text-align: center;
        }

        h1 {
            font-size: 36px;
            text-shadow: 0 0 10px #0f0;
        }

        .data-container {
            display: flex;
            justify-content: center;
            gap: 20px;
            margin-bottom: 20px;
        }

        .data-box {
            border: 2px solid #0f0;
            border-radius: 10px;
            padding: 20px;
            width: 200px;
            box-shadow: 0 0 10px #0f0;
            animation: glow 1.5s ease-in-out infinite alternate;
        }

        @keyframes glow {
            from {
                box-shadow: 0 0 10px #0f0;
            }
            to {
                box-shadow: 0 0 20px #0f0, 0 0 30px #0f0;
            }
        }

        .threshold-container {
            margin-bottom: 20px;
        }

        .fan-control {
            margin-bottom: 20px;
        }

        input[type="number"] {
            background-color: #000;
            color: #0f0;
            border: 2px solid #0f0;
            border-radius: 5px;
            padding: 10px;
            margin: 5px;
        }

        button {
            background-color: #0f0;
            color: #000;
            border: none;
            border-radius: 5px;
            padding: 10px 20px;
            margin: 5px;
            cursor: pointer;
            transition: background-color 0.3s ease;
        }

        button:hover {
            background-color: #0c0;
        }
    </style>
    <link href="https://fonts.lug.ustc.edu.cn/css2?family=Orbitron&display=swap" rel="stylesheet">
</head>

<body>
    <h1>大棚自动通风系统监控</h1>

    <!-- 显示环境温度和湿度 -->
    <div class="data-container">
        <div class="data-box">
            <h2>环境温度</h2>
            <p id="temperature">暂无数据</p>
        </div>
        <div class="data-box">
            <h2>环境湿度</h2>
            <p id="humidity">暂无数据</p>
        </div>
    </div>

    <!-- 温湿度阈值调整 -->
    <div class="threshold-container">
        <h2>温湿度阈值调整</h2>
        <label for="temp-threshold">温度阈值:</label>
        <input type="number" id="temp-threshold" value="25">
        <label for="humidity-threshold">湿度阈值:</label>
        <input type="number" id="humidity-threshold" value="60">
        <button onclick="saveThresholds()">保存阈值</button>
    </div>

    <!-- 风扇控制 -->
    <div class="fan-control">
        <h2>风扇控制</h2>
        <button onclick="turnOnFan()">开启风扇</button>
        <button onclick="turnOffFan()">关闭风扇</button>
    </div>

    <script>
        // 模拟获取环境温度和湿度数据
        function updateData() {
            // 这里应该替换为实际的 API 请求来获取数据
            const temperature = Math.random() * 40;
            const humidity = Math.random() * 100;

            document.getElementById('temperature').textContent = temperature.toFixed(2) + ' °C';
            document.getElementById('humidity').textContent = humidity.toFixed(2) + ' %';
        }

        // 保存温湿度阈值
        function saveThresholds() {
            const tempThreshold = document.getElementById('temp-threshold').value;
            const humidityThreshold = document.getElementById('humidity-threshold').value;
            // 这里应该替换为实际的 API 请求来保存阈值
            alert(`温度阈值已保存为 ${tempThreshold} °C,湿度阈值已保存为 ${humidityThreshold} %`);
        }

        // 开启风扇
        function turnOnFan() {
            // 这里应该替换为实际的 API 请求来控制风扇
            alert('风扇已开启');
        }

        // 关闭风扇
        function turnOffFan() {
            // 这里应该替换为实际的 API 请求来控制风扇
            alert('风扇已关闭');
        }

        // 定时更新数据
        setInterval(updateData, 5000);
        updateData();
    </script>
</body>

</html>

2.5 HTMl网页-静态页面2

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>大棚自动通风系统</title>
    <style>
        /* 页面背景和字体 */
        body {
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            background: linear-gradient(135deg, #3a3a3a, #1a1a1a);
            color: #f1f1f1;
            padding: 40px;
            margin: 0;
        }
        
        h1 {
            text-align: center;
            font-size: 36px;
            color: #00bcd4;
            margin-bottom: 40px;
        }

        .container {
            width: 70%;
            margin: 0 auto;
            background-color: rgba(0, 0, 0, 0.6);
            padding: 30px;
            border-radius: 15px;
            box-shadow: 0 0 20px rgba(0, 0, 0, 0.5);
        }

        .data-section {
            display: flex;
            justify-content: space-between;
            margin-bottom: 30px;
            font-size: 18px;
        }

        .data-section div {
            padding: 15px;
            background-color: #333;
            border-radius: 8px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.4);
            text-align: center;
        }

        .input-group {
            margin-bottom: 25px;
        }

        .input-group label {
            font-size: 18px;
            margin-bottom: 10px;
            display: block;
            color: #00bcd4;
        }

        .input-group input[type="number"] {
            width: 150px;
            padding: 12px;
            font-size: 18px;
            border-radius: 10px;
            border: 2px solid #00bcd4;
            background-color: #2c2c2c;
            color: #f1f1f1;
        }

        .button-group {
            text-align: center;
            margin-top: 30px;
        }

        .button-group button {
            padding: 15px 30px;
            font-size: 20px;
            margin: 0 20px;
            cursor: pointer;
            border: none;
            border-radius: 50px;
            transition: 0.3s;
        }

        .button-group button:hover {
            opacity: 0.8;
        }

        .button-group button.on {
            background-color: #00bcd4;
            color: white;
        }

        .button-group button.off {
            background-color: #f44336;
            color: white;
        }

        .status {
            font-size: 20px;
            text-align: center;
            margin-top: 20px;
        }

        .status span {
            font-weight: bold;
            font-size: 24px;
            color: #ff9800;
        }

        /* 动画效果 */
        @keyframes fadeIn {
            0% { opacity: 0; }
            100% { opacity: 1; }
        }

        .container {
            animation: fadeIn 1s ease-in-out;
        }
    </style>
</head>
<body>

    <h1>大棚自动通风系统</h1>
    <div class="container">
        <!-- 环境数据部分 -->
        <div class="data-section">
            <div>
                <strong>当前温度:</strong> <span id="current-temp">--</span> °C
            </div>
            <div>
                <strong>当前湿度:</strong> <span id="current-humidity">--</span> %
            </div>
        </div>

        <!-- 温湿度阀值调整部分 -->
        <div class="input-group">
            <label for="temp-threshold">温度阀值 (°C):</label>
            <input type="number" id="temp-threshold" value="30" min="0">
        </div>
        <div class="input-group">
            <label for="humidity-threshold">湿度阀值 (%):</label>
            <input type="number" id="humidity-threshold" value="60" min="0">
        </div>

        <!-- 风扇控制部分 -->
        <div class="button-group">
            <button id="fan-on" class="on">开启风扇</button>
            <button id="fan-off" class="off">关闭风扇</button>
        </div>

        <!-- 风扇状态显示 -->
        <div class="status" id="fan-status">风扇状态: <span>关闭</span></div>
    </div>

    <script>
        // 假设从ESP8266接收到的数据
        let currentTemperature = 25; // 当前温度
        let currentHumidity = 55;    // 当前湿度

        // 更新网页中的环境温湿度数据
        function updateEnvironmentData() {
            document.getElementById('current-temp').textContent = currentTemperature;
            document.getElementById('current-humidity').textContent = currentHumidity;
        }

        // 模拟从服务器获取实时环境数据
        setInterval(function() {
            // 此处需要调用ESP8266获取的实时数据
            // 假设温度和湿度变化
            currentTemperature += Math.random() * 2 - 1; // 随机变化模拟
            currentHumidity += Math.random() * 2 - 1;    // 随机变化模拟
            currentTemperature = Math.round(currentTemperature * 10) / 10;
            currentHumidity = Math.round(currentHumidity * 10) / 10;
            updateEnvironmentData();
        }, 2000);

        // 获取并显示温湿度阀值
        const tempThresholdInput = document.getElementById('temp-threshold');
        const humidityThresholdInput = document.getElementById('humidity-threshold');

        tempThresholdInput.addEventListener('change', function() {
            // 更新温度阀值
            tempThreshold = tempThresholdInput.value;
            console.log("温度阀值已更改为:", tempThreshold);
        });

        humidityThresholdInput.addEventListener('change', function() {
            // 更新湿度阀值
            humidityThreshold = humidityThresholdInput.value;
            console.log("湿度阀值已更改为:", humidityThreshold);
        });

        // 风扇控制
        const fanOnButton = document.getElementById('fan-on');
        const fanOffButton = document.getElementById('fan-off');
        const fanStatusText = document.getElementById('fan-status');

        fanOnButton.addEventListener('click', function() {
            // 发送命令给ESP8266打开风扇
            fanStatusText.innerHTML = '风扇状态: <span>开启</span>';
            fanOnButton.disabled = true;
            fanOffButton.disabled = false;
            console.log('风扇已开启');
        });

        fanOffButton.addEventListener('click', function() {
            // 发送命令给ESP8266关闭风扇
            fanStatusText.innerHTML = '风扇状态: <span>关闭</span>';
            fanOnButton.disabled = false;
            fanOffButton.disabled = true;
            console.log('风扇已关闭');
        });

        // 初始页面加载时更新显示
        updateEnvironmentData();
    </script>
</body>
</html>

三、STM32代码设计

项目的目标是通过STM32F103RCT6微控制器监测温湿度数据,并通过Wi-Fi模块(ESP8266)将这些数据上传到后端服务器。

当前项目使用的相关软件工具、模块源码已经上传到网盘:https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink

3.1 硬件设计概述

• 主控芯片:STM32F103RCT6
负责处理传感器数据、控制风扇的开关、通信模块的控制等。

• 温湿度传感器:SHT30
用于测量大棚内的温度和湿度。

• Wi-Fi模块:ESP8266
用于将温湿度数据通过TCP协议传输到远程服务器。

• 显示模块:0.96寸OLED
用于显示实时温湿度数据。

• 蜂鸣器和继电器
用于报警和控制风扇。

3.2 软件设计概述

STM32的程序由以下几个模块组成:

1. 温湿度数据采集模块:通过I2C接口读取SHT30温湿度传感器的数据。

2. Wi-Fi数据上传模块:通过USART与ESP8266进行通信,利用AT指令将数据上传到服务器。

3. OLED显示模块:通过I2C接口将当前的温湿度数据实时显示。

4. 风扇控制模块:根据温湿度阈值控制继电器,开启或关闭风扇。

5. 蜂鸣器报警模块:当温湿度超出设定范围时,触发蜂鸣器报警。

3.3 STM32代码设计

(1)主代码

以下代码将包括温湿度的监测,风扇的自动控制,数据的上传,报警功能,以及其他所需功能的实现。

#include "stm32f1xx_hal.h"
#include "sht30.h"        // SHT30温湿度传感器库
#include "esp8266.h"      // ESP8266 Wi-Fi模块库
#include "oled.h"         // OLED显示库
#include "buzzer.h"       // 蜂鸣器控制库
#include "relay.h"        // 风扇继电器控制库
#include "tim.h"          // 定时器库
#include "usart.h"        // UART库

#define TEMP_THRESHOLD 30  // 温度阈值,超过此温度自动开启风扇
#define HUM_THRESHOLD 70   // 湿度阈值,超过此湿度触发报警

// 定义用于存储温湿度数据的结构体
typedef struct {
    float temperature;
    float humidity;
} EnvironmentData;

// 声明全局变量
EnvironmentData current_data;

// 函数声明
void SystemClock_Config(void);
void MX_GPIO_Init(void);
void MX_USART1_UART_Init(void);
void MX_I2C1_Init(void);
void MX_TIM2_Init(void);
void read_sensor_data(void);
void control_fan(void);
void display_data(void);
void send_data_to_server(void);
void buzzer_alert(void);
void update_data(void);
void start_timer(void);

int main(void) {
    // 初始化硬件资源
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_USART1_UART_Init();
    MX_I2C1_Init();
    MX_TIM2_Init();  // 定时器初始化

    // 初始化子模块
    SHT30_Init();     // 初始化温湿度传感器
    OLED_Init();      // 初始化OLED显示
    Buzzer_Init();    // 初始化蜂鸣器
    Relay_Init();     // 初始化继电器(风扇控制)
    ESP8266_Init();   // 初始化ESP8266 Wi-Fi模块

    // 开始定时器,用于周期性地读取数据
    start_timer();

    while (1) {
        // 读取传感器数据
        read_sensor_data();

        // 自动控制风扇(基于温湿度)
        control_fan();

        // 更新显示内容
        display_data();

        // 上传数据到服务器
        send_data_to_server();

        // 检查报警条件
        if (current_data.temperature > TEMP_THRESHOLD || current_data.humidity > HUM_THRESHOLD) {
            buzzer_alert();
        }
    }
}

// 读取温湿度数据
void read_sensor_data(void) {
    uint8_t data[6] = {0};
    int ret = SHT30_ReadData(&current_data.temperature, &current_data.humidity);
    if (ret != 0) {
        // 读取失败处理
    }
}

// 控制风扇的开启与关闭
void control_fan(void) {
    if (current_data.temperature > TEMP_THRESHOLD || current_data.humidity > HUM_THRESHOLD) {
        Relay_ON();  // 超过阈值时开启风扇
    } else {
        Relay_OFF(); // 否则关闭风扇
    }
}

// 显示实时数据在OLED屏上
void display_data(void) {
    OLED_Clear();
    OLED_ShowString(0, 0, "Temp: %.2f C", current_data.temperature);
    OLED_ShowString(0, 16, "Humidity: %.2f%%", current_data.humidity);
}

// 发送数据到服务器(通过ESP8266)
void send_data_to_server(void) {
    char data[128];
    sprintf(data, "temperature=%.2f&humidity=%.2f", current_data.temperature, current_data.humidity);
    ESP8266_SendData(data); // 通过ESP8266发送数据到服务器
}

// 蜂鸣器报警
void buzzer_alert(void) {
    Buzzer_ON();
    HAL_Delay(500);
    Buzzer_OFF();
}

// 定时器回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
    if (htim->Instance == TIM2) {
        // 每次定时器触发时读取一次数据
        read_sensor_data();
    }
}

// 定时器启动
void start_timer(void) {
    HAL_TIM_Base_Start_IT(&htim2);  // 启动定时器中断
}
(2)SHT30传感器驱动代码

SHT30.h 和 SHT30.c 提供了与SHT30温湿度传感器的I2C通信,读取温湿度数据的功能。

#include "stm32f1xx_hal.h"
#include "i2c.h"

#define SHT30_ADDR 0x44  // SHT30的I2C地址

void SHT30_Init(void)
{
    // 初始化SHT30传感器
    uint8_t cmd[2] = {0x2C, 0x06};  // 获取温湿度数据的命令
    HAL_I2C_Master_Transmit(&hi2c1, SHT30_ADDR << 1, cmd, 2, HAL_MAX_DELAY);
}

void SHT30_ReadData(float *temperature, float *humidity)
{
    uint8_t buffer[6];
    HAL_I2C_Master_Receive(&hi2c1, SHT30_ADDR << 1, buffer, 6, HAL_MAX_DELAY);

    // 将读取到的数据转换为温湿度值
    uint16_t raw_temperature = (buffer[0] << 8) | buffer[1];
    uint16_t raw_humidity = (buffer[3] << 8) | buffer[4];

    *temperature = -45 + (175 * (float)raw_temperature) / 65535.0f;
    *humidity = 100 * (float)raw_humidity / 65535.0f;
}
(3)Wi-Fi模块(ESP8266)通信代码

通过USART与ESP8266进行通信,实现温湿度数据的上传。

#include "usart.h"
#include "string.h"

void send_to_esp8266(const char *data)
{
    HAL_UART_Transmit(&huart1, (uint8_t*)data, strlen(data), HAL_MAX_DELAY);  // 发送数据到ESP8266
}

void setup_esp8266(void)
{
    send_to_esp8266("AT+RSTrn");  // 重启ESP8266
    HAL_Delay(1000);
    send_to_esp8266("AT+CWMODE=1rn");  // 设置为Station模式
    HAL_Delay(1000);
    send_to_esp8266("AT+CWJAP="SSID","PASSWORD"rn");  // 连接Wi-Fi
    HAL_Delay(5000);
    send_to_esp8266("AT+CIPSTART="TCP","192.168.1.100",5005rn");  // 启动TCP连接
    HAL_Delay(2000);
}

3.4 设计说明

1. 温湿度监测:通过SHT30传感器获取实时的温湿度数据,使用I2C协议与STM32进行通信。

2. 数据上传:数据通过ESP8266 Wi-Fi模块与后端服务器进行通信。ESP8266通过USART与STM32进行数据交互,发送温湿度数据到服务器。

3. OLED显示:STM32通过I2C将温湿度数据实时显示在OLED屏幕上,便于用户查看。

4. 风扇控制:当温度超过30°C时,STM32通过继电器控制风扇打开,保证大棚的温度在合理范围内。

5. 报警功能:当温湿度超过预设阈值时,STM32触发蜂鸣器报警,提醒用户采取措施。

3.5 总结

本项目基于STM32微控制器,通过SHT30传感器监测大棚内的环境温湿度,并通过ESP8266模块将数据上传到服务器。同时,系统还提供实时显示、风扇控制以及报警功能,确保大棚内的环境得到及时调节和监控。

四、总结

本项目设计并实现了一个基于STM32的自动化大棚通风系统,成功集成了环境监测、自动风扇控制、报警功能、数据可视化和远程控制等多项功能。通过温湿度传感器(SHT30)的实时数据采集与处理,结合STM32的高效控制能力,实现了对大棚环境的精确调节,确保温湿度保持在预设范围内,以促进植物的生长。

系统的自动控制功能能够根据实时温湿度数据自动启闭风扇,并通过蜂鸣器发出报警信号,提醒用户干预。OLED显示屏实时展示环境数据,方便用户监控大棚内的状态。同时,系统还具有历史数据记录和定时控制功能,为用户提供更加智能化的操作体验。

远程控制功能的实现通过ESP8266模块将温湿度数据上传至服务器,用户可以通过手机或PC端远程查看大棚环境数据并控制风扇,提升了操作的便捷性和灵活性。

通过本项目的实现,不仅能优化大棚内环境管理,提高作物生长效率,同时也为智能农业的进一步发展提供了一个实践平台。未来可以在此基础上引入更多智能化控制,比如光照调节、湿度补偿等,进一步提升系统的综合性能与应用场景。

本项目实现了软硬件的良好结合,充分展示了基于STM32的物联网技术在农业自动化中的广泛应用前景。

意法半导体

意法半导体

意法半导体(ST)集团于1987年6月成立,是由意大利的SGS微电子公司和法国Thomson半导体公司合并而成。1998年5月,SGS-THOMSON Microelectronics将公司名称改为意法半导体有限公司。意法半导体是世界最大的半导体公司之一,公司销售收入在半导体工业五大高速增长市场之间分布均衡(五大市场占2007年销售收入的百分比):通信(35%),消费(17%),计算机(16%),汽车(16%),工业(16%)。 据最新的工业统计数据,意法半导体是全球第五大半导体厂商,在很多市场居世界领先水平。例如,意法半导体是世界第一大专用模拟芯片和电源转换芯片制造商,世界第一大工业半导体和机顶盒芯片供应商,而且在分立器件、手机相机模块和车用集成电路领域居世界前列.

意法半导体(ST)集团于1987年6月成立,是由意大利的SGS微电子公司和法国Thomson半导体公司合并而成。1998年5月,SGS-THOMSON Microelectronics将公司名称改为意法半导体有限公司。意法半导体是世界最大的半导体公司之一,公司销售收入在半导体工业五大高速增长市场之间分布均衡(五大市场占2007年销售收入的百分比):通信(35%),消费(17%),计算机(16%),汽车(16%),工业(16%)。 据最新的工业统计数据,意法半导体是全球第五大半导体厂商,在很多市场居世界领先水平。例如,意法半导体是世界第一大专用模拟芯片和电源转换芯片制造商,世界第一大工业半导体和机顶盒芯片供应商,而且在分立器件、手机相机模块和车用集成电路领域居世界前列.收起

查看更多

相关推荐