• 方案介绍
  • 相关推荐
申请入驻 产业图谱

基于单片机与WiFi通信的教室人数与照明上位机监控系统设计

01/09 21:32
252
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

1 基于单片机与WiFi通信的教室人数与照明上位机监控系统设计

点击链接下载protues仿真设计资料:https://download.csdn.net/download/m0_51061483/91964733

1.1 设计背景与意义

在高校、中小学以及培训机构等教学楼场景中,教室照明属于长期、高频使用的公共能耗项目。传统教室照明管理通常采用人工开关控制或简单的定时开关方式,存在明显不足:
1)能源浪费严重:在白天自然光充足时仍然开灯,或教室空闲时灯光未及时关闭。
2)管理效率低:教学楼教室数量多,管理人员无法实时掌握每间教室的照明状态,只能依靠巡检。
3)缺乏数据支撑:无法获得教室实时人数信息与照明使用数据,导致管理决策缺乏依据。
4)安全与维护困难:灯具故障、线路异常或照明异常开启无法及时反馈。

随着物联网与智能楼宇技术发展,将“环境感知 + 远程控制 + 数据采集 + 集中管理”应用到教学楼照明管理成为趋势。通过单片机作为下位机控制核心,结合WiFi通信模块实现上位机与多间教室之间的双向通信,可以构建一套教室人数与照明监控系统

  • 下位机采集光照度与人数信息,自动控制灯具开关并上传状态。
  • 上位机实时显示每间教室编号、人数、光照度与灯具状态,并支持远程控制全楼或单间教室照明。
  • 通过智能策略实现节能管理,减少浪费,提升公共建筑能效水平。

该系统既适用于课程设计、毕业设计,也具有很强的工程应用价值,可进一步扩展为智慧校园中的“教室占用率分析”“能耗统计”“智慧排课”“设备状态管理”等综合系统。


1.2 系统总体目标与设计要求

本系统以“多教室集中监控、自动节能控制、WiFi双向通信、上位机可视化管理”为总体目标,提出以下设计要求:
1)光照度检测:实时采集教室内亮度数据,作为自动开关灯与分区控制依据。
2)人数检测:实现教室人数实时统计,并周期上传到上位机,用于管理与分析。
3)上位机监控:界面可同时显示多教室数据,包括教室编号、人数、光照度、分区灯状态、通信状态等。
4)上位机控制:可对全部教室或指定教室进行照明控制,支持开/关/分区开关。
5)下位机控制:具备按键人工控制、自动控制模式切换、照明执行器驱动、数据采集与上传功能。
6)无线通信:WiFi模块实现双向数据传输,采用协议帧确保可靠性与实时性。
7)节能策略:根据自然光与人数分布动态控制灯具,达到节能管理目的。
8)可靠性:考虑网络丢包、数据误差、传感器波动、误计数等问题,采用滤波、回差、锁存等策略保证稳定运行。


2 系统功能设计

2.1 光照度与人数检测功能设计

2.1.1 光照度检测功能

光照度检测用于判断教室环境亮度是否足以满足教学需求,并作为自动照明控制的关键依据。系统应具备以下能力:
1)采集环境亮度:能够得到光照强度值(ADC数值或Lux值)。
2)稳定可靠:避免灯光开关导致的光照波动产生频繁抖动开关。
3)分区控制依据:根据教室不同区域亮度差异,可选择分区亮度检测(如靠窗区、中央区、靠门区)。

光照传感器实现方案:

  • 光敏电阻(LDR) + 分压:成本低,适合教学;输出模拟电压需ADC采样。
  • BH1750数字光照传感器:直接输出Lux,精度高,抗干扰好,使用I2C通信。

建议方案:

  • 若系统以51为主控且追求简化,可选LDR + ADC。
  • 若系统面向工程化,建议使用BH1750获取Lux值,提高一致性与标定便利性。

