一、项目概述1.1 项目背景与目标高校宿舍管理场景看起来简单实际是一个典型的“多因素、强实时、低成本”系统。传统方式主要依赖人工巡查和经验判断存在几个明显问题宿舍温湿度、光照、烟雾等环境参数无法持续采集异常情况发现滞后用电统计粗放缺少实时功率、累计电量和超额预警能力学生离开宿舍后设备仍长时间运行存在明显能源浪费管理数据零散缺少历史记录与趋势分析后续追溯困难基于这些痛点可以把宿舍管理系统拆成三类需求环境监测实时采集温湿度、烟雾、光照、人体在位状态能源管理实时采集电压、电流、功率并做电费估算与超额提醒远程可视化通过无线链路把数据上传到上位机做图形化展示和历史存储本文整理一套适合毕业设计展示的完整方案以STM32F103C8T6为核心控制器集成DHT11、INA226、MQ-2、TEMT6000、PIR等传感器使用ESP8266-01S搭建 AP 模式无线链路最后由Python PyQt5上位机完成实时界面展示、SQLite 入库与异常报警。1.2 技术栈选型技术领域具体选型选择理由主控芯片STM32F103C8T6成本低、开发资料多、GPIO/ADC/I2C/UART 资源足够温湿度检测DHT11接口简单、成本低适合宿舍场景演示电流功率检测INA226I2C 接口、精度高可直接测电流/电压/功率烟雾检测MQ-2成熟常见适合做火灾隐患预警演示光照检测TEMT6000模拟量输出接 STM32 ADC 即可人体检测PIR 红外人体模块低成本、逻辑清晰适合联动节能控制无线通信ESP8266-01S成本低、AT 指令成熟、WiFi 部署方便网络模式AP TCP本地直连上位机便于宿舍场景演示和调试上位机Python PyQt5开发效率高适合毕业设计可视化展示数据存储SQLite轻量级、零部署适合本地历史数据管理1.3 系统功能实时采集温度、湿度、光照、烟雾浓度、人体检测状态实时采集电压、电流、功率并估算累计电费OLED 本地显示关键参数断网时仍可查看本地状态ESP8266 建立热点并通过 TCP 向上位机周期性发送数据上位机实时刷新监测界面支持历史数据存储与查询当功率超阈值、烟雾异常或环境异常时触发本地和上位机双重报警基于人体在位状态做简单节能联动为后续智能控制预留接口二、系统架构设计2.1 整体架构系统采用“采集端 通信端 上位机”的三端协同结构适合毕业设计答辩时讲清楚分层思路。感知层STM32 负责采集宿舍环境与用电参数并做本地阈值判断传输层ESP8266 负责无线接入建立 AP 热点和 TCP 服务器应用层PyQt5 上位机负责数据接收、界面展示、日志记录、SQLite 存储推荐在 CSDN 中插入系统架构图![系统架构图](architecture.png)2.2 数据流向本系统的数据链路比较直观可以概括为控制思路也可以进一步扩展上位机下发阈值参数STM32 更新本地阈值后续可扩展风扇、继电器、照明等联动执行器推荐在正文中插入数据流向图![数据流向图](dataflow.png)2.3 设计指标为了让毕业设计更像工程项目建议在文章中加入量化指标指标项目标值说明数据采集周期2s与上位机刷新周期保持一致报警响应时间≤1s功率超限、烟雾异常时快速提示WiFi 通信延迟100ms宿舍内本地 AP 场景下可实现连续稳定运行≥24h满足毕设演示和可靠性测试硬件成本100 元体现方案的低成本可落地性三、硬件设计与连接3.1 硬件清单组件型号数量说明MCU 主控STM32F103C8T6 最小系统板1系统核心控制器温湿度传感器DHT111宿舍温湿度采集电流功率模块INA2261电压、电流、功率测量烟雾传感器MQ-21火灾隐患预警光照传感器TEMT60001宿舍亮度采集人体检测模块PIR1人体在位检测WiFi 模块ESP8266-01S1本地热点与 TCP 传输显示模块0.96 寸 OLED1本地数据显示LED 指示灯红色 LED1超额预警/告警电源模块5V/3.3V 稳压1给系统供电3.2 引脚连接说明模块STM32 引脚接口类型备注DHT11 DATAPA7GPIO 单总线外接 4.7K 上拉INA226 SCL/SDAPB6 / PB7I2C1监测电压电流功率MQ-2 AOPA0ADC1_CH0模拟量采集MQ-2 DOPB1GPIO 输入数字阈值告警TEMT6000 AOPA1ADC1_CH1光照模拟量采集PIR OUTPB12GPIO 输入检测人体活动OLED SCL/SDAPB6 / PB7I2C1与 INA226 共总线ESP8266 TX/RXPA10 / PA9USART1交叉连接预警 LEDPB13GPIO 输出超额或异常告警3.3 关键硬件注意事项⚠️重要提醒ESP8266-01S 必须使用稳定的 3.3V 供电峰值电流可达 300mA不能直接从 STM32 板载 3.3V 弱供电口硬拖。MQ-2 模拟输出可能接近 5V进入 STM32 ADC 前必须做分压处理。DHT11 的采样周期不要太快建议 1 秒以上否则容易读到重复数据或校验失败。INA226 的分流电阻选型会直接影响测量精度建议使用低阻值、高精度分流电阻。如果后续接入继电器控制大功率负载必须做好电源隔离和反灌保护。3.4 软件开发环境# STM32 端STM32CubeIDE / Keil MDK# 上位机端pipinstallPyQt5 pyqtgraph matplotlib四、代码实现详解4.1 主程序整体思路STM32 端采用“前后台”结构最容易讲清楚初始化 GPIO、ADC、I2C、USART、定时器初始化 DHT11、INA226、OLED、ESP8266主循环按顺序采集各类传感器将采集结果刷新到 OLED每 2 秒打包一帧文本数据通过 ESP8266 发送给上位机根据阈值判断是否触发 LED 预警核心主循环可以写成下面这种形式while(1){Read_DHT11(temp,humi);powerINA226_GetPower();smokeMQ2_ReadValue();lightTEMT6000_ReadLux();motionPIR_ReadState();OLED_ShowData(temp,humi,power,smoke,light,motion);if(send_flag){SendSensorData(temp,humi,power,smoke,light,motion);send_flag0;}Alarm_Check(power,smoke);HAL_Delay(200);}4.2 DHT11 温湿度采集DHT11 适合毕业设计入门实现成本低、逻辑简单核心是单总线时序控制。头文件示例// dht11.h#ifndef__DHT11_H#define__DHT11_H#includestm32f1xx_hal.huint8_tDHT11_ReadData(uint8_t*temp,uint8_t*humi);#endif实现示例// dht11.c#includedht11.huint8_tDHT11_ReadData(uint8_t*temp,uint8_t*humi){uint8_tbuf[5]{0};// 这里省略详细时序核心是启动信号、响应检测、40位数据读取和校验// 成功后返回温湿度整数部分*humibuf[0];*tempbuf[2];if((uint8_t)(buf[0]buf[1]buf[2]buf[3])buf[4]){return0;}return1;}4.3 INA226 电流/功率采集INA226 是这个项目里比较加分的模块因为它不仅能看电流还能算功率和总线电压更容易体现“能源管理”而不只是“环境监测”。// ina226.h#ifndef__INA226_H#define__INA226_H#includestm32f1xx_hal.hfloatINA226_GetVoltage(void);floatINA226_GetCurrent(void);floatINA226_GetPower(void);#endif// ina226.c#includeina226.hexternI2C_HandleTypeDef hi2c1;floatINA226_GetVoltage(void){uint16_traw0;// 读取总线电压寄存器换算为实际电压returnraw*1.25f/1000.0f;}floatINA226_GetCurrent(void){uint16_traw0;// 读取分流电压寄存器并结合分流电阻换算电流returnraw*5.9f;}floatINA226_GetPower(void){returnINA226_GetVoltage()*INA226_GetCurrent();}4.4 MQ-2 与 TEMT6000 模拟量采集这两个模块都可以直接走 ADC代码思路很清晰采样、滤波、换算。uint16_tADC_ReadChannel(uint32_tchannel){ADC_ChannelConfTypeDef sConfig{0};sConfig.Channelchannel;sConfig.RankADC_REGULAR_RANK_1;sConfig.SamplingTimeADC_SAMPLETIME_55CYCLES_5;HAL_ADC_ConfigChannel(hadc1,sConfig);HAL_ADC_Start(hadc1);HAL_ADC_PollForConversion(hadc1,10);returnHAL_ADC_GetValue(hadc1);}floatTEMT6000_ReadLux(void){uint16_tadcADC_ReadChannel(ADC_CHANNEL_1);returnadc*0.5f;}floatMQ2_ReadValue(void){uint16_tadcADC_ReadChannel(ADC_CHANNEL_0);return(adc/4095.0f)*100.0f;}4.5 PIR 人体检测与节能联动PIR 模块输出的是数字量非常适合做简单联动。比如检测到长时间无人时标记宿舍为空闲状态后续扩展控制照明、风扇、插座继电器结合功率数据做“有人/无人”用电行为分析uint8_tPIR_ReadState(void){returnHAL_GPIO_ReadPin(GPIOB,GPIO_PIN_12)GPIO_PIN_SET?1:0;}4.6 ESP8266 AP 模式通信这个系统没有强依赖外网最适合毕业设计现场演示的方式就是让 ESP8266 直接开热点上位机连它的热点然后走 TCP 收数。初始化流程AT测试模块是否在线设置工作模式为 AP配置 SSID 和密码开启多连接建立 TCP Server// esp8266.cvoidESP8266_Init(void){ESP_SendCmd(AT\r\n,OK,1000);ESP_SendCmd(ATCWMODE2\r\n,OK,1000);ESP_SendCmd(ATCWSAP\SmartDorm\,\12345678\,5,3\r\n,OK,3000);ESP_SendCmd(ATCIPMUX1\r\n,OK,1000);ESP_SendCmd(ATCIPSERVER1,8080\r\n,OK,1000);}数据发送建议使用文本协议调试最方便voidSendSensorData(floattemp,floathumi,floatpower,floatsmoke,floatlight,uint8_tmotion){chartx_buf[128];sprintf(tx_buf,Temp:%.1fC,Humi:%.1f%%,Power:%.2fmW,GasConc:%.2f,Light:%.2f,Motion:%s\r\n,temp,humi,power,smoke,light,motion?YES:NO);ESP8266_SendData(tx_buf);}4.7 PyQt5 上位机接收与可视化上位机建议采用多线程主线程负责界面网络线程负责 TCP 接收定时器负责界面刷新和数据库写入TCP 接收核心示例importsocketfromPyQt5.QtCoreimportQThread,pyqtSignalclassDataReceiver(QThread):data_receivedpyqtSignal(dict)defrun(self):socksocket.socket(socket.AF_INET,socket.SOCK_STREAM)sock.connect((192.168.4.1,8080))whileTrue:rawsock.recv(1024).decode(utf-8).strip()ifraw:dataself.parse_data(raw)self.data_received.emit(data)defparse_data(self,raw):result{}foriteminraw.split(,):if:initem:k,vitem.split(:,1)result[k]vreturnresultUI 层可以做以下几个区域温湿度卡片功率/电费卡片烟雾和人体状态卡片系统日志窗口历史数据查询窗口如果追求展示效果可以再加一块实时曲线区域用pyqtgraph刷功率或温度变化趋势。4.8 SQLite 历史数据存储SQLite 足够支撑毕设演示而且实现简单。importsqlite3 connsqlite3.connect(sensor_data.db)curconn.cursor()cur.execute( CREATE TABLE IF NOT EXISTS sensor_data ( id INTEGER PRIMARY KEY AUTOINCREMENT, ts TEXT, temp REAL, humi REAL, power REAL, smoke REAL, light REAL, motion INTEGER ) )conn.commit()建议每 60 秒存一次或者每接收一帧就写一次。前者更轻后者数据更完整。五、调试与优化5.1 常见问题排查ESP8266 无法稳定连接先确认供电是否稳定再确认串口波特率和 AT 固件版本最后用串口助手单独测试 AT 指令是否正常DHT11 偶发读取失败检查上拉电阻降低采样频率避免中断或串口发送打断关键时序MQ-2 数据波动大预热时间不足模拟量受电源噪声影响建议增加多次采样平均滤波上位机界面卡顿不要在 UI 主线程里直接做阻塞式recv把网络接收和界面刷新拆开5.2 工程优化建议传感器数据增加滑动平均滤波减少抖动通信协议增加帧头和校验字段提高容错性上位机增加断线重连机制提升演示稳定性阈值参数做成可配置项而不是写死在代码里把 AP 模式升级为 STA MQTT可以进一步接入云平台六、项目总结与扩展6.1 项目成果这套系统的价值不在于“模块多”而在于把环境监测、能源管理、安全预警、上位机可视化这四块真正串起来了。对毕业设计来说它有几个明显优势软硬件链路完整容易形成“系统设计与实现”的叙事既有嵌入式采集也有上位机界面展示效果好场景贴近校园宿舍选题容易被老师理解成本可控硬件容易采购调试门槛不高6.2 可扩展方向增加继电器做照明/插座的节能联动控制接入 CO2、甲醛等空气质量传感器提升环境监测维度将 AP TCP 升级为 MQTT 云平台架构引入语音模块实现语音播报和语音查询基于历史数据做异常检测或用电行为分析6.3 写在最后如果你现在正准备 STM32 相关毕业设计这类“宿舍管理/环境监测/用电预警”方向是比较稳的选题硬件复杂度适中、工程链路完整、可视化效果强答辩时也比较容易讲清楚。如果这篇文章对您有帮助请点赞支持如有问题或建议欢迎在评论区交流。