一、前言
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支持多种通信协议(如SPI、I2C、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>"。服务器解析这些数据并存储在全局变量temperature和humidity中。
• 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(¤t_data.temperature, ¤t_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的物联网技术在农业自动化中的广泛应用前景。
2918
