【毕业设计】基于STM32的智能路灯控制系统设计与实现(光照检测+人体感应+LoRa组网+上位机管理)
基于STM32F103设计一套面向校园道路、园区步道和社区照明场景的智能路灯控制系统,集成光照检测、人体红外感应、RTC定时、PWM调光和LoRa无线组网,实现自动亮灯、分时调光、异常告警与上位机集中管理,适合作为STM32相关毕业设计、课程设计和项目实战参考。

一、项目概述
1.1 项目背景
传统路灯系统大多采用固定时段开关控制,方案简单,但也暴露出几个典型问题:
- 白天阴雨、傍晚光线突变时,固定时段控制不够精准
- 深夜人流较少时仍全功率点亮,能源浪费明显
- 单灯故障只能靠人工巡检,维护效率低
- 多灯集中管理能力弱,缺少状态回传和策略调整接口
如果把它放在校园、工业园区或者住宅小区场景里,这类问题会直接影响照明效果、运维成本和节能指标。因此,毕业设计完全可以围绕“感知 + 控制 + 通信 + 管理”四个关键词展开,做成一套既有硬件、又有软件、还能讲工程价值的完整系统。
本文给出一套可直接用于论文和答辩展示的实现思路:以 STM32F103C8T6 为主控,结合 BH1750 光照传感器、HC-SR505 人体红外模块、DS3231 时钟模块、MOS 管 PWM 调光驱动、LoRa 无线通信模块,构建分布式智能路灯节点,并通过上位机完成参数配置、状态显示和故障记录。
1.2 设计目标
本项目重点解决以下几个问题:
- 根据环境光照强度自动控制路灯开关
- 根据人体经过情况进行亮度提升和延时熄灭
- 根据 RTC 时间段执行分时调光策略
- 通过 LoRa 将多个路灯节点接入网关,实现远距离低功耗组网
- 上位机实时显示节点亮度、在线状态、故障信息和告警日志
1.3 系统功能
- 自动采集环境照度,判断是否进入亮灯状态
- 人体经过时提升灯光亮度,无人时自动降到节能模式
- 支持凌晨低功耗调光,降低整体能耗
- 支持手动模式、自动模式、定时模式三种工作模式
- 支持灯具开路、节点离线、通信异常等故障检测
- 支持上位机统一查看和下发控制参数
二、技术选型表
| 技术领域 | 选型方案 | 选择理由 |
|---|---|---|
| 主控芯片 | STM32F103C8T6 | 成本低、资源充足、开发资料丰富 |
| 光照检测 | BH1750 | I2C 接口,照度数据直观,适合照明场景 |
| 人体感应 | HC-SR505 / PIR | 接口简单,适合做路灯联动触发 |
| 实时时钟 | DS3231 | 走时稳定,支持断电保持 |
| 调光方式 | TIM PWM + MOS 驱动 | 实现亮度可调,控制逻辑清晰 |
| 无线通信 | SX1278 LoRa | 低功耗、远距离、适合路灯组网 |
| 本地显示 | OLED 0.96 寸 | 调试方便,可本地查看状态 |
| 上位机 | Python + PyQt5 | 可视化效率高,适合毕业设计展示 |
| 数据存储 | SQLite | 轻量、易部署、便于日志查询 |
三、系统架构设计
3.1 总体架构
系统采用“路灯节点 + LoRa 网关 + 上位机”的三级架构:
- 路灯节点层:STM32 采集照度、人体状态、时钟数据,执行调光控制
- 通信层:LoRa 模块负责节点与网关之间的状态上传和命令下发
- 管理层:PyQt5 上位机负责参数配置、日志显示、节点监控和故障统计
如果需要在 CSDN 正文中插图,架构关系可以概括为:
BH1750/人体感应/RTC
↓
STM32 数据采集与策略判断
↓
PWM 调光 + 本地状态显示
↓
LoRa 无线传输
↓
网关串口转发到PC
↓
PyQt5 上位机监控与日志管理
3.2 工作模式设计
为了让项目更像工程方案,建议至少设计三种工作模式:
- 自动模式:根据光照阈值自动开关灯,同时结合人体感应进行亮度提升
- 定时模式:按照 RTC 时间段执行亮灯和降功率策略
- 手动模式:通过上位机直接设置节点开关和亮度占空比
3.3 数据帧设计
LoRa 上传的节点数据建议采用简单字符串协议,便于调试:
ID=01,LUX=128,PIR=1,MODE=AUTO,DUTY=85,ERR=0
下位机解析简单,上位机也容易拆包。后续如果想扩展多字段配置,也可以改为 JSON 格式。
四、硬件设计
4.1 硬件清单
| 模块 | 型号 | 数量 | 说明 |
|---|---|---|---|
| 最小系统板 | STM32F103C8T6 | 1 | 核心控制器 |
| 光照模块 | BH1750 | 1 | 环境照度采集 |
| 人体感应模块 | HC-SR505 | 1 | 路人经过检测 |
| RTC 模块 | DS3231 | 1 | 定时策略执行 |
| LoRa 模块 | SX1278 | 1 | 远距离无线通信 |
| OLED 模块 | SSD1306 | 1 | 本地状态显示 |
| LED 灯驱动 | MOS 管 + LED 负载 | 1 | PWM 调光控制 |
| 蜂鸣器 | 有源蜂鸣器 | 1 | 故障本地告警 |
4.2 关键引脚分配
| 功能 | 引脚 |
|---|---|
| I2C1_SCL | PB6 |
| I2C1_SDA | PB7 |
| PIR 输入 | PA1 |
| PWM 输出 | PA8 |
| LoRa 串口 TX/RX | PA9 / PA10 |
| 蜂鸣器控制 | PB12 |
4.3 设计要点
- BH1750 和 DS3231 都挂在 I2C 总线上,注意总线地址和上拉电阻
- PWM 调光建议使用定时器高级输出,便于调整占空比
- 灯具驱动部分与 STM32 控制部分最好做隔离或分开供电
- LoRa 天线布线尽量短,避免贴近高频开关电源区域
五、软件设计
5.1 主程序流程
主循环可以拆成以下几个任务:
- 周期采集光照值
- 检查人体感应状态
- 获取 RTC 时间
- 根据策略计算目标亮度
- 执行 PWM 输出
- 上传节点状态
- 检查通信和灯具故障
主流程如下:
while (1)
{
Read_BH1750(&lux);
pir_state = HAL_GPIO_ReadPin(PIR_GPIO_Port, PIR_Pin);
DS3231_GetTime(&rtc_time);
duty = StreetLight_StrategyCalc(lux, pir_state, rtc_time, sys_mode);
PWM_SetDuty(duty);
Fault_Check();
Lora_ReportStatus(lux, pir_state, duty, fault_code);
HAL_Delay(500);
}
5.2 自动调光策略
自动调光是整篇文章的核心,建议把逻辑写清楚:
- 当照度高于白天阈值时,灯保持关闭
- 当照度低于夜间阈值时,进入亮灯状态
- 如果检测到人体经过,亮度提升到 80%~100%
- 如果一段时间无人经过,则降到 30%~40% 节能亮度
- 凌晨低人流时间段继续下调占空比
策略函数示例如下:
uint8_t StreetLight_StrategyCalc(uint16_t lux, uint8_t pir, RTC_TimeTypeDef now, uint8_t mode)
{
if (mode == MODE_MANUAL)
{
return manual_duty;
}
if (mode == MODE_TIMER)
{
if (now.Hours >= 18 || now.Hours < 6)
{
return (now.Hours >= 0 && now.Hours < 5) ? 35 : 70;
}
return 0;
}
if (lux > 300)
{
return 0;
}
if (pir)
{
no_person_tick = 0;
return 90;
}
if (no_person_tick < 20)
{
no_person_tick++;
return 55;
}
return 30;
}
这段代码有几个好处:
- 答辩时容易讲清楚控制策略
- 逻辑上兼顾节能与体验
- 后续扩展 AI 预测、人流统计也方便
5.3 BH1750 光照采集
uint16_t BH1750_ReadLux(void)
{
uint8_t buf[2];
HAL_I2C_Master_Receive(&hi2c1, BH1750_ADDR, buf, 2, 100);
return ((buf[0] << 8) | buf[1]) / 1.2f;
}
5.4 PWM 调光控制
void PWM_SetDuty(uint8_t duty)
{
if (duty > 100) duty = 100;
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, duty * 10);
}
5.5 LoRa 上传函数
void Lora_ReportStatus(uint16_t lux, uint8_t pir, uint8_t duty, uint8_t err)
{
char tx_buf[96];
sprintf(tx_buf, "ID=%02d,LUX=%d,PIR=%d,MODE=%d,DUTY=%d,ERR=%d\r\n",
node_id, lux, pir, sys_mode, duty, err);
HAL_UART_Transmit(&huart1, (uint8_t *)tx_buf, strlen(tx_buf), 100);
}
六、上位机设计
上位机部分建议体现两个重点:集中监控 和 参数配置。
6.1 主要界面功能
- 显示所有路灯节点的在线状态
- 实时显示光照值、人体状态、当前亮度、故障码
- 允许修改光照阈值、延时时间、手动亮度
- 支持日志保存、故障筛选、节点离线提示
6.2 串口接收解析示例
def parse_line(line: str):
result = {}
for item in line.strip().split(','):
key, value = item.split('=')
result[key] = value
return result
6.3 数据库存储建议
SQLite 表结构可设计为:
CREATE TABLE lamp_log (
id INTEGER PRIMARY KEY AUTOINCREMENT,
node_id INTEGER,
lux INTEGER,
pir INTEGER,
duty INTEGER,
err INTEGER,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
七、系统调试与常见问题
7.1 光照值抖动大
原因通常有三个:
- 传感器供电不稳
- I2C 线过长或干扰较大
- 周围灯具频闪导致采样波动
处理方法:
- 给传感器单独做去耦
- 使用滑动平均滤波
- 设置上下阈值滞回,避免频繁开关灯
7.2 PIR 容易误触发
常见于室外温差变化较大场景,可以:
- 增加二次确认时间窗口
- 只在低照度时启用 PIR 触发提升
- 用“人体触发 + 持续倒计时”代替频繁即时切换
7.3 LoRa 节点偶发离线
- 检查串口波特率和数据帧格式
- 检查供电纹波和模块发射瞬时电流
- 给上位机加心跳包超时判定,不要把一次丢包直接当故障
7.4 路灯亮度变化不平滑
可以在占空比更新时加入渐变逻辑,例如每 20ms 递增一次,占空比逐步逼近目标值,这样现场展示更有“产品感”。
八、测试方案
建议在毕业设计中补充一张测试表,体现工程严谨性。
| 测试项目 | 测试方法 | 预期结果 |
|---|---|---|
| 光照自动亮灯 | 遮挡 BH1750 | 路灯自动点亮 |
| 人体增亮 | PIR 前方经过 | 亮度提升到高亮模式 |
| 无人降亮 | 停止移动一段时间 | 占空比降至节能亮度 |
| 定时控制 | 修改 RTC 时间 | 指定时间段自动开关 |
| 无线通信 | 断开节点天线/供电 | 上位机显示离线或告警 |
九、总结与扩展方向
这套基于 STM32 的智能路灯控制系统,比较适合作为毕业设计的原因,不只是“能亮灯”,而是它具备完整的系统闭环:
- 前端有感知层,体现硬件采集能力
- 中间有控制策略,体现嵌入式逻辑设计
- 后端有无线通信和上位机,体现系统集成能力
- 故障与日志模块让整个项目更像真实工程方案
后续还可以继续扩展:
- 加入电流检测,实现灯具损坏和偷电分析
- 接入 NB-IoT/4G,实现城市级远程路灯管理
- 引入摄像头或毫米波雷达,提高目标检测准确率
- 加入地图界面和分组控制,做成更完整的智慧照明平台
如果你最近也在做 STM32 毕业设计、智能路灯、智慧照明、LoRa 无线控制、上位机监控系统 相关项目,这个题目非常适合拿来做答辩展示和 CSDN 技术整理。后面如果需要,我也可以继续把这套方案补成:
- 原理图说明版
- 完整 STM32 HAL 工程代码版
- Python 上位机界面版
- 论文正文/开题报告版本
更多推荐



所有评论(0)