光照控制策略(核心思想为“回差 + 延时确认”):

  • 当光照 < 下限阈值 L_low 且持续N秒 → 开灯(或开部分灯)。
  • 当光照 > 上限阈值 L_high 且持续N秒 → 关灯(或关部分灯)。
    其中 L_high > L_low,形成回差,避免频繁切换。

2.1.2 人数检测功能

人数检测用于统计教室占用情况,是智能管理的重要数据来源。人数检测可用于:

  • 决定是否需要开启照明:无人时可关闭灯具或保持最低照度。
  • 形成教室利用率统计:辅助排课与资源优化。
  • 安全管理:异常人数变化或夜间占用可触发提示。

常见人数检测方案:
1)红外对射/反射计数(门口):

  • 门口安装双红外对射传感器,利用先后遮挡判断进/出方向,实现人数加减计数。
  • 成本低、实现简单,适合教学。
    2)热释电人体感应(PIR):
  • 只能检测有人/无人,不能精确计数。
  • 适合“占用检测”,不适合精确人数统计。
    3)超声波/毫米波
  • 可检测存在与运动,部分可估计人数,但复杂度高。
    4)摄像头AI识别:
  • 精度高但隐私与成本高,不适合基础单片机设计。

本设计“人数实时统计”更符合红外计数方案:

  • 使用两路红外对射(A、B)间隔一定距离。
  • 方向判定逻辑:
    • A先遮挡后B遮挡 → 进入人数+1
    • B先遮挡后A遮挡 → 离开人数-1
  • 设置超时与异常序列处理,避免错误计数。

人数统计应具备:

  • 最小人数为0,防止出现负数。
  • 定期上报人数值至上位机。
  • 可通过上位机或按键进行“人数清零/校准”(扩展功能)。

2.2 上位机控制与监测功能设计

2.2.1 上位机界面显示功能

上位机软件应具备直观、可扩展的数据展示能力,建议界面元素如下:
1)教室列表:显示所有教室编号(如101、102、103…)。
2)实时人数:显示每间教室当前人数。
3)光照度:显示光照值或等级(亮/中/暗)。
4)灯具状态:显示各分区灯状态(如窗边区、讲台区、后排区)。
5)通信状态:显示在线/离线、最后更新时间、信号强度(扩展)。
6)控制区域:全开、全关、分区控制按钮,单教室控制按钮。
7)日志区域:记录控制操作、报警、通信异常、人数变化等事件。

显示方式建议:

  • 使用表格形式呈现:一行对应一间教室,一列对应一个指标。
  • 颜色标识:如离线为灰色、报警为红色、无人为空置标记为蓝色等(UI层实现)。

2.2.2 上位机远程控制功能

上位机需要支持两类控制:
1)全局控制:对全部教室执行同一操作,如全部开灯、全部关灯、进入节能模式。
2)单教室控制:对指定教室编号发送控制命令。

控制内容包括:

  • 开灯 / 关灯
  • 分区控制:例如只开启讲台区或靠窗区
  • 模式控制:自动模式 / 手动模式 / 强制关闭模式
  • 阈值设置:调整教室光照阈值(扩展)

上位机控制应确保:

  • 指令具备确认机制:发送后下位机应反馈执行结果与最新状态。
  • 失败重发机制:若超时未收到反馈,可重发或提示“教室离线”。
  • 权限控制(扩展):防止非授权用户操作。

2.3 下位机(单片机)控制功能设计

2.3.1 按键控制电路与人工控制逻辑

下位机需配备按键,实现人工开关灯与模式切换,原因包括:

  • 网络断开时仍能本地控制照明。
  • 便于维护人员现场调试与应急操作。

按键功能建议:
1)MODE:切换自动/手动模式。
2)L1/L2/L3:分区灯开关(手动模式下有效)。
3)RESET:人数清零或故障复位(可选)。

按键消抖必须实现,建议采用10ms扫描与状态锁定。按键优先级建议:

  • 人工强制关灯 > 自动开灯
  • 报警或安全策略 > 人工开灯(若扩展电源保护)

