1. 项目概述
这个基于STM32F103C8T6的智能教室控制系统是我去年完成的毕业设计项目,经过三个月的反复调试和优化,最终实现了一套完整的教室设备自动化管理方案。核心思路是通过多传感器协同检测环境状态,实现灯光、风扇、窗帘等设备的智能控制,特别适合高校阶梯教室、实验室等场景使用。
系统最大的亮点是实现了"人来设备开,人走设备关"的自动化管理。实测在50人容量的教室里,相比传统手动控制方式能节省约40%的电力消耗。整个项目涉及硬件设计、传感器选型、嵌入式编程等多个环节,下面我就从设计思路到具体实现,把每个关键环节的细节和踩过的坑都详细分享给大家。
2. 系统整体设计
2.1 核心功能解析
系统主要实现六大核心功能:
- 人数统计与待机控制:采用分离式红外对射传感器统计进出人数,当教室无人时自动关闭所有设备进入低功耗待机模式(实测待机功耗仅0.5W)
- 智能照明控制:通过热释电传感器+光照传感器双重判断,实现"有人且光照不足时开灯"的智能逻辑
- 温度调控系统:DS18B20温度传感器监测环境温度,超过设定阈值自动启动风扇(保留手动控制功能)
- 窗帘自动调节:根据光照强度自动控制步进电机驱动的窗帘,强光时关闭窗帘保护投影效果
- 投影仪联动控制:通过继电器模拟投影仪电源控制,与窗帘系统形成联动
- 人机交互界面:OLED显示屏实时显示环境参数,配合按键实现阈值设置和设备手动控制
2.2 硬件架构设计
系统采用经典的"传感器-控制器-执行器"三层架构:
code复制[输入层] → [控制层] → [输出层]
│ │ │
├─红外对射 ├─STM32F103 ├─OLED显示
├─热释电 C8T6 ├─继电器组
├─光照传感器 ├─步进电机
├─温度传感器
├─DS1302时钟
└─按键模块
特别说明几个关键设计选择:
- 选用STM32F103C8T6是因为其性价比高(约10元/片),且具备足够的外设接口
- 分离式红外对射(而非红外接收管)确保人数统计准确性,成本约15元/对
- 采用DS18B20而非DHT11温度传感器,精度更高(±0.5℃)且单总线接口节省IO资源
3. 硬件设计详解
3.1 核心电路设计
电源电路:
- 输入:5V/2A Type-C接口
- 主控供电:AMS1117-3.3V LDO稳压芯片
- 传感器供电:大部分采用5V直供,部分精密传感器通过LC滤波
特别注意:DS18B20对电源噪声敏感,必须单独添加10μF去耦电容
传感器接口电路:
- 红外对射:光电耦合器隔离,防止信号干扰
- 热释电:BISS0001信号处理芯片,有效检测距离5米
- 光照传感器:GL5528光敏电阻+10KΩ分压电阻
- DS18B20:4.7KΩ上拉电阻确保单总线稳定性
3.2 PCB设计要点
-
布局策略:
- 将大电流器件(继电器、电机驱动)集中布置在PCB边缘
- 敏感模拟电路(温度、光照)远离数字电路
- 所有传感器接口添加TVS二极管防静电
-
布线技巧:
- 电机驱动线宽≥1mm(承载电流≥2A)
- 晶振走线最短化,包地处理
- 数字地与模拟地单点连接(0Ω电阻)
-
实测问题:
- 初版PCB因步进电机地线过细导致复位异常,改版后加粗到2mm
- 热释电传感器初始位置易受空调气流干扰,调整到离地1.2米高度
4. 软件实现关键
4.1 主程序逻辑架构
采用"状态机+定时中断"的混合编程模式:
c复制void main() {
hardware_init(); // 硬件初始化
while(1) {
state_machine(); // 主状态机
if(flag_10ms) { // 10ms定时中断标志
flag_10ms = 0;
sensor_read(); // 传感器采集
display_update(); // 显示刷新
}
}
}
4.2 核心算法实现
人数统计算法:
c复制void people_count() {
static uint8_t last_in, last_out;
if(IR_IN && !last_in) { // 上升沿检测
delay_ms(20); // 消抖
if(IR_IN) people_num++;
}
last_in = IR_IN;
// 出门检测同理...
if(people_num < 0) people_num = 0; // 防溢出
}
温度控制逻辑:
c复制void temp_control() {
if(people_num > 0 && temp_now > temp_set) {
FAN_ON;
fan_timer = 300; // 5分钟延时关闭(300*1s)
} else if(fan_timer > 0) {
fan_timer--;
} else {
FAN_OFF;
}
}
4.3 OLED显示优化
采用双缓冲机制避免闪烁:
- 在内存中建立128x64的显示缓存
- 定时将缓存内容通过SPI刷新到OLED
- 关键代码:
c复制void oled_refresh() {
for(uint8_t page=0; page<8; page++) {
oled_set_page(page);
for(uint8_t col=0; col<128; col++) {
oled_write_data(display_buf[page][col]);
}
}
}
5. 系统调试与优化
5.1 传感器校准方法
-
光照传感器:
- 用专业照度计测量实际lux值
- 记录ADC读数,建立查找表
- 最终采用分段线性拟合算法
-
红外对射校准:
- 调整发射管电流至10mA(实测最稳定)
- 接收端比较器阈值设为2.5V
- 测试不同距离下的波形质量
5.2 抗干扰措施
-
电源干扰:
- 步进电机单独供电
- 每个继电器线圈并联1N4148续流二极管
-
信号干扰:
- 所有长线传输采用双绞线
- 关键信号线添加RC滤波(如热释电输出)
-
软件滤波:
- 传感器数据采用滑动平均滤波
- 关键信号进行多次采样验证
5.3 实测性能数据
经过两周连续运行测试:
- 人数统计准确率:≥99.5%(50人次测试)
- 温度控制精度:±1℃
- 系统响应延迟:
- 灯光控制:<200ms
- 窗帘控制:<500ms
- 待机功耗:0.48W
6. 常见问题解决方案
6.1 红外误触发问题
现象:人数统计偶尔出现误差
解决方法:
- 调整安装位置,避免阳光直射
- 软件添加双边沿检测+消抖
- 在门口加装遮光罩
6.2 热释电灵敏度不足
现象:静止人员检测不到
优化方案:
- 改用RCWL-0516微波雷达传感器
- 调整菲涅尔透镜焦距
- 降低检测阈值(需平衡误报率)
6.3 步进电机丢步
现象:窗帘位置逐渐偏移
处理措施:
- 增加电机驱动电流(由0.8A→1.2A)
- 添加限位开关做位置校准
- 采用TMC2209静音驱动芯片
7. 项目扩展建议
-
无线功能扩展:
- 添加ESP8266实现手机APP控制
- 通过MQTT协议接入校园物联网平台
-
能源管理升级:
- 增加电流传感器监测设备功耗
- 实现分时段的节能策略
-
环境监测增强:
- 添加CO2传感器监测空气质量
- 集成PM2.5检测功能
这个项目从硬件选型到软件调试,每个环节都遇到了各种挑战。最深刻的体会是:传感器数据的可靠性决定整个系统的稳定性,前期一定要做好充分的测试验证。另外建议在PCB设计时就预留20%的备用IO口,方便后期功能扩展。