
教室照明这个场景我一直觉得是特别适合用单片机改造的。你去看看很多高校的教学楼晚自习结束后保洁阿姨挨个教室关灯或者空无一人的教室里灯从晚上六点亮到第二天早上六点电费哗哗地流。我这套基于STM32智能教室灯光照明人数监测系统核心就是解决这种人走灯不灭的浪费问题顺带把自习人数统计也做了谁来了、谁走了、教室里现在还有几个人、该不该开灯、该开多亮全部交给单片机自动判断。做这个项目的起因很简单毕业设计要选题不想做那种烂大街的温湿度计也不想碰纯仿真的水题于是我就把目光落在教室节能座位管理这个方向。整个系统以STM32为主控红外对射传感器负责监测进出教室的人流方向通过方向判定算法得出教室实时人数再结合继电器和PWM调光模块控制灯光自动开关和亮度调节。实际做下来这套方案成本不高、逻辑清晰、可展示性强关键是它能落地不是只活在PPT里。这篇东西我按完整的开发流程来写从方案选型到硬件搭电路再到软件状态机设计和调试踩坑最后附上我实测时遇到的一堆问题。如果你也正在做类似题目或者想用电控手段解决实际场景问题这篇应该够你少走不少弯路。1. 项目定位与整体方案拆解1.1 教室照明的真实痛点是什么没在高校待过的人可能想象不到教室照明的浪费有多夸张。我观察过几个教学楼的实际情况白天靠窗区域采光足够但灯全开傍晚人走光了空调和灯还继续运转自习室人少但灯光永远按最大功率输出。如果只做普通的光控开关在阴天或傍晚这种光线条件复杂的情况下又容易闪烁误动作。所以这个系统的定位并不是简单地光线暗了就开灯而是要做成一整套带人数感知的照明管理方案。核心痛点拆开其实是三层第一层判断教室里有没有人。这个用红外对射或热释电都能做但要统计具体人数就必须区分进和出两个方向。第二层教室有人时按需照明人少时降低亮度人走了延时关灯。第三层把实时的在室人数、灯光状态可视化留着后续做自习座位查询或能耗统计。这三个需求正好对应了传感器数据采集、逻辑控制、人机交互三个层面。STM32在这中间扮演的角色就是大脑负责把所有传感器的数据融合起来然后给出合理的灯光控制策略。选STM32而不是51或者Arduino原因很直接STM32的定时器资源、外部中断数量和GPIO复用能力能够同时支撑多路传感器输入、PWM输出和串口通信而且生态成熟出了问题随便一搜就有解。1.2 人数监测方案选型红外对射为何最稳人数监测是整个系统的灵魂选对传感器方案项目就成了一半。我对比过下面几种常见方案各有优劣这里直接说结论方案原理优点缺点适用度双红外对射两对红外发射管接收管按先后顺序判断进出方向成本极低、响应快、算法简单、不受光线/温湿度影响并行多人同时通过时可能漏检高热释电红外检测人体红外辐射变化成本低、不需要发射管只能检测移动静止就失效无法区分方向中OpenMV视觉摄像头识别目标跟踪精度高、可统计静止人数成本高、对STM32F103来说算力吃力、受光线影响大中超声波对射超声波发射接收阵列抗干扰强方案复杂、调试难度大低激光ToF激光测距波形分析精度极高贵工程化成本高低最终我选了双红外对射方案。具体来说就是在教室前门和后门各安装一组进门传感器和出门传感器常开型对射式光电开关人通过时会依次遮挡两个传感器根据遮挡的先后顺序就能判断是在进门还是在出门。这套方案的逻辑足够简单STM32用外部中断实时响应不用像视觉方案那样跑重量级算法F103C8T6的性能完全够用。而且对射式传感器本质上是数字量输出受环境光干扰小稳定性比反射式好很多。1.3 系统总架构与工作模式设计整个系统的信息流是这样的红外对射传感器检测到人通过 → 输出电平跳变 → STM32外部中断捕获 → CPU执行方向判定算法更新计数 → 综合人数、当前时间、环境光强度执行灯光控制策略 → 继电器或PWM输出调节灯光 → OLED/LCD显示实时状态ESP8266可选上报到服务器。系统设计了两种工作模式通过按键切换自动模式比较聪明分四个状态——无人状态关灯、少人状态比如1到5人开1/3亮度或只开前排灯、多人状态超过设定阈值全亮、离开延时状态最后一个人离开后保留照明60秒再熄灭避免频繁开关。这个分档设计是我从实际使用习惯出发加的要是自习室两三个人坐角落你把整排灯全开确实浪费但全关又不合适分档调光就能兼顾节能和实用性。手动模式是保留的兜底方案。因为纯自动控制有时候会有误判比如有人进出时并行通过漏检了或者传感器被书包、雨伞遮挡触发误检。遇到这种情况管理员或使用者可以切手动模式直接控制灯光不会被自动逻辑卡死。我实测过技术再好的算法也不能做到100%准给用户留一个手动控制入口是产品化必须要做的事。2. 硬件选型与电路搭建2.1 主控选择为什么是STM32F103C8T6主控这块我用的是STM32F103C8T6蓝色Pill那种小板某宝十几块钱一片性价比极高。这颗芯片的核心参数在这个项目里完全够用72MHz主频、64KB Flash、20KB SRAM、37个GPIO、7个定时器、两个SPI、三个USART。具体到本项目的外设资源分配两个外部中断引脚接进门/出门传感器一个定时器通道做PWM输出控制灯光亮度USART1接ESP8266I2C接OLED屏幕另外还有几个普通GPIO接按键、继电器、蜂鸣器。我在选择的时候也犹豫过要不要上F407后来想明白了做这个项目考验的不是芯片性能天花板而是你对资源的合理规划。F103C8T6在20KB SRAM下跑RTOS都够更别说我们这种裸机状态机没必要为了跑分多花钱。而且这颗芯片的资料贼多无论是标准库还是HAL库的教程一抓一大把对新手极度友好。2.2 传感器模块对射式光电开关怎么接室内人数检测我用的传感器型号是E3F-DS30C4这是一种圆柱形对射式光电开关检测距离可以到30厘米NPN常开输出。为什么要选对射式而不是反射式因为教室门口宽度一般有80到100厘米反射式在这种距离下对安装角度要求极其苛刻稍偏一点就检测不到而对射式只需要把发射头和接收头正对安装遮挡就触发稳定得多。接线很简单三根线棕色接VCC5V或12V具体看模块型号蓝色接GND黑色是信号输出线。输出端在未遮挡时是高电平被遮挡时拉低所以STM32的外部中断要配置成下降沿触发这样人一经过就能立刻唤醒CPU处理中断。安装的时候要注意一点发射头和接收头要正对且高度要在人的腰部到膝盖之间大概50到80厘米的高度比较合适。太低容易被书包拖地触发太高则可能漏掉个子矮的同学。另外两个传感器进门S1、出门S2的间距要保证在10厘米以上让人的身体能够依次遮挡它们间距太小的话一个人走过去两个传感器同时被遮住方向判断就废了。2.3 灯光控制电路继电器与PWM调光灯光部分我做了两路控制一路是通过继电器控制总电源的通断另一路是PWM调光控制灯带的亮度。为什么要两路配合因为教室常用的日光灯管必须要继电器做开关切换而辅助的氛围灯带或LED灯板则适合用PWM做无级调光。两者组合就能实现有人时自适应亮暗无人时彻底断电的完整闭环。继电器模块我选择带光耦隔离的5V低电平触发款。STM32的GPIO输出高电平经三极管拉到低电平驱动继电器逻辑是GPIO置低→光耦导通→继电器吸合→灯亮。注意继电器线圈是感性负载断电瞬间会产生反向电动势必须用续流二极管或者直接买带光耦隔离的模块否则很容易把单片机的GPIO口烧掉。我第一次搭电路的时候图省事用了裸继电器没加光耦结果调试时复位了好几次排查半天才发现是继电器开关瞬间的电源毛刺造成的。PWM调光这一路我用的是STM32定时器2的通道2PA1引脚输出频率设为1kHz通过改变占空比调节LED灯带亮度。实测下来占空比在20%以下时灯带基本不亮20%到60%是线性度比较好的区间60%以上肉眼就很难分辨亮度差异了。所以我在代码里把占空比的可调范围限定在20%到80%避免控制死区。2.4 电源方案与PCB布局的避坑经验整个系统的供电我采用的是外部12V适配器作为总输入经过降压模块降到5V给传感器和继电器供电再经过AMS1117-3.3降到3.3V给STM32和OLED供电。为什么要搞两级降压而不是直接用一个5V电源因为继电器吸合瞬间电流波动很大如果让STM32和继电器共用同一个5VCPU时不时就会因为供电跌落而复位。我实际测试过E3F-DS30C4传感器工作电流在30mA左右两个就是60mA加上ESP8266在WiFi发射瞬间的峰值电流能到300mA以上如果稳压模块的余量不够电压毛刺会直接导致单片机死机。电源这一块的结论很简单选输出电流至少1A以上的降压模块STM32的3.3V单独用一路稳压模拟地和数字地在一点汇合就能解决90%以上的莫名其妙复位死机问题。布局上如果自己画PCB注意把继电器和220V交流走线放在板子的边缘并开槽隔开如果只是用杜邦线搭毕设那至少做到传感器线用双绞线PWM输出线和电源线分开放置避免互相耦合干扰。我自己初期用面包板搭的时候PWM线紧贴着继电器线走结果每次继电器吸合灯带就闪一下后来把线分开了才解决。2.5 显示与交互模块显示部分我用了0.96寸OLEDI2C接口SCL接PB6、SDA接PB7主要显示当前时间、实时人数、灯光状态、工作模式。OLED功耗低、刷新快、可视角大比LCD1602的显示效果好太多。唯一的坑是I2C地址有些模块是0x3C有些是0x3D我买了好几块屏实测才发现不同批次地址还不一样代码里最好做个自动探测或者编译期配置。交互部分就是三个按键模式切换键自动/手动、亮度加键、亮度减键。按键电路我建议直接用内部上拉外部接一个100nF电容去抖。软件上配合20ms的消抖也够了。这里记住一个原则硬件能解决的去抖就不要让软件去扛因为外部中断里做延时消抖是大忌后面会详细说。3. 软件架构与核心逻辑编写3.1 开发环境搭建Keil5配置与芯片包安装这个项目我用的是标准外设库Standard Peripheral Library原因是我对寄存器级别的操作习惯比较熟而且标准库在F103上的资料多到看不完。如果你是零基础其实用STM32CubeMXHAL库更方便图形化配置完直接生成工程初始化代码。开发工具是Keil MDK5这里首先要解决芯片包的问题。新装好的Keil5默认是没有STM32F1系列支持的你得先下载对应的Device Family Pack。直接打开Keil的Pack Installer在搜索框输入STM32F1找到STM32F1 Series Device Support点安装。如果你是从网上下载的离线安装包安装完在Keil里点魔术棒图标Device选项卡里能看到STMicroelectronics下的STM32F103C8就说明装好了。这里有个容易踩的坑Keil5的Pack安装路径不能有中文否则编译器会报File not found之类的错误。我同事之前折腾一下午装不上包最后发现是用户名是中文导致路径里带了用户两个字换到纯英文工程路径瞬间解决。下载调试器我用的ST-Link V2十几块钱的国产货接好SWD四根线SWDIO、SWCLK、GND、3.3V在Keil的Options for Target里把Debugger选为ST-Link Debugger再在Settings里把Flash Download勾选上Reset and Run烧录后程序就能自动复位运行。如果你的ST-Link闪红灯或者Keil识别不了多半是驱动问题去官网下最新的ST-Link驱动重新装一遍就行。3.2 核心算法人数统计方向判定与会话状态机这里我重点讲一下整个系统最核心的部分怎么判断一个人是进门还是出门。传感器在门两侧安装靠近门外的叫S1靠近门内的叫S2。一个人从外面走进来会先遮挡S1再遮挡S2走出去则相反先S2后S1。所以判断依据就是两个传感器被遮挡的先后顺序。直接根据先后顺序判断有几个实际问题并行通过的两人如果间距很小传感器信号会重叠一个人站门口犹豫不决来回晃动会对一个传感器反复触发。所以整个判断逻辑我设计成了一个四状态的状态机而不是简单的先后判断这样能过滤掉大量的无效触发。状态机逻辑是这样的typedef enum { STATE_IDLE, // 空闲无人遮挡 STATE_S1_HIT, // S1先被遮挡等待S2 STATE_S2_HIT, // S2先被遮挡等待S1 STATE_S1_S2_HIT // 两个都被遮挡判定完成 } STATE; void ir_sensor_handler(void) { // 读取当前传感器状态0表示遮挡1表示未遮挡 uint8_t s1 HAL_GPIO_ReadPin(S1_GPIO_Port, S1_Pin); uint8_t s2 HAL_GPIO_ReadPin(S2_GPIO_Port, S2_Pin); switch (current_state) { case STATE_IDLE: // 检测到遮挡变化则进入相应方向 if (s1 0 s2 1) { current_state STATE_S1_HIT; } else if (s2 0 s1 1) { current_state STATE_S2_HIT; } break; case STATE_S1_HIT: // 等待S2也被遮挡完成进的判定 if (s2 0) { person_count; current_state STATE_IDLE; } else if (s1 1 s2 1) { // S1遮挡后又恢复说明是误触发回到空闲 current_state STATE_IDLE; } break; case STATE_S2_HIT: // 等待S1被遮挡完成出的判定 if (s1 0) { if (person_count 0) { person_count--; } current_state STATE_IDLE; } else if (s1 1 s2 1) { current_state STATE_IDLE; } break; } }状态机的好处是强制规定了事件发生的合法序列任何不符合先S1后S2或先S2后S1的杂乱信号都被丢弃。比如人在门口探个脑袋遮了一下S1又收回去了程序会走STATE_S1_HIT分支发现S1恢复了回到IDLE不会误判成一次进出。人数的上下限保护是必须加的。教室容量是有限的我把人数钳制在0到100之间小于0强行置0大于100强行置100。这样做的好处是即使传感器因为干扰产生了错误计数人数也不会变成负数或天文数字。3.3 灯光控制策略分档调光与延时逻辑灯光控制我写了四档策略无人、少人、多人、延时关灯。这个分档阈值可以在代码里直接改我用宏定义写在文件头部方便调试#define LIGHT_OFF_PWM 0 // 关灯 #define LIGHT_LOW_PWM 120 // 少人模式占空比约47% #define LIGHT_FULL_PWM 255 // 全亮 #define DELAY_SHUTDOWN 60 // 延时关灯时间单位秒逻辑是这样的每秒钟扫描一次当前人数同时检查当前亮灯状态。人数大于等于1且小于5进入少人模式人数大于等于5进入多人模式人数等于0且灯光处于开启状态进入延时关灯倒计时倒计时60秒内又有人进来则取消延时没人来就关灯。定时器中断里做秒数递减不要在HAL_Delay里傻等。延时关灯这个设计很多人忽略但我觉得特别关键。如果不加延时最后一个人出门的瞬间灯马上熄灭万一他是出去走廊接个水又回来灯又在黑暗中等他开门体验极差。加了60秒延时后既不会浪费太多电又给人留足了返回的时间。延时长短可以在编译前配置我是按教室场景设的60秒办公室的话可以缩短到30秒。3.4 外部中断与定时器的配合避免延时函数卡死这里必须提一个我踩过的大坑STM32的HAL_Delay()函数在中断服务函数里会卡死。原因很简单HAL_Delay内部依赖SysTick中断而SysTick的中断优先级在默认配置下比外部中断低当你正在用户中断里执行HAL_Delay时SysTick进不来程序就像死循环一样卡住。所以我在传感器外部中断回调里绝不做延时操作只设置一个标志量把具体的计数逻辑放到主循环里去处理。这是嵌入式开发的黄金法则中断服务函数要短小精悍只做标记不做耗时操作。我后期甚至把方向判定状态机也搬到了主循环中断里只把传感器状态读取成结构体存起来主循环通过20ms的定时轮询去处理彻底解决中断冲突。定时器方面我用了两个TIM2做PWM输出TIM3做秒定时器。TIM3配置成1秒中断一次主循环里通过一个全局变量seconds来计数用这个变量做延时关灯的计时。3.5 可选功能扩展ESP8266上报与远程查看如果你想让系统更完整可以加一个ESP8266模块通过串口把实时人数和灯光状态上报到服务器或者手机App。我这里用AT指令接的是WiFi连接上局域网后通过HTTP POST把数据发到简单的Flask后端或者用MQTT协议推给家里的小爱同学。接线方式ESP8266的TX接STM32的RXPA10ESP8266的RX接STM32的TXPA9GND共地3.3V供电。注意ESP8266的峰值电流很大绝对不能直接挂在STM32的3.3V引脚上要从电源模块单独拉一路3.3V给它供电。串口波特率设9600开始调试AT指令基本上就是这些ATCWMODE1 ATCWJAP你的WiFi名,密码 ATCIPSTARTTCP,你的服务器IP,8080 ATCIPSEND当前要发送的数据长度实测下来ESP8266在教室环境里离路由器20米左右还能稳定连接数据丢包率不高。不过这一块对毕设来说算加分项不是必需品。如果你想省时间OLED显示数据已经完全够答辩展示了。4. 实操过程与实测数据记录4.1 电路连接与上电自检流程硬件焊接组装时我按模块顺序做了连接建议你也按这个顺序排查不要一上来就把所有东西都接齐出问题都不知道是哪部分的锅。第一步先给STM32最小系统供电用USB转TTL通过串口发个测试数据确认单片机正常运行。第二步接OLED屏幕初始化成功后屏幕上会有字符显示这时I2C通信正常。第三步接传感器用手在传感器中间晃动通过串口打印状态看电平翻转是否正常。第四步接继电器和灯用按键手动控制继电器吸合确认灯光能正常点亮和熄灭。最后再把所有模块集成到一起烧录完整的自动控制程序。上电自检的时候我写了一个几分钟的测试程序开机先显示系统自检状态蜂鸣器滴一声然后循环打印各传感器状态、当前人数、继电器状态。这样在外场调试的时候拿个串口模块接到电脑上所有信息一目了然。4.2 人数统计精确度测试记录这个项目的硬指标就是人数统计准不准。我找了几个同学在实验室门口做了一组实测模拟不同通过方式测试数据如下测试场景实际进出系统统计漏检/误检情况单个正常步伐进出20进20出20进20出无两人并行同时通过10进10出7进7出漏检约30%三人前后脚连续快速通过10进10出8进8出漏检约20%一人反复门口探头、未进出0进0出0进0出无误触被状态机过滤背着大书包进出15进15出14进14出书包遮挡导致漏检1次结论很直观并行和连续快速通过是漏检的主要原因单人和慢速通过的精度能到95%以上。对教室照明系统来说少量漏检不会造成灾难性后果但如果你要做考勤那肯定不够得加视觉方案辅助。解决方案是在门两侧各加一组传感器形成双光幕但成本会翻倍看你要什么精度。4.3 灯光控制策略的现场调参装到真实教室环境后我发现有几个参数需要根据现场调传感器安装高度从最初的70厘米降到50厘米后书包误触率明显下降因为书包摆动的位置一般在腰部以下。少人模式的光照档位原本调的是80/255约31%占空比但实际教室使用觉得太暗有同学反馈看书吃力后来改成120/255约47%亮度刚好。延时关灯时间最初设的是15秒实测发现不够最后一个人出教室后去走廊接水再回来刚走到门口灯就灭了。改成60秒后体验舒适了很多电费也多花不了多少。这里有一个调参技巧所有阈值参数都定义成宏或const变量集中在代码文件头部调参时不需要翻代码改完重新编译烧录就行。我后来又加了一层EEPROM存储参数用按键就可以现场调整不用反复拔插烧录器。4.4 稳定性优化看门狗与数据掉电保存系统在长时间运行时会遇到各种偶发问题电磁干扰导致程序跑飞、传感器老化导致电平异常、WiFi模块电流拉低电压导致单片机复位。针对这些我做了三件事第一开启了独立看门狗IWDG。主循环里每扫描一遍就喂狗一次一旦程序跑飞超过1秒没喂狗系统自动复位。这个机制对无人值守的设备极其重要不然半夜程序死机了第二天上课灯全是黑的。第二数据掉电保存。我把当前的人数和灯光状态存入STM32内部的备份寄存器Backup Register在掉电瞬间主循环会检测到电源电压跌落把需要保存的数据写入备份寄存器下次上电先读取恢复。如果没有备份寄存器可用也可以用外部EEPROMAT24C02加Flash模拟。第三传感器信号线上并联了100nF的滤波电容消除高频干扰毛刺。同时外部中断触发方式也从边沿触发改成了高电平触发配合20ms轮询确认相当于硬件和软件双重滤波。稳定性的提升不是靠某一个魔改而是每一层都做一点加固。5. 常见问题与排查技巧实录5.1 开发环境与烧录问题Keil5里找不到STM32芯片这不是代码问题是芯片包没装。在Pack Installer里搜索STM32F1安装Device Support或者检查Pack安装路径是否包含中文字符。ST-Link无法识别设备先检查SWD四根线是否接对然后去设备管理器看驱动是否正常。我的ST-Link有时插上电脑没反应把USB线拔了重插就恢复供电不稳导致的。或者直接把下载速率Settings里Connect under Reset模式调低比如从10MHz降到1MHz很多识别不了的问题都能解决。烧录报No target connected可能是BOOT0引脚没接地。STM32的BOOT0默认通过10k电阻接地如果你自己搭板子忘了配这个电阻芯片一上电就进入BootLoader模式调试器自然连不上。我之前就是搭电路时漏了BOOT0的10k下拉电阻卡了整整一个下午。5.2 程序运行异常排查delay函数卡死在中断里这个问题我在3.4节提过本质是HAL_Delay依赖SysTick而SysTick优先级低于外部中断。解决办法是中断里不做延时或者用__disable_irq()保护但更好的方案是把耗时逻辑全部挪到主循环。程序跑到HardFault_Handler也就是热词里大家常搜的CFSR为0x00008200这类错误这个值具体含义是总线错误一般发生在访问非法地址或者数组越界。我排查过一次原因是定义了一个100个字节的数组最后下标却写到了第101个指针直接越界飞到未知内存。排查方法很简单在HardFault_Handler里加一个断点程序卡住后检查SCB-CFSR寄存器和LR寄存器的值能定位到是哪个函数跳进去的。定时器捕获测频率不准如果你用定时器做输入捕获测量PWM或传感器脉冲频率注意要把定时器时钟源的预分频系数算对。F103的TIM2是挂在APB1上的如果APB1的时钟源已经二分频过那么定时器的时钟频率要乘2。我刚开始测出来的频率总是偏小一半后来才发现是这个原因。5.3 传感器信号异常与继电器干扰传感器频繁误触发检查传感器的供电电压是否稳定电源质量差会导致传感器输出端出现毛刺。另外检查发射头和接收头表面是否积灰光学器件脏了灵敏度会急剧下降触发阈值变得不稳定。继电器吸合瞬间单片机复位这个是典型的电源污染问题。继电器线圈在吸合和断开瞬间产生很大的反向电动势和电流尖峰解决思路使用带光耦隔离的继电器模块继电器线圈两端加续流二极管STM32电源入口加一个470uF大电容和0.1uF小电容并联滤波。这样处理后我实测基本不会因为继电器动作导致复位。人数统计和实际偏差大首先用串口打印观察传感器状态在门口来回走几次看S1和S2的电平翻转时序是否正常如果顺序反了把传感器S1和S2的接线对调或者直接改代码里的判定条件。其次检查两个传感器的安装间距间距小于5厘米时人走过去基本同时遮挡方向判断完全失效。5.4 问题排查速查表整理一个速查表方便后期维护现象可能原因排查手段上电后OLED无显示I2C接线错误/地址不对用I2C扫描程序确认屏幕地址人经过但人数不增加传感器未触发/触发信号未到CPU串口打印传感器GPIO电平人数乱跳传感器供电不稳/接线太长滤波电容/加粗电源线继电器反复吸合断开模式逻辑判断有问题串口打印人数和延时状态串口输出乱码波特率不匹配/共地问题检查波特率配置和GND连接程序烧录后不运行Reset and Run未勾选手动按一下板子复位键教室有人但灯不亮环境光判定条件误判检查光照阈值参数设置6. 项目总结与后续扩展方向最后聊点实在的。这个系统我从立项到稳定运行前后花了两周左右。期间最耗时间的不是写代码反而是现场调试——传感器安装高度、继电器干扰、电源稳定性这些只有实际跑起来才能发现问题。我个人的体会是这种偏嵌入式应用的单片机项目有一个完整可演示的硬件实物比什么花哨的算法都管用。最后去演示的时候我直接拿教室走了几趟系统自动开灯、记数、延时关灯效果比PPT讲十页都有说服力。如果你也想在这个基础上扩展可以考虑几个方向第一接一个人脸识别模块人进来自动识别身份系统可以统计每个学生的到课率这就是一个考勤系统的雏形。第二把多个教室的设备通过WiFi组网后台统一管理所有教室的灯光状态和能源消耗适合做成校园级的能耗监控平台。第三加入语音播报模块人进教室时自动播报欢迎光临或者人满时提示座位已满。第四用腾讯云或阿里云的物联网平台实现远程手机端控制灯光。这个项目最让我满意的地方是它不是一个为了交差而做的玩具而是真正可以部署到教室环境、实际降低能耗、改善自习体验的小系统。技术难度不算高但整个开发流程完整覆盖了需求分析、方案选型、硬件设计、软件实现、现场调试、稳定性优化这些环节对入门嵌入式或者做毕设的人来说是一个性价比很高的练手项目。有问题直接在评论区交流我看到都会回。