2.3.2 自动照明控制策略

自动照明控制核心为“依据光照与人数动态控制灯具”。系统应考虑以下场景:
1)无人:

  • 若人数=0,灯具全部关闭或保持最小照明(可选)。
  • 若人数长期为0,可进入节能待机模式。
    2)有人且光照不足:
  • 开启必要区域照明。
  • 若靠窗区亮度足够,可只开启中央区/后排区。
    3)有人且光照充足:
  • 关闭部分或全部灯具,利用自然光节能。

分区控制的节能优势:

  • 白天靠窗区域通常亮度较高,可关闭靠窗区灯具,仅开启后排或中央区域。
  • 晚上整体光照低,需开启全部区域灯具。

控制策略可分级:

  • 光照很暗:全开
  • 光照一般:开2个区域
  • 光照较亮:开1个区域
  • 光照很亮:全关
    并结合人数数量进行加权,例如人数较多时提高照度要求。

2.3.3 数据采集与上传功能

下位机应周期性采集并上传以下数据:

  • 教室编号ID
  • 人数count
  • 光照light
  • 灯具状态L1/L2/L3
  • 模式状态AUTO/MANUAL
  • 故障标志(如传感器异常、计数异常)

上传策略:

  • 周期上传:每1秒或2秒发送一次状态帧。
  • 事件触发上传:人数变化、灯状态变化、报警发生时立即上传一次,提高实时性。
  • 心跳机制:若无事件也定时发送,便于上位机判断在线状态。

2.4 无线通信功能设计(WiFi双向通信)

2.4.1 WiFi模块选型与通信模式

常用WiFi模块:ESP8266、ESP32等。对于本系统:

  • ESP8266性价比高、资料丰富,适合与51单片机配合。
  • ESP32功能更强,可直接作为主控,但本题强调“单片机+WiFi通信”,可作为下位机通信模块。

通信模式可选择:
1)TCP客户端模式:下位机连接上位机服务器,可靠性高,适合状态监控。
2)UDP广播/组播:实时性高,但丢包可能导致数据缺失,需应用层补偿。
3)MQTT协议:适合物联网集中管理,但需要Broker,复杂度较高。

推荐方案:TCP通信:

  • 上位机作为TCP服务器监听端口。
  • 各教室下位机作为TCP客户端连接服务器。
  • 数据帧采用应用层协议,支持命令下发与状态上报。

2.4.2 通信协议设计

为保证可靠性与可解析性,建议设计帧格式(ASCII文本协议,便于调试):

  • 上报帧:
    #ID=101,PEO=25,LUX=320,L1=1,L2=1,L3=0,MODE=A*
  • 控制帧:
    @ID=101,CMD=SET,L1=1,L2=0,L3=0*
  • 模式切换:
    @ID=101,CMD=MODE,VAL=A*
  • 上位机查询:
    @ID=101,CMD=GET*

协议设计要点:
1)帧头:#表示下位机上报,@表示上位机命令。
2)帧尾:*表示结束,避免粘包解析困难。
3)字段键值对:便于扩展新增参数。
4)校验(可选):可加入简单异或校验或CRC,提高抗干扰。
5)应答机制:下位机执行命令后返回ACK帧:
#ID=101,ACK=OK*#ID=101,ACK=ERR*


2.5 节能与管理优势分析

系统节能与管理优势主要体现在:
1)按需照明:基于光照度自动控制,避免白天自然光充足仍开灯。
2)占用联动:无人自动关灯,减少空置照明浪费。
3)分区调节:根据光照分布与人数情况动态开启部分灯具,实现精细化节能。
4)集中管理:上位机可统一管理多间教室,不必人工逐间巡检。
5)数据可视化:人数与灯具使用数据可用于教室利用率统计、节能评估、管理决策。
6)维护便利:通过通信与日志可快速定位异常教室,提高运维效率。

