基于STM32的智慧教室系统设计
本文介绍了一种基于STM32单片机的智慧教室环境控制系统设计。系统采用四层架构(感知-决策-执行-云控),集成温湿度、光照、空气质量等传感器,通过继电器控制教室设备,并接入云平台实现远程管理。硬件选用STM32F103C8T6为主控,搭配DHT11、BH1750、SGP30等传感器模块;软件采用Keil开发,实现环境数据采集、智能决策和设备控制功能。系统具备上课/自习/节能三种模式,能根据人员状态
若该文为原创文章,转载请注明原文出处。
一、引言
(一)研究背景及意义
教育信息化是现代化教育发展的必然趋势,而教室作为教学活动的主要场所,其环境的智能化直接关系到教学质量和能源效率。传统教室环境管理粗放,存在光照不均、空气质量差、温湿度不适、设备管理低效等问题,不仅影响学生健康与学习效率,也造成巨大的能源浪费。智慧教室系统通过物联网技术,对环境参数进行实时监测、智能分析和自动调控,为师生创造一个健康、舒适、节能的教学环境。本项目基于STM32单片机,融合多类传感器与执行器,并接入云平台,旨在实现教室环境的精细化、自动化、远程化管理,对推动智慧校园建设、提升教育现代化水平具有重要的实践价值。
(二)国内外研究现状
目前,智慧教室的研究多集中于多媒体教学设备和网络互联,而对物理环境(光、空气、热)的智能闭环控制关注不足。现有方案多为独立系统(如单独的空调节能器或灯光控制器),未能实现环境多参数的协同感知与联动控制。将舒适度监测(温湿度、光照、空气质量)、人员活动感知与设备集控通过一个低成本主控深度融合,并赋予远程管理能力,是当前智慧教室发展的新方向。本设计旨在提供一个高度集成、稳定可靠的一体化解决方案。
二、系统总体设计
(一)系统架构
本系统采用“感知-决策-执行-云控”的四层架构。
-
感知层:由DHT11、BH1750、SGP30、HC-SR501等传感器构成,全面采集教室环境与人员状态数据。
-
决策层:STM32主控制器作为本地大脑,运行核心控制算法,根据环境数据、人员状态和预设模式,做出智能决策。
-
执行层:通过多路继电器控制灯光、风扇、空调、新风系统、投影仪等设备的电源,实现精准执行。
-
云控层:基于ESP8266 Wi-Fi模块与云平台连接,实现环境数据可视化、历史数据查询、远程设备控制和报警信息推送。
(二)功能模块划分
-
环境监测模块:DHT11(温湿度) + BH1750(光照) + SGP30(空气质量)。
-
人员感知模块:HC-SR501人体红外传感器。
-
设备控制模块:多路继电器(灯光、空调、风扇、投影仪、新风系统)。
-
人机交互模块:OLED显示屏 + 按键。
-
数据通信模块:ESP8266 Wi-Fi模块。
-
主控模块:STM32单片机。
三、硬件设计与实现
(一)系统硬件框架图
-
STM32F103C8T6 (主控核心)
-
DHT11温湿度传感器:数据线接
PC15
-
BH1750光照传感器 (I2C):SCL接
PB6
, SDA接PB7
-
SGP30空气质量传感器 (I2C):与BH1750共享I2C总线(地址不同)
-
HC-SR501人体红外传感器:输出接
PA0
-
继电器模块 x 5:接
PC0
(主灯),PC1
(空调),PC2
(风扇),PC3
(投影仪),PC4
(新风系统) -
OLED (SSD1306) (I2C):共享I2C总线,接
PB6
,PB7
-
按键 x 4:模式切换(上课/下课/自习)、设置、加、减 接至
PA1
,PA2
,PA3
,PA4
-
ESP-01S (ESP8266):接USART2
PA2
(TX),PA3
(RX)
(二)主控模块选型及介绍
主控芯片选用STM32F103C8T6。其资源丰富:
-
I2C接口:可同时挂载BH1750、SGP30和OLED三个I2C设备,极大节省IO资源。
-
多路GPIO:用于连接数字传感器、控制继电器和按键。
-
UART接口:用于与Wi-Fi模块通信。
-
处理能力:足以运行多路数据采集和复杂的控制逻辑。
(三)传感器模块选型及电路设计
-
DHT11:数字温湿度传感器,用于基本环境监测。
-
BH1750:数字环境光强度传感器,直接输出光照度值(lux),精度远高于光敏电阻。建议安装两个:一个监测桌面区域光照,一个监测黑板区域光照,以实现分区调光。
-
SGP30:内置MCU的金属氧化物气体传感器,直接输出CO₂浓度(eCO2) 和TVOC(总挥发性有机物) 值,精度和稳定性远优于GP2Y1010AU0F+MQ135方案,且无需复杂的模拟电路和换算公式。
-
HC-SR501:热释电红外传感器,检测人体移动。安装于教室后方,覆盖范围广,用于判断教室整体是否有人。
(四)通信模块选型及配置
选用ESP-01S模块。配置其连接校园Wi-Fi,并通过MQTT协议与云平台(如ThingsBoard、阿里云IoT、EMQX)通信。MQTT的轻量级和发布/订阅模式非常适合本系统的状态上报和远程指令接收。
(五)执行模块选型及驱动电路
(核心:强电控制,安全第一!)
-
继电器模块:用于控制教室各种220VAC设备的电源通断。
-
重要警告:继电器输出端连接220V强电,必须与STM32的3.3V弱电电路物理隔离。建议选用带光耦隔离的继电器模块,接线需规范,使用绝缘端子,并加装防护罩。
-
控制对象:
-
主灯继电器:控制教室主照明线路。
-
空调继电器:控制空调插座电源。
-
风扇/新风继电器:控制吊扇或新风系统电源。
-
投影仪继电器:控制投影仪电源。
-
(可选)窗帘电机继电器:控制电动窗帘的开合。
-
-
四、软件设计与实现
(一)开发环境搭建
-
IDE: Keil uVision5
-
库: STM32HAL库 + SGP30驱动 + BH1750驱动
-
协议: cJSON库(用于MQTT数据打包)
(二)系统软件流程图
(三)系统初始化
// main.c
#include "dht11.h"
#include "bh1750.h"
#include "sgp30.h"
#include "ssd1306.h"
#include "esp8266_mqtt.h"
I2C_HandleTypeDef hi2c1;
UART_HandleTypeDef huart2; // For ESP8266
// 全局变量与枚举
typedef enum { MODE_CLASS, MODE_BREAK, MODE_SELF_STUDY } ClassMode;
ClassMode current_mode = MODE_BREAK;
int is_occupied = 0;
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_I2C1_Init();
MX_USART2_UART_Init();
OLED_Init();
BH1750_Init();
SGP30_Init();
DHT11_Init();
ESP8266_MQTT_Init();
while (1) {
Main_Task();
HAL_Delay(3000); // 主循环周期3秒
}
}
(四)传感器数据采集与处理
void Sensor_ReadTask(void) {
// 1. 读取温湿度
DHT11_Read(&temperature, &humidity);
// 2. 读取光照度 (取两个传感器的平均值或分别处理)
light_desk = BH1750_ReadLightLevel();
// light_blackboard = BH1750_ReadLightLevel_2(); // 假设有第二个传感器
// 3. 读取空气质量
SGP30_ReadIAQ(&eCO2, &TVOC);
// 4. 判断人员存在
// HC-SR501在检测到移动时输出高电平,并持续一段时间
is_occupied = (HAL_GPIO_ReadPin(PIR_GPIO_Port, PIR_Pin) == GPIO_PIN_SET);
}
(五)控制功能实现
void Smart_Control_Task(void) {
// 节能模式优先:如果无人,则关闭所有设备
if (!is_occupied) {
Enter_Energy_Saving_Mode();
return;
}
// 有人状态下,根据当前模式进行智能控制
switch (current_mode) {
case MODE_CLASS:
// 上课模式:保证教学环境最佳
// 光照控制 (以黑板区域为主)
if (light_blackboard < LIGHT_THRESHOLD_CLASS) {
HAL_GPIO_WritePin(LIGHT_RELAY_GPIO_Port, LIGHT_RELAY_Pin, GPIO_PIN_SET);
} else {
HAL_GPIO_WritePin(LIGHT_RELAY_GPIO_Port, LIGHT_RELAY_Pin, GPIO_PIN_RESET);
}
// 空气质量控制
if (eCO2 > CO2_THRESHOLD || TVOC > TVOC_THRESHOLD) {
HAL_GPIO_WritePin(FAN_RELAY_GPIO_Port, FAN_RELAY_Pin, GPIO_PIN_SET); // 开启新风/风扇
} else {
HAL_GPIO_WritePin(FAN_RELAY_GPIO_Port, FAN_RELAY_Pin, GPIO_PIN_RESET);
}
// 温度控制
if (temperature > TEMP_HIGH_THRESHOLD) {
HAL_GPIO_WritePin(AC_RELAY_GPIO_Port, AC_RELAY_Pin, GPIO_PIN_SET); // 开启空调制冷
} else if (temperature < TEMP_LOW_THRESHOLD) {
// 如果是冷暖空调,则开启制热
} else {
HAL_GPIO_WritePin(AC_RELAY_GPIO_Port, AC_RELAY_Pin, GPIO_PIN_RESET);
}
// 自动打开投影仪
HAL_GPIO_WritePin(PROJ_RELAY_GPIO_Port, PROJ_RELAY_Pin, GPIO_PIN_SET);
break;
case MODE_SELF_STUDY:
// 自习模式:柔和灯光,安静环境
// 使用桌面光照数据,维持一个适中的亮度
Control_Light_Dimming(light_desk); // 需要PWM调光功能
// 关闭投影仪
HAL_GPIO_WritePin(PROJ_RELAY_GPIO_Port, PROJ_RELAY_Pin, GPIO_PIN_RESET);
// 温湿度、空气质量控制策略与上课模式类似,阈值可不同
break;
case MODE_BREAK:
// 下课模式:延时一段时间后,进入节能模式
break;
}
}
void Enter_Energy_Saving_Mode() {
HAL_GPIO_WritePin(LIGHT_RELAY_GPIO_Port, LIGHT_RELAY_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(PROJ_RELAY_GPIO_Port, PROJ_RELAY_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(FAN_RELAY_GPIO_Port, FAN_RELAY_Pin, GPIO_PIN_RESET);
// 空调可延时关闭,避免频繁启停
}
(六)远程通信功能实现
// 数据上传函数
void Cloud_UploadData(void) {
cJSON *root = cJSON_CreateObject();
cJSON_AddNumberToObject(root, "temp", temperature);
cJSON_AddNumberToObject(root, "humi", humidity);
cJSON_AddNumberToObject(root, "light_desk", light_desk);
cJSON_AddNumberToObject(root, "light_blackboard", light_blackboard);
cJSON_AddNumberToObject(root, "eco2", eCO2);
cJSON_AddNumberToObject(root, "tvoc", TVOC);
cJSON_AddStringToObject(root, "occupancy", is_occupied ? "yes" : "no");
cJSON_AddStringToObject(root, "mode", GetModeString(current_mode));
char *json_str = cJSON_Print(root);
ESP8266_MQTT_Publish("classroom/status", json_str);
cJSON_Delete(root);
free(json_str);
}
// 指令接收解析 (MQTT回调函数)
void MQTT_Callback(char* topic, char* payload) {
cJSON *root = cJSON_Parse(payload);
if (root) {
cJSON *cmd = cJSON_GetObjectItem(root, "command");
if (cmd) {
if (strcmp(cmd->valuestring, "set_mode") == 0) {
cJSON *mode_val = cJSON_GetObjectItem(root, "value");
if (strcmp(mode_val->valuestring, "class") == 0) current_mode = MODE_CLASS;
else if (strcmp(mode_val->valuestring, "break") == 0) current_mode = MODE_BREAK;
// ...
} else if (strcmp(cmd->valuestring, "control_device") == 0) {
cJSON *device = cJSON_GetObjectItem(root, "device");
cJSON *action = cJSON_GetObjectItem(root, "action");
// 远程手动控制特定设备,如 "device":"projector", "action":"on"
}
}
cJSON_Delete(root);
}
}
五、系统测试与优化
(一)测试方案
-
功能测试:
-
环境联动测试:改变光照、吹气提高CO2浓度、用打火机模拟TVOC,测试灯光、新风是否按预期动作。
-
模式测试:切换不同模式,测试控制策略是否正确切换。
-
人体感应测试:在教室走动和离开,测试系统能否正确进入和退出节能模式。
-
远程控制测试:通过云平台后台或App测试远程模式切换和设备控制。
-
-
可靠性测试:
-
网络稳定性测试:模拟Wi-Fi中断,测试系统能否正常工作,并在网络恢复后重连和数据重传。
-
压力测试:模拟传感器数据频繁变化,测试控制逻辑是否稳定,设备是否会频繁启停。
-
(二)测试结果与分析
预计测试中,传感器数据的准确性与抗干扰性是重点。SGP30需要定期手动校准(在空气良好的环境下调用sgp_execute_baseline()
)以保证长期准确性。人体感应的覆盖范围和无死角也需要仔细调整安装位置。
(三)系统优化
-
算法优化:
-
迟滞比较:为所有控制逻辑(如温度、光照)增加迟滞区间,防止设备在阈值附近频繁开关。
-
数据滤波:对传感器数据进行滑动平均滤波,减少偶然误差。
-
-
功能增强:
-
PWM调光:将继电器控制灯光升级为PWM控制LED驱动电源,实现无级调光,体验更舒适。
-
情景记忆:保存不同老师偏好的环境参数(如亮度、温度),并支持一键调用。
-
定时任务:增加RTC模块,支持按课程表自动切换模式。
-
六、结论与展望
(一)未来展望
-
AIoT赋能:在云端引入机器学习算法,分析历史数据,预测最佳环境参数,实现从“自动化”到“智能化”的演进。
-
视频融合:接入摄像头,利用AI图像识别技术统计教室人数、分析学生专注度,为教学评估提供数据支持。
-
能源管理:与校园能源管理系统对接,统计各教室能耗,为节能降耗提供精准数据支撑。
-
统一平台:与学校的教务系统、一卡通系统打通,实现“上课铃响,模式自动切换;刷卡开门,空调提前开启”的深度联动。
如有侵权,或需要完整代码,请及时联系博主。
更多推荐
所有评论(0)