一、项目功能概述
项目名称:基于图书馆环境的恒温恒湿控制系统设计
项目编号:dz-830
核心控制器:STM32F103C8T6 单片机
本系统集成了多种传感器与控制模块,实现对图书馆内部环境的智能化管理。主要功能如下:
- 采用三路 DHT11 温湿度传感器采集环境数据,计算平均值后进行判断:若温度超出设定范围,则启动加热或制冷设备;若湿度不达标,则执行加湿或除湿操作,并同步触发声光报警机制。
- 支持通过物理按键本地设置温湿度上下限阈值。当环境参数处于设定区间内时,允许手动开启或关闭加热、制冷、加湿和除湿功能。
- 集成人体热释电红外传感器,用于检测非参观区域是否有人进入,一旦发现异常即刻发出警报提示。
- 配备烟雾检测模块,实时监测空气中烟雾浓度,若超过安全阈值则立即启动声光报警系统。
- OLED 显示屏用于直观展示当前环境的温度、湿度、烟雾状态及相关系统运行信息。
- 内置 ESP8266 WIFI 模块,可将采集到的数据上传至手机终端。用户可通过手机远程设置温湿度阈值,并在条件允许时远程操控加热、制冷、加湿及除湿装置的开关状态。
二、系统结构设计说明
整个系统以 STM32F103C8T6 作为主控芯片,协同多个功能模块共同完成环境监控与自动调节任务。整体架构分为中控单元、输入单元和输出单元三大组成部分。
中控单元:由 STM32F103C8T6 构成,负责接收来自各输入模块的数据信号,经过逻辑分析与处理后,向输出模块发送控制指令。
输入模块包括:
- 温湿度传感模块:获取当前环境中的温度与湿度数值,供系统进行调控决策。
- 按键输入模块:用于设定温湿度上下限值,并提供本地手动控制接口。
- 人体热释电传感器:检测特定区域内是否有人员活动,防止非法闯入。
- 烟雾检测模块:持续监测空气中的烟雾含量,预防火灾隐患。
- 电源供电模块:为整个系统稳定运行提供所需电能。
输出模块包括:
- 继电器控制模块:驱动外部设备如风扇(通风)和水泵(灭火),实现物理干预。
- 声光报警装置:在发生火灾、烟雾超标、温度异常或有人误入禁入区时发出警示。
- 显示模块(OLED):实时呈现温度、湿度、烟雾浓度及系统工作状态等关键信息。
此外,WiFi 通信模块可将现场数据上传至移动终端,支持远程参数配置与设备控制,提升系统的灵活性与可维护性。系统总体架构如图所示:
三、实物展示
单片机型号:STM32F103C8T6
PCB 板特征:绿色双层 PCB 板,厚度为 1.2mm,上下层均覆铜并接地,增强抗干扰能力。大部分元器件采用直插式封装,仅个别降压芯片使用贴片工艺。
供电接口:采用 TYPE-C 接口供电,兼容性强,连接方便。
四、电路原理图说明
设计软件版本:Altium Designer 2013
连线方式:采用网络标号方式进行电气连接,提高绘图清晰度与可读性。
注意事项:所提供的原理图为模块级引脚连接图,并未展示各模块内部的具体电路结构。
五、PCB 布局图说明
PCB 图由原理图导出,绝大部分元器件封装由设计者自行绘制,不对外提供独立封装库文件,仅提供完整连接的源工程文件。板子为双层结构,上下表面均覆铜接地,提升电磁兼容性能。
板中央设有项目编号标识,位置隐藏于单片机底座下方,安装完成后不可见,确保外观整洁。
六、程序代码片段展示
开发环境:Keil uVision5
软件架构上将逻辑控制程序与硬件驱动程序分离,分别存放于 main.c 文件与其他对应的 .c 源文件中,便于后期维护与功能扩展。
/**********************************
函数名:处理函数
传参值:无
返回值:无
**********************************/
void Manage_Function(void)
{
if(display_num == 0) //测量界面
{
if(temp_age > temp_max*10) //温度大于设置最大值,制冷继电器闭合
{
RELAY_ZL = 1;
RELAY_JR = 0;
flag_temp = 0;
}
else if(temp_age < temp_min*10) //温度小于设置最小值,加热继电器闭合
{
RELAY_ZL = 0;
RELAY_JR = 1;
flag_temp = 0;
}
else //温度处于设置的上下限值之间,两个继电器断开
{
if(flag_temp == 0)
{
RELAY_ZL = 0;
RELAY_JR = 0;
}
}
if(humi_age > humi_max*10) //湿度大于设置最大值,除湿继电器闭合
{
RELAY_JS = 0;
RELAY_CS = 1;
flag_humi = 0;
}
else if(humi_age < humi_min*10) //湿度小于设置最小值,加湿继电器闭合
{
RELAY_JS = 1;
RELAY_CS = 0;
flag_humi = 0;
}
else //湿度处于设置的上下限值之间,两个继电器断开
{
if(flag_humi == 0)
{
RELAY_JS = 0;
RELAY_CS = 0;
}
}
if(temp_age > temp_max*10 || temp_age < temp_min*10 || humi_age > humi_max*10 || humi_age < humi_min*10 || RT == 0 || SMOG_DO == 0) //异常情况进行声光报警
{
if(time_num % 20 == 0)
{
ALERT = !ALERT;
}
}
else
{
ALERT = 0;
}
}
else //设置界面,关闭继电器及声光报警
{
RELAY_ZL = 0;
RELAY_JR = 0;
RELAY_JS = 0;
RELAY_CS = 0;
ALERT = 0;
}
if(flag_finish_5s == 1) //5秒上传一次数据
{
flag_begin_5s = 0;
Aliyun_Send_Data();
flag_begin_5s = 1;
}
}