从长期使用来看,该系统能够显著降低教学楼照明能耗,提高管理效率,并为智慧校园提供基础数据支撑。


3 系统电路设计

3.1 硬件总体结构

系统硬件由“下位机控制板 + WiFi通信 + 传感器 + 灯具驱动 + 上位机”组成。下位机主要模块如下:
1)单片机最小系统模块
2)光照度检测模块
3)人数检测模块(红外对射双通道
4)按键与指示模块
5)灯具驱动模块(继电器/固态继电器/可控硅方案)
6)WiFi通信模块(ESP8266)
7)电源模块(5V/3.3V稳压)
8)安全隔离与抗干扰模块

上位机为电脑软件,通过WiFi路由器/局域网与多下位机通信。


3.2 单片机最小系统模块

单片机可选用STC89C52或STC15系列:

  • STC89C52经典易用,资源足够实现采样、控制与串口通信
  • STC15自带ADC与多串口,开发更便利,适合工程优化。

最小系统包括:
1)晶振电路(11.0592MHz/12MHz)
2)复位电路(上电复位+按键复位)
3)去耦电容(0.1uF贴近芯片供电脚)
4)串口接口(与ESP8266通信)
5)IO口分配:红外对射输入、按键输入、继电器控制输出、LCD或指示灯输出等


3.3 光照度检测模块电路设计

3.3.1 光敏电阻方案

光敏电阻与固定电阻构成分压电路,输出模拟电压送入ADC采样:

  • 光强越大,光敏电阻阻值越小,分压点电压变化可反映光照变化。
  • 需要ADC采样模块:

电路设计要点:
1)电阻选值:使亮/暗状态的分压电压范围尽量覆盖ADC输入范围,提高分辨率。
2)滤波:分压输出加0.1uF电容可减小高频噪声
3)标定:不同光敏电阻一致性差,需要软件阈值校准。

3.3.2 BH1750方案

BH1750通过I2C输出Lux值:

  • 精度高、稳定性好
  • 标定简单
  • 抗干扰更强
    但对51而言需要软件I2C或硬件I2C资源,开发复杂度略高。

3.4 人数检测模块电路设计

采用“双红外对射”方案:
1)红外发射管持续发射红外光。
2)接收管输出电平信号(有遮挡时电平变化)。
3)两组对射安装在门口,形成A/B两通道。

电路实现方式:

抗干扰设计要点:
1)对射位置固定,防止误遮挡。
2)软件加入去抖与超时判断,过滤异常遮挡序列。
3)若门口通行密集,可提升算法(例如队列检测),但课程设计一般可满足单人通过计数。


3.5 按键控制模块电路设计

按键采用独立按键方式:

  • 一端接GND,另一端接IO口并上拉。
  • 按下为低电平。
    按键建议:MODE、L1、L2、L3、RESET(可选)。
    软件消抖为主,必要时可加RC硬件消抖提升可靠性。

3.6 灯具驱动模块电路设计

教室照明通常为220VAC灯具,单片机必须通过隔离驱动
1)继电器驱动:

  • 适合开关控制,隔离好,成本低。
  • 继电器线圈由三极管驱动,线圈加续流二极管
    2)固态继电器(SSR):
  • 无触点寿命长,适合频繁动作,噪声小。
  • 成本略高。
    3)可控硅调光(扩展):
  • 可实现亮度调节,但需要过零检测与相位控制,复杂度高。

本系统以开/关控制为主,推荐继电器或SSR。分区灯具可采用3路输出:

  • L1:靠窗区
  • L2:中央区
  • L3:靠门/后排区

安全要点:


3.7 WiFi通信模块电路设计(ESP8266)

ESP8266与单片机通过串口通信:

  • ESP8266工作电压为3.3V,必须使用3.3V稳压供电。
  • 单片机TX输出为5V电平,需要电平转换或分压进入ESP8266 RX。
  • ESP8266 TX输出3.3V一般可被51识别为高电平(通常可行),但建议确认阈值或加电平转换。

