在这里插入图片描述

一、项目概述

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 工作模式设计

为了让项目更像工程方案,建议至少设计三种工作模式:

  1. 自动模式:根据光照阈值自动开关灯,同时结合人体感应进行亮度提升
  2. 定时模式:按照 RTC 时间段执行亮灯和降功率策略
  3. 手动模式:通过上位机直接设置节点开关和亮度占空比
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 上位机界面版
  • 论文正文/开题报告版本
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