基于STM32设计的工地环境实时监测与控制系统设计
一、项目开发背景
随着城市化进程的推进,工地建设和拆迁作业逐渐增多,工地环境的空气污染、噪声污染等问题越来越严重。为了改善工地周边居民的生活环境和施工人员的工作环境,工地环境实时监测与控制系统应运而生。该系统通过实时监测空气中的PM2.5、噪声、温湿度等环境参数,将数据上传至云端平台进行存储和分析,从而实现对环境的实时监控和智能控制。
此外,本项目通过控制加湿系统降低空气中的粉尘浓度,确保工地作业环境符合安全和健康标准。通过将监测数据上传至云端服务器,项目还能够提供全面的环境可视化展示,便于施工方和管理方进行数据分析与决策。
二、设计实现的功能
1. 支持检测空气中的PM2.5含量
系统通过使用夏普PM2.5传感器检测空气中的PM2.5浓度,并实时反馈到本地LCD显示屏,同时上传到云平台进行进一步分析。
2. 支持检测环境的噪声
通过噪声检测传感器检测周围环境的噪声水平,转换为电压信号,经过处理后得到噪声值,实时显示在LCD屏幕上并上传至云端。
3. 本地实时显示数据
采用1.44寸LCD显示屏,实时显示PM2.5浓度、噪声级别、温湿度值等环境数据,方便现场人员实时查看。
4. 数据上云并可视化展示
系统通过WIFI连接到华为云物联网服务器,实时上传采集到的环境数据。然后通过搭建自有的后端服务器,使用Python的socket模块从华为云获取数据,并通过Flask框架构建Web应用,展示环境监测数据的可视化大屏。
5. 设备端数据传输使用WIFI+MQTT协议
设备端(STM32)通过ESP8266模块连接WiFi,并使用MQTT协议将监测数据传输到华为云物联网平台。MQTT协议轻量且高效,非常适合物联网环境下的数据传输。
6. 加湿系统控制
当PM2.5浓度超过设定范围时,系统自动控制加湿器工作,通过继电器驱动喷洒水雾,降低空气中的粉尘浓度。
7. 支持环境温度和湿度检测
系统通过SHT30传感器实时监测环境的温度和湿度,数据通过STM32处理后显示在LCD上,并上传至云端平台。
三、项目硬件模块组成
- 主控芯片:STM32F103RCT6
- 负责处理所有传感器的信号,控制加湿器,并进行数据上传。
- 支持GPIO、ADC、UART等接口,适用于本项目的各项需求。
- PM2.5传感器(夏普)
- 采用红外光散射原理,实时检测空气中的PM2.5浓度。
- 噪声传感器
- 模拟输出,通过转换为电压信号来表示噪声的强度。
- LCD显示屏(1.44寸)
- 用于实时显示环境数据,包括PM2.5浓度、噪声、温湿度等。
- ESP8266 WiFi模块
- 提供无线连接功能,将设备端数据通过WiFi传输到云端。
- 继电器模块
- 用于控制加湿器的开关,响应PM2.5浓度的变化,启动喷水加湿。
- SHT30温湿度传感器
- 精度高,稳定性好,用于检测环境的温度和湿度。
- 电源模块(USB供电)
- 提供稳定的5V电源,确保系统运行。
四、设计思路
1. 硬件设计
- 主控芯片STM32F103RCT6通过GPIO和ADC接口与PM2.5传感器、噪声传感器、SHT30温湿度传感器进行数据采集。
- 通过UART接口与ESP8266通信,进行WiFi连接和MQTT协议数据传输。
- LCD显示屏通过SPI接口与STM32连接,用于实时显示环境参数。
- 使用继电器控制加湿器,当PM2.5浓度超标时启动加湿器,保持工地环境的稳定。
2. 软件设计
- 使用Keil5开发环境编写STM32的控制程序,程序包括传感器数据采集、加湿器控制、LCD显示更新、WiFi连接、MQTT数据上传等功能。
- 在后端,使用Python的socket模块建立与云服务器的通信,通过Flask框架提供Web界面,展示云端环境数据。
3. 数据上传和可视化
- STM32通过ESP8266模块上传数据到华为云物联网平台,数据格式采用JSON。
- 后端服务器通过MQTT协议从华为云获取实时数据,使用Flask框架展示数据,并通过前端大屏进行实时数据可视化。
五、系统功能总结
功能模块 | 具体内容 |
---|---|
环境监测 | 检测PM2.5、噪声、温湿度等环境数据 |
本地显示 | LCD显示屏实时显示各项监测数据 |
数据上传 | 通过WiFi将数据上传至华为云物联网平台 |
数据展示 | 使用Flask框架搭建Web应用,展示实时环境数据 |
MQTT协议 | 设备端与云平台使用MQTT协议进行数据传输 |
加湿器控制 | 根据PM2.5浓度自动控制加湿器,降低空气中的粉尘浓度 |
后端服务器 | 使用Python和Flask框架搭建后端服务器,支持数据获取与展示 |
可视化大屏 | 提供前端大屏显示,实时显示环境数据 |
六、使用的模块的技术详情介绍
1. PM2.5传感器(夏普)
- 工作原理:通过红外光散射原理检测空气中的颗粒物(如PM2.5)。
- 输出信号:通过数字信号输出PM2.5的浓度,单位为µg/m³。
- 精度:±10%(标准测试条件下)。
2. 噪声传感器
- 工作原理:根据声音的强度变化,输出与噪声大小成比例的电压信号。
- 输出信号:模拟电压输出。
- 测量范围:一般为30dB至120dB。
3. SHT30温湿度传感器
- 工作原理:通过电容式湿度传感器和温度传感器芯片实现高精度的温湿度检测。
- 输出信号:通过I2C总线输出温度(°C)和湿度(%RH)值。
- 精度:温度±0.3°C,湿度±2%RH。
4. ESP8266 WiFi模块
- 技术特点:支持WiFi协议、TCP/IP协议栈,具有独立的处理能力,可以作为WiFi终端连接到网络。
- 功能:用于无线数据传输,支持MQTT协议。
5. 继电器模块
- 用于控制电气设备(如加湿器),响应系统的控制信号。
6. LCD显示屏
- 技术特点:1.44寸的彩色LCD显示屏,分辨率128x128像素。
- 用途:实时显示环境数据,便于现场人员查看。
七、总结
本项目设计了一个基于STM32的工地环境实时监测与控制系统,涵盖了空气质量、噪声、温湿度的检测与展示,数据上云并可视化展示,通过控制加湿器自动调节空气质量。系统结合硬件和软件的设计,实现了环境监测与控制的智能化与自动化,提升了工地环境的安全性和舒适度,具有较高的实用价值。
八、STM32代码设计
其他子模块(如PM2.5传感器、噪声传感器、SHT30温湿度传感器、LCD显示、WiFi模块ESP8266等)的驱动和功能已经写好,只需要在main.c
中整合这些模块,实现系统的整体功能。为了简化代码,重点展示如何初始化和使用这些模块。
c
#include "stm32f1xx_hal.h"
#include "lcd.h"
#include "pm25.h"
#include "noise_sensor.h"
#include "sht30.h"
#include "wifi.h"
#include "mqtt.h"
#include "relay.h"
// 定义外部传感器和硬件接口
extern PM25_TypeDef pm25_sensor; // PM2.5传感器实例
extern NoiseSensor_TypeDef noise_sensor; // 噪声传感器实例
extern SHT30_TypeDef sht30_sensor; // 温湿度传感器实例
extern Relay_TypeDef relay; // 继电器控制实例
extern WifiModule_TypeDef wifi_module; // ESP8266 WiFi模块
extern MQTT_Client_TypeDef mqtt_client; // MQTT客户端
// 定义全局变量
float pm25_value = 0.0; // 存储PM2.5浓度值
float noise_value = 0.0; // 存储噪声值
float temperature = 0.0; // 存储温度值
float humidity = 0.0; // 存储湿度值
// 功能声明
void SystemClock_Config(void);
void MX_GPIO_Init(void);
void MX_USART1_UART_Init(void);
void MX_I2C1_Init(void);
void MX_SPI1_Init(void);
// 主程序
int main(void)
{
// 初始化硬件
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_I2C1_Init();
MX_SPI1_Init();
// 初始化外设
LCD_Init(); // 初始化LCD显示屏
PM25_Init(&pm25_sensor); // 初始化PM2.5传感器
NoiseSensor_Init(&noise_sensor); // 初始化噪声传感器
SHT30_Init(&sht30_sensor); // 初始化SHT30温湿度传感器
Relay_Init(&relay); // 初始化继电器
Wifi_Init(&wifi_module); // 初始化WiFi模块
MQTT_Init(&mqtt_client); // 初始化MQTT客户端
// 连接WiFi网络
if (Wifi_Connect(&wifi_module)) {
printf("WiFi Connected.\n");
} else {
printf("WiFi Connection Failed!\n");
}
// 连接MQTT服务器
if (MQTT_Connect(&mqtt_client)) {
printf("MQTT Connected.\n");
} else {
printf("MQTT Connection Failed!\n");
}
// 主循环
while (1)
{
// 1. 获取环境数据
pm25_value = PM25_Read(&pm25_sensor); // 读取PM2.5浓度
noise_value = NoiseSensor_Read(&noise_sensor); // 读取噪声值
SHT30_Read(&sht30_sensor, &temperature, &humidity); // 读取温湿度
// 2. 显示数据到LCD
LCD_Clear();
LCD_DisplayString("PM2.5: %.2f µg/m³", pm25_value);
LCD_DisplayString("Noise: %.2f dB", noise_value);
LCD_DisplayString("Temp: %.2f C", temperature);
LCD_DisplayString("Humidity: %.2f %%", humidity);
// 3. 控制加湿器(如果PM2.5超标)
if (pm25_value > 100.0) { // 如果PM2.5浓度超过100 µg/m³,启动加湿器
Relay_SetState(&relay, RELAY_ON); // 打开加湿器
} else {
Relay_SetState(&relay, RELAY_OFF); // 关闭加湿器
}
// 4. 上传数据到云端
char payload[256];
snprintf(payload, sizeof(payload),
"{\"pm25\": %.2f, \"noise\": %.2f, \"temperature\": %.2f, \"humidity\": %.2f}",
pm25_value, noise_value, temperature, humidity);
// 发布数据到MQTT服务器
MQTT_Publish(&mqtt_client, "environment/data", payload);
}
}
代码解析
- 硬件初始化:
- 在
main()
函数的开头,通过HAL_Init()
初始化HAL库,然后调用各个硬件初始化函数初始化GPIO、串口、I2C和SPI接口。 - 初始化LCD、PM2.5传感器、噪声传感器、SHT30传感器、WiFi模块和MQTT客户端。
- 在
- 环境数据采集:
- 使用传感器驱动函数(如
PM25_Read()
、NoiseSensor_Read()
、SHT30_Read()
)从相应的传感器获取PM2.5浓度、噪声值、温湿度值。
- 使用传感器驱动函数(如
- 数据展示:
- 使用LCD显示模块在LCD上显示PM2.5、噪声、温湿度数据。
- 加湿器控制:
- 根据PM2.5浓度的阈值(如100 µg/m³),判断是否需要启动加湿器,通过
Relay_SetState()
函数控制继电器开关。
- 根据PM2.5浓度的阈值(如100 µg/m³),判断是否需要启动加湿器,通过
- 数据上传:
- 将读取的环境数据通过JSON格式上传至MQTT服务器。调用
MQTT_Publish()
将数据发布到指定的MQTT主题上。
- 将读取的环境数据通过JSON格式上传至MQTT服务器。调用
以上代码展示了如何将各个子模块(传感器、WiFi、MQTT、继电器等)整合在一个STM32项目中,完成实时环境监测、数据展示、数据上传和控制加湿器的功能。