电路设计要点:
1)电源稳定:ESP8266瞬时电流较大,需加100uF电解+0.1uF陶瓷电容
2)串口波特率:常用9600或115200。
3)复位与使能:RST/EN脚需正确上拉,保证模块稳定启动。


3.8 电源模块设计

系统至少需要两路电压:

  • 5V:单片机、继电器线圈(视继电器而定)、部分传感器
  • 3.3V:ESP8266、BH1750、部分数字传感器

电源设计建议:
1)使用AC-DC模块或适配器供电(实际工程),仿真可直接使用DC电源。
2)使用AMS1117-3.3或DC-DC降压输出3.3V。
3)继电器供电与单片机供电尽量隔离,至少在电源线上加大电容缓冲。
4)增加TVS、保险丝等保护(扩展)。


4 系统程序设计

4.1 软件总体架构

系统软件采用“分层驱动 + 任务调度 + 状态机”结构,核心原则是:

  • 采集任务与控制任务分离
  • 自动模式与手动模式状态明确
  • 通信收发异步处理
  • 关键事件(人数变化、通信指令)优先响应

软件模块划分:
1)初始化模块(时钟、串口、IO、LCD/指示灯)
2)传感器采集模块(光照、红外计数)
3)人数计数算法模块(进出方向判定)
4)照明控制模块(自动控制策略、分区开关)
5)按键扫描模块(消抖、模式切换、手动控制)
6)WiFi通信模块(协议解析、状态上报、指令执行)
7)显示/指示模块(本地状态显示可选)
8)异常处理模块(离线策略、传感器故障处理)

调度建议:

  • 10ms:按键消抖、红外信号状态机
  • 100ms:光照采样滤波、自动控制判断
  • 1s:状态上报、心跳发送、上位机数据刷新

4.2 光照度采集与滤波模块程序设计

若使用ADC读取光敏电阻:
1)定时采集ADC值。
2)滑动平均滤波:采样N次求平均。
3)与阈值比较,得出亮度等级。

若使用BH1750:
1)I2C读取Lux值。
2)对Lux值进行简单滤波(如递推滤波)。

滤波意义:

  • 减少灯光开关瞬间引起的光照突变导致频繁开关。
  • 使系统行为更稳定,更符合实际照明控制需求。

4.3 人数统计模块程序设计(双红外方向判定)

人数统计关键在于正确识别“进”和“出”。
基本逻辑:
1)两路红外传感器A、B。
2)当检测到遮挡序列:

  • A先触发再B触发:进门(人数+1)
  • B先触发再A触发:出门(人数-1)

为提高可靠性,需要加入:

  • 超时机制:若A触发后长时间未触发B,则判定无效并复位状态。
  • 防抖:对每个传感器触发增加最小间隔过滤,避免同一次遮挡多次触发。
  • 下限限制:人数最小为0。
  • 并发情况处理:若多人同时通过,可能出现误差,可在设计说明中给出限制条件并提出扩展方案。

4.4 自动照明控制模块程序设计

自动控制输入:

  • 人数count
  • 光照light
  • 当前灯状态L1/L2/L3

输出:

  • 灯具开关控制

控制策略示例:
1)count == 0:全部关闭。
2)count > 0:

  • light < 阈值1:全开
  • 阈值1 ≤ light < 阈值2:开2路
  • 阈值2 ≤ light < 阈值3:开1路(优先后排或中央)
  • light ≥ 阈值3:全关

同时加入回差与延时:

  • 每次模式切换需满足条件持续500ms~2s才执行,避免频繁变化。
  • 灯具切换后最短保持时间(例如10s)再允许改变,防止“闪灯”。

4.5 按键控制模块程序设计

按键扫描采用10ms周期:

  • 计数消抖(连续检测低电平3次确认按下)
  • 按键锁定(松手才允许再次触发)

