若该文为原创文章,转载请注明原文出处。

一、引言

(一)研究背景及意义

教育信息化是现代化教育发展的必然趋势,而教室作为教学活动的主要场所,其环境的智能化直接关系到教学质量和能源效率。传统教室环境管理粗放,存在光照不均、空气质量差、温湿度不适、设备管理低效等问题,不仅影响学生健康与学习效率,也造成巨大的能源浪费。智慧教室系统通过物联网技术,对环境参数进行实时监测、智能分析和自动调控,为师生创造一个健康、舒适、节能的教学环境。本项目基于STM32单片机,融合多类传感器与执行器,并接入云平台,旨在实现教室环境的精细化、自动化、远程化管理,对推动智慧校园建设、提升教育现代化水平具有重要的实践价值。

(二)国内外研究现状

目前,智慧教室的研究多集中于多媒体教学设备和网络互联,而对物理环境(光、空气、热)的智能闭环控制关注不足。现有方案多为独立系统(如单独的空调节能器或灯光控制器),未能实现环境多参数的协同感知与联动控制。将舒适度监测(温湿度、光照、空气质量)、人员活动感知设备集控通过一个低成本主控深度融合,并赋予远程管理能力,是当前智慧教室发展的新方向。本设计旨在提供一个高度集成、稳定可靠的一体化解决方案。

二、系统总体设计

(一)系统架构

本系统采用“感知-决策-执行-云控”的四层架构。

  • 感知层:由DHT11、BH1750、SGP30、HC-SR501等传感器构成,全面采集教室环境与人员状态数据。

  • 决策层:STM32主控制器作为本地大脑,运行核心控制算法,根据环境数据、人员状态和预设模式,做出智能决策。

  • 执行层:通过多路继电器控制灯光、风扇、空调、新风系统、投影仪等设备的电源,实现精准执行。

  • 云控层:基于ESP8266 Wi-Fi模块与云平台连接,实现环境数据可视化、历史数据查询、远程设备控制和报警信息推送。

(二)功能模块划分

  1. 环境监测模块:DHT11(温湿度) + BH1750(光照) + SGP30(空气质量)。

  2. 人员感知模块:HC-SR501人体红外传感器。

  3. 设备控制模块:多路继电器(灯光、空调、风扇、投影仪、新风系统)。

  4. 人机交互模块:OLED显示屏 + 按键。

  5. 数据通信模块:ESP8266 Wi-Fi模块。

  6. 主控模块: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总线,接 PB6PB7

  • 按键 x 4:模式切换(上课/下课/自习)、设置、加、减 接至 PA1PA2PA3PA4

  • ESP-01S (ESP8266):接USART2 PA2(TX), PA3(RX)

(二)主控模块选型及介绍

主控芯片选用STM32F103C8T6。其资源丰富:

  • I2C接口:可同时挂载BH1750、SGP30和OLED三个I2C设备,极大节省IO资源。

  • 多路GPIO:用于连接数字传感器、控制继电器和按键。

  • UART接口:用于与Wi-Fi模块通信。

  • 处理能力:足以运行多路数据采集和复杂的控制逻辑。

(三)传感器模块选型及电路设计

  1. DHT11:数字温湿度传感器,用于基本环境监测。

  2. BH1750:数字环境光强度传感器,直接输出光照度值(lux),精度远高于光敏电阻。建议安装两个:一个监测桌面区域光照,一个监测黑板区域光照,以实现分区调光。

  3. SGP30:内置MCU的金属氧化物气体传感器,直接输出CO₂浓度(eCO2) 和TVOC(总挥发性有机物) 值,精度和稳定性远优于GP2Y1010AU0F+MQ135方案,且无需复杂的模拟电路和换算公式。

  4. 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);
    }
}

五、系统测试与优化

(一)测试方案

  1. 功能测试

    • 环境联动测试:改变光照、吹气提高CO2浓度、用打火机模拟TVOC,测试灯光、新风是否按预期动作。

    • 模式测试:切换不同模式,测试控制策略是否正确切换。

    • 人体感应测试:在教室走动和离开,测试系统能否正确进入和退出节能模式。

    • 远程控制测试:通过云平台后台或App测试远程模式切换和设备控制。

  2. 可靠性测试

    • 网络稳定性测试:模拟Wi-Fi中断,测试系统能否正常工作,并在网络恢复后重连和数据重传。

    • 压力测试:模拟传感器数据频繁变化,测试控制逻辑是否稳定,设备是否会频繁启停。

(二)测试结果与分析

预计测试中,传感器数据的准确性与抗干扰性是重点。SGP30需要定期手动校准(在空气良好的环境下调用sgp_execute_baseline())以保证长期准确性。人体感应的覆盖范围和无死角也需要仔细调整安装位置。

(三)系统优化

  1. 算法优化

    • 迟滞比较:为所有控制逻辑(如温度、光照)增加迟滞区间,防止设备在阈值附近频繁开关。

    • 数据滤波:对传感器数据进行滑动平均滤波,减少偶然误差。

  2. 功能增强

    • PWM调光:将继电器控制灯光升级为PWM控制LED驱动电源,实现无级调光,体验更舒适。

    • 情景记忆:保存不同老师偏好的环境参数(如亮度、温度),并支持一键调用。

    • 定时任务:增加RTC模块,支持按课程表自动切换模式。

六、结论与展望

(一)未来展望

  1. AIoT赋能:在云端引入机器学习算法,分析历史数据,预测最佳环境参数,实现从“自动化”到“智能化”的演进。

  2. 视频融合:接入摄像头,利用AI图像识别技术统计教室人数、分析学生专注度,为教学评估提供数据支持。

  3. 能源管理:与校园能源管理系统对接,统计各教室能耗,为节能降耗提供精准数据支撑。

  4. 统一平台:与学校的教务系统、一卡通系统打通,实现“上课铃响,模式自动切换;刷卡开门,空调提前开启”的深度联动。

如有侵权,或需要完整代码,请及时联系博主。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