模式逻辑:

  • 自动模式:灯具状态由自动控制模块决定,按键仅用于切换模式与紧急全关/全开。
  • 手动模式:按键直接控制分区灯开关,上位机控制仍可覆盖(可设计优先级)。

建议优先级设计:

  • 本地紧急全关 > 上位机控制 > 自动控制
    这种策略可以保证现场安全与管理权限。

4.6 WiFi通信模块程序设计(串口协议解析)

通信模块包括两部分:
1)接收:从ESP8266接收上位机命令帧,解析后执行控制动作。
2)发送:周期发送状态帧,事件触发即时发送。

关键点:

  • 串口接收缓冲:必须使用循环缓冲或帧拼接,避免粘包导致解析错误。
  • 帧头帧尾识别:以@*为边界解析。
  • 命令执行反馈:执行后发送ACK或带状态的上报帧。
  • 超时机制:若长时间无上位机心跳,可提示离线并进入本地自动策略。

4.7 上位机软件设计思路

上位机软件可使用多种开发方式:

  • C# WinForms/WPF(常用于串口/网络上位机)
  • Python + PyQt(快速开发)
  • Java(跨平台)

核心模块:
1)网络监听:作为TCP服务器,接收多个教室客户端连接。
2)协议解析:解析状态上报帧,更新表格数据。
3)控制下发:点击按钮生成控制帧发送给对应教室。
4)数据管理:记录在线状态、更新时间、日志、历史数据(扩展)。
5)异常处理:断线重连提示、超时离线标记、错误帧记录。

上位机设计中需要重点考虑多连接管理,例如每个教室一个Socket连接,通过教室ID进行映射管理。


5 关键程序代码示例(51单片机C语言:采集+人数计数+控制+通信上报)

#include <reg52.h>
#include <string.h>

/* ====== 硬件定义(示例) ====== */
sbit IR_A   = P3^2;   // 红外A(建议接INT0)
sbit IR_B   = P3^3;   // 红外B(建议接INT1)
sbit KEY_MODE = P3^0; // 模式切换按键
sbit KEY_L1   = P3^1; // 手动控制L1

sbit LAMP1 = P1^0;    // 分区灯1
sbit LAMP2 = P1^1;    // 分区灯2
sbit LAMP3 = P1^2;    // 分区灯3

/* ====== 参数 ====== */
#define CLASS_ID 101

#define LIGHT_TH1 200
#define LIGHT_TH2 400
#define LIGHT_TH3 650

/* ====== 系统变量 ====== */
volatile unsigned int ms_tick = 0;
bit flag_10ms = 0, flag_100ms = 0, flag_1s = 0;

unsigned int people = 0;
unsigned int light_val = 300;

bit mode_auto = 1;     // 1=自动模式,0=手动模式

/* 红外状态机 */
typedef enum { IR_IDLE=0, IR_A_FIRST, IR_B_FIRST } IRSTATE;
IRSTATE ir_state = IR_IDLE;
unsigned char ir_timeout = 0;

/* 串口发送 */
void uart_send_char(char c) {
    SBUF = c;
    while(!TI);
    TI = 0;
}
void uart_send_str(char *s) {
    while(*s) uart_send_char(*s++);
}

/* ====== 串口初始化(与ESP8266通信) ====== */
void uart_init(void) {
    SCON = 0x50;
    TMOD |= 0x20;
    TH1 = 0xFD; TL1 = 0xFD; // 9600bps@11.0592MHz
    TR1 = 1;
}

/* ====== 定时器0 1ms ====== */
void timer0_init(void) {
    TMOD |= 0x01;
    TH0 = 0xFC; TL0 = 0x66;
    ET0 = 1; EA = 1; TR0 = 1;
}
void timer0_isr(void) interrupt 1 {
    TH0 = 0xFC; TL0 = 0x66;
    ms_tick++;
    if(ms_tick % 10 == 0) flag_10ms = 1;
    if(ms_tick % 100 == 0) flag_100ms = 1;
    if(ms_tick % 1000 == 0) flag_1s = 1;
}

/* ====== 光照采样(示例:此处用模拟值,实际应读取ADC) ====== */
unsigned int read_light(void) {
    return light_val;
}

/* ====== 人数计数状态机(10ms节拍) ====== */
void people_count_task_10ms(void) {
    bit a_block = (IR_A == 0);
    bit b_block = (IR_B == 0);

    if(ir_timeout > 0) ir_timeout--;

    switch(ir_state) {
        case IR_IDLE:
            if(a_block) { ir_state = IR_A_FIRST; ir_timeout = 50; } // 500ms
            else if(b_block) { ir_state = IR_B_FIRST; ir_timeout = 50; }
            break;

        case IR_A_FIRST:
            if(b_block) {
                people++;
                ir_state = IR_IDLE;
            } else if(ir_timeout == 0) {
                ir_state = IR_IDLE;
            }
            break;

        case IR_B_FIRST:
            if(a_block) {
                if(people > 0) people--;
                ir_state = IR_IDLE;
            } else if(ir_timeout == 0) {
                ir_state = IR_IDLE;
            }
            break;
    }
}

/* ====== 自动照明控制(100ms) ====== */
void auto_light_ctrl_100ms(void) {
    unsigned int lv = light_val;

    if(people == 0) {
        LAMP1 = 0; LAMP2 = 0; LAMP3 = 0;
        return;
    }

    if(lv < LIGHT_TH1) {
        LAMP1 = 1; LAMP2 = 1; LAMP3 = 1;
    } else if(lv < LIGHT_TH2) {
        LAMP1 = 0; LAMP2 = 1; LAMP3 = 1;
    } else if(lv < LIGHT_TH3) {
        LAMP1 = 0; LAMP2 = 0; LAMP3 = 1;
    } else {
        LAMP1 = 0; LAMP2 = 0; LAMP3 = 0;
    }
}

/* ====== 按键扫描(10ms) ====== */
void key_task_10ms(void) {
    static unsigned char c_mode=0;
    static bit lock_mode=0;

    if(KEY_MODE == 0) {
        if(c_mode < 3) c_mode++;
        else if(!lock_mode){
            mode_auto = !mode_auto;
            lock_mode = 1;
        }
    } else { c_mode = 0; lock_mode = 0; }

    /* 手动模式下L1按键控制 */
    if(!mode_auto) {
        static unsigned char c_l1=0;
        static bit lock_l1=0;

        if(KEY_L1 == 0) {
            if(c_l1 < 3) c_l1++;
            else if(!lock_l1) {
                LAMP1 = !LAMP1;
                lock_l1 = 1;
            }
        } else { c_l1 = 0; lock_l1 = 0; }
    }
}

/* ====== 状态上报(1s) ====== */
void report_task_1s(void) {
    char msg[120];
    char buf[12];

    strcpy(msg, "#ID=");
    sprintf(buf, "%u", CLASS_ID);
    strcat(msg, buf);

    strcat(msg, ",PEO=");
    sprintf(buf, "%u", people);
    strcat(msg, buf);

    strcat(msg, ",LUX=");
    sprintf(buf, "%u", light_val);
    strcat(msg, buf);

    strcat(msg, ",L1=");
    strcat(msg, LAMP1 ? "1" : "0");
    strcat(msg, ",L2=");
    strcat(msg, LAMP2 ? "1" : "0");
    strcat(msg, ",L3=");
    strcat(msg, LAMP3 ? "1" : "0");

    strcat(msg, ",MODE=");
    strcat(msg, mode_auto ? "A" : "M");

    strcat(msg, "*rn");

    uart_send_str(msg);
}

void main(void) {
    LAMP1 = 0; LAMP2 = 0; LAMP3 = 0;

    uart_init();
    timer0_init();

    while(1) {
        if(flag_10ms) {
            flag_10ms = 0;
            key_task_10ms();
            people_count_task_10ms();
        }

        if(flag_100ms) {
            flag_100ms = 0;
            light_val = read_light();
            if(mode_auto) auto_light_ctrl_100ms();
        }

        if(flag_1s) {
            flag_1s = 0;
            report_task_1s();
        }
    }
}

6 系统可靠性设计与关键问题分析

6.1 人数统计误差与优化策略

双红外对射计数在实际中可能出现误差,原因包括:
1)多人并行通过门口导致遮挡序列混乱。
2)传感器安装位置不合理,遮挡时间过短或过长。
3)光线干扰、传感器抖动、误触发。

优化策略:

  • 增加通道间距,提高方向判定准确性。
  • 设置最小触发间隔与超时机制,滤除异常序列。
  • 对密集通行场景可增加门禁通道结构(单人通行),或升级为视觉识别方案。
  • 提供“人数校准”机制:管理员可在上位机一键清零或设定人数值。

6.2 光照控制稳定性与避免“闪灯”

光照与灯光存在闭环关系:灯开→光照上升→系统判定亮→关灯→光照下降→再开灯,可能造成闪烁。
解决办法:
1)回差控制:设置L_low与L_high。
2)最小保持时间:灯开后至少保持10秒再允许关闭。
3)滤波处理:对光照采样取平均,减少瞬时波动影响。
4)分区调节:优先开某些区域,减少整体光照变化幅度。


6.3 WiFi通信丢包与离线策略

WiFi网络可能出现延迟或断线,上位机必须识别离线教室并采取策略:
1)下位机定期发送心跳,上位机若超过3个周期未收到则标记离线。
2)离线时下位机仍保持本地自动控制,不影响教室正常使用。
3)恢复连接后,下位机主动上报最新状态,上位机自动刷新。
4)重要控制指令可采用“发送—等待ACK—重发”机制,提高可靠性。


6.4 系统安全性与强电控制注意事项

照明灯具属于市电负载,强弱电控制必须注意:

  • 继电器触点容量与灯具功率匹配,避免触点粘连。
  • 强弱电线路分离,PCB保持足够爬电距离
  • 增加保险丝、漏保等外部保护装置。
  • 建议使用光耦隔离驱动,提高安全性与抗干扰能力。
  • 设备外壳与接线端子做好绝缘防护,防止触电风险。

7 系统总结与扩展方向

7.1 系统设计总结

基于单片机与WiFi通信的教室人数与照明上位机监控系统,通过光照度检测与人数检测实现教室环境感知,通过下位机自动控制照明开关并支持按键人工控制,同时通过WiFi实现与上位机的双向通信,使管理人员能够集中监控多间教室的编号、人数与分区灯状态,并可远程对全部或单个教室进行照明控制。系统实现了“按需照明、分区调节、无人关灯、集中管理”等节能与管理优势,具备较强的实用价值与扩展能力。


7.2 可扩展功能方向

为进一步提升系统性能与工程化程度,可扩展:
1)多传感器融合:增加CO₂浓度、温湿度传感器,辅助判断教室舒适度与通风需求。
2)更精确占用检测:引入毫米波雷达或AI摄像头,提高人数统计准确率。
3)能耗统计:记录每个分区灯具的开灯时长与估算能耗,形成节能报表。
4)云平台管理:采用MQTT/HTTP上传到服务器,实现跨楼宇集中管理。
5)权限与安全:增加用户登录、操作权限控制与加密通信,防止非法控制。
6)故障检测:检测灯具异常(如继电器粘连、灯具损坏)并上报维护提示。


8 结论

本设计完成了一套基于单片机与WiFi通信的教室人数与照明上位机监控系统,具备光照度与人数实时检测、下位机自动/手动照明控制、上位机集中监控与远程控制、WiFi双向通信等功能,可实现教学楼多教室照明的节能化、智能化与集中化管理。系统结构清晰、模块化程度高,既可用于仿真验证与教学设计,也具备向智慧校园照明管理平台升级的良好基础。

相关推荐