基于单片机的自动路灯监控系统设计

1、基于单片机的自动路灯监控系统设计

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

2、系统总体概述

2.1 设计背景与应用意义

路灯作为城市照明系统的重要组成部分,直接关系到夜间交通安全、行人出行体验以及城市形象。传统路灯控制方式主要依靠人工开关或简单的定时控制,存在管理成本高、能耗浪费严重、照明适应性差等问题。例如:在阴雨天气或雾霾较重时,环境光照不足但尚未到预设开灯时间,路灯无法及时开启;反之,在夏季天黑较晚或环境光照较强的情况下,即便处于预设时段路灯也可能被强制开启,造成能源浪费。

随着智慧城市建设和节能减排理念的推广,路灯控制逐步向自动化、智能化方向发展。通过单片机结合光敏传感器、时间控制、人机交互和优先级逻辑,可以实现更灵活、更节能、更可靠的路灯控制系统:

1)在时间范围内自动定时亮灯,满足常规夜间照明需求;

2)根据环境光照实时调整开关灯,实现"按需照明";

3)通过上下限阈值(带回差)避免频繁闪烁,提高系统稳定性;

4)建立清晰控制优先级,保证特殊天气或突发光照变化时照明安全。

本设计的自动路灯监控系统,以单片机为核心,利用数码管实现时间(分、秒)显示和光照百分比显示,通过按键切换显示内容;用户可设置开灯时间段以及光照上下限阈值;系统采用"光照权限优先于时间段控制"的策略,在光照触发条件下无论是否处于设定时间段都执行光照控制,时间段控制仅在光照条件允许时生效,从而实现更加合理的智能路灯管理。

2.2 系统设计目标

根据题目要求,本系统需实现以下功能目标:

1)时间显示:数码管实时显示分、秒(MM:SS),直观反映当前运行时间状态。

2)光照检测与显示:光敏传感器检测环境光照强度,将光照转换为百分比并在数码管显示;通过按键切换显示内容,可选择显示时间或光照。

3)自动开灯控制(定时):用户可设置路灯开灯时间段,在该时间段内系统自动控制LED灯亮起,实现定时照明。

4)光照上下限设置:允许用户设置光照下限与上限阈值,低于下限自动开灯,高于上限自动关灯,以适应环境变化。

5)控制优先级:光照权限优先于时间段控制,即光照触发时无论是否在预设时间段内都执行光照控制;时间段控制仅在光照条件允许时才生效。

2.3 系统总体结构

系统由以下模块构成:

1)单片机主控模块:负责采集光照、计时、按键处理、阈值判断、优先级决策、LED控制和显示驱动。

2)时基与计时模块:利用定时器产生1秒节拍,实现分秒计时。

3)光敏传感器采集模块:光敏电阻或光照传感器输出模拟电压,经ADC转换为数字量并映射为光照百分比。

4)数码管显示模块:动态扫描显示分秒或光照百分比。

5)按键输入模块:用于切换显示内容、进入设置模式、调整开灯时间段与光照上下限阈值。

6)LED路灯驱动模块:控制LED灯(可模拟路灯),可采用三极管或MOSFET驱动以适应较大电流。

7)参数存储模块(可选):将用户设置的时间段与阈值写入EEPROM/Flash,实现断电保存。

8)电源模块:提供稳定电源并具备滤波与保护,提升抗干扰能力。

2.4 系统工作流程概述

1)上电初始化:配置GPIO、ADC、定时器、数码管扫描、按键扫描、参数读取(默认或存储读取)。

2)计时更新:每1秒更新分秒计时。

3)采集光照:周期采样光敏传感器,滤波后得到光照百分比。

4)按键处理:支持显示切换(时间/光照)、进入设置并调整参数。

5)控制决策:根据光照阈值与时间段判断路灯开关,并执行"光照优先"逻辑。

6)输出执行:控制LED亮灭;数码管显示当前选择的显示内容。

7)循环运行:持续监控与动态响应环境变化。

3、系统功能设计详解

3.1 时间显示功能设计

3.1.1 分秒计时方式

系统需实时显示分、秒,因此需要稳定的1秒时基。常见实现方式:

1)定时器中断:配置硬件定时器产生1ms中断,然后累加到1000ms生成1秒事件。

2)RTC实时时钟芯片(扩展):可获得真实时间(时分秒日期),但题目只要求分秒显示,因此使用内部定时器即可满足。

本设计采用定时器中断法:

  • 每1秒触发一次"秒++",当秒=60时秒清零、分++。
  • 分的范围可循环0~59(演示用),也可以无限累加(便于统计系统运行时间)。

3.1.2 数码管显示格式

时间显示采用MM:SS形式:

  • 两位显示分钟,两位显示秒钟,中间可用数码管小数点或独立LED模拟"冒号"。
  • 若仅使用4位数码管,可设置第二位与第三位之间的小数点闪烁表示冒号。
  • 刷新频率应高于100Hz,避免闪烁。

3.2 光照检测与显示功能设计

3.2.1 光敏传感器检测原理

常见光敏检测方案:

1)光敏电阻(LDR):随光照增强阻值减小,构成分压输出模拟电压,成本低,适合本设计。

2)光照数字传感器(BH1750等):I2C输出光照值(lux),精度高但成本稍高。

题目强调"光敏传感器检测光照并显示百分比",因此采用LDR+电阻分压+ADC采样即可。

3.2.2 光照百分比换算

ADC采样值范围为0ADC_MAX(如10位ADC为01023,12位ADC为04095)。将其映射到0100%:

  • LuxPercent = (ADC_Value / ADC_MAX) * 100%
    需要注意:LDR分压输出随光照变化方向可能与直觉相反(光强越大电压越大或越小取决于分压方式),因此需在软件中进行方向调整:
  • 若ADC值越大表示越暗,则百分比可取:Percent = 100 - (ADC/ADC_MAX*100)。

3.2.3 光照显示方式

光照显示建议采用"百分比"显示,例如:

  • L=075 表示光照75%(若数码管位数允许可显示L符号,若不允许则直接显示075)。
  • 若只有两位数码管显示,可显示0~99%,超过99显示99。

3.2.4 采样滤波与稳定性

光照采样容易受到瞬时阴影、车辆灯光、树叶摆动等影响,因此应加入滤波:

1)滑动平均:连续采集N次求平均。

2)指数滤波:新值与旧值加权。

3)中值滤波:抑制尖峰。

并可设置"变化阈值"或"确认时间",例如连续3次采样均低于下限才开灯,避免误动作。

3.3 显示内容切换功能设计

系统要求"按键切换显示内容,选择显示光照或时间"。因此需要:

1)DisplayMode变量:TIME或LIGHT。

2)按键触发切换:每次按下切换一次显示模式。

3)显示内容刷新:

  • TIME模式:显示MM:SS
  • LIGHT模式:显示光照百分比

该功能本质是"界面状态机"设计,需保证切换时显示稳定、不闪烁。

3.4 自动开灯控制(定时照明)功能设计

3.4.1 时间段定义

用户可设置开灯时间段,例如:StartTime与EndTime。

由于系统仅显示分秒(MM:SS),为了简化,本设计采用"运行时间段"概念,即以系统运行计时作为参考:

  • 当当前分钟秒值落入设定范围时,满足时间段条件。

若用于真实路灯,建议采用RTC获得真实"时分秒"并设定"晚18:00~次日6:00"的时间段。本设计仍可扩展,但按题目要求可使用分秒段控制即可。

3.4.2 时间段跨界问题

时间段可能出现"跨零点"或跨周期情况:

  • Start < End:正常区间,例如 10:00 ~ 20:00(以分钟秒表示)
  • Start > End:跨界区间,例如 50:00 ~ 10:00(表示跨过60分钟循环)

在本设计中可使用通用判断:

1)若Start <= End:在[Start, End)内为真。

2)若Start > End:在[Start, 60:00)或[00:00, End)内为真。

这样系统的时间段判断更加完整可靠。

3.4.3 时间段控制输出逻辑

当"时间段有效"且光照条件允许时,系统控制LED亮起;否则关灯。这里强调"光照优先"将在后续章节详细说明。

3.5 光照上下限阈值设置功能设计

3.5.1 上下限阈值的意义

光照控制若只有一个阈值,会在临界点附近频繁开关灯,出现"抖动"。因此采用上下限阈值形成回差:

  • Light_Low:下限阈值
  • Light_High:上限阈值
    当光照低于下限时开灯,当光照高于上限时关灯,光照介于上下限之间保持原状态,从而避免频繁开关。

3.5.2 光照控制状态机

定义LightCtrlState:

  • LAMP_ON:灯已开启
  • LAMP_OFF:灯已关闭

控制规则:

1)若光照 < Light_Low:强制灯开(进入LAMP_ON)。

2)若光照 > Light_High:强制灯关(进入LAMP_OFF)。

3)若光照在Light_Low, Light_High之间:保持当前状态。

这种"回差控制"是工程中非常常用且可靠的方法。

3.5.3 阈值设置与约束

用户设置阈值时需要约束:

  • Light_Low < Light_High
    若用户设置导致不满足条件,系统可:
    1)自动调整:将High设为Low+5(最小差值);
    2)拒绝保存:提示错误并恢复旧值;
    3)进入设置时先设置Low,再设置High并确保合理。

3.6 灯光控制优先级设计(光照优先于时间)

题目要求明确:光照权限优先于时间段控制,即:

  • 当光照条件触发时,无论是否在预设时间段内都执行光照控制;
  • 时间段控制仅在光照条件允许时生效。

为了实现这一逻辑,需要把灯光控制分为两层:

1)光照层(最高优先级):

  • 若光照 < Low:必须开灯(强制开)
  • 若光照 > High:必须关灯(强制关)
  • 若光照在区间内:光照层不强制,交由时间层决定

2)时间层(次优先级):

  • 若处于开灯时间段:开灯
  • 若不处于开灯时间段:关灯

最终输出逻辑:

  • 若光照层给出强制结果,则执行强制结果;
  • 否则执行时间层结果。

这种设计不仅满足题意,还保证在阴天、雾天等光照不足场景中,即便不在设定时间段也能自动开启,提高安全性;同时在光照充足时,即便处于设定时间段也可关闭路灯,节能效果显著。

4、系统电路设计(模块化详细说明)

4.1 电源模块

4.1.1 功能说明

电源模块为单片机、数码管、光敏传感器、LED灯提供稳定电压。若系统模拟路灯为高亮LED或灯带,电流较大,因此电源需具备足够电流能力。

4.1.2 设计要点

1)输入电源:常用5V适配器或12V转5V模块。

2)稳压:

  • 12V→5V:DC-DC降压效率高。
  • 5V→3.3V(如需要):LDO供给MCU或传感器。
    3)滤波:输入端电解电容+0.1uF去耦电容;数码管附近加电容降低扫描导致的电压波动。
    4)保护:反接保护、保险丝或自恢复保险丝、TVS浪涌抑制。

4.2 单片机主控模块

4.2.1 功能说明

主控单片机负责:

1)定时计时(分秒)

2)ADC采集光照并换算百分比

3)数码管动态扫描显示

4)按键交互与参数设置

5)灯光控制决策与输出

6)参数存储(可选)

可选MCU:

  • 51单片机:资源有限但足够实现功能
  • AVR或STM32:资源丰富,便于扩展显示、存储与通信

4.2.2 电路要点

1)时钟:外部晶振保证计时准确、扫描稳定。

2)复位:上电复位电路确保可靠启动。

3)ADC参考:若精度要求高,可使用稳定基准电压或做好电源滤波。

4)IO驱动能力:数码管位选/段选可用三极管或驱动芯片。

4.3 光敏传感器采集模块

4.3.1 光敏电阻分压电路

光敏电阻与固定电阻组成分压,输出接ADC:

1)光敏电阻阻值随光变化。

2)选择固定电阻阻值与LDR暗/亮阻值匹配,使输出在常用光照范围变化明显。

3)输出加RC滤波抑制噪声与抖动。

4.3.2 信号稳定与抗干扰

1)ADC输入端串联小电阻保护。

2)布线短且远离数码管扫描高速线。

3)必要时使用屏蔽或加地环绕降低干扰。

4.4 数码管显示模块

4.4.1 动态扫描结构

数码管显示需要段选与位选:

1)段选输出a~g、dp。

2)位选控制每位数码管公共端。

3)扫描周期1~2ms,保证显示稳定。

4.4.2 驱动方式

1)直接驱动(小电流数码管):GPIO+限流电阻。

2)三极管驱动:提高亮度并减轻MCU负载。

3)驱动芯片扩展:74HC595移位寄存器或MAX7219简化接口。

4.5 按键输入模块

按键用于切换显示模式和设置参数:

1)MODE键:显示切换(时间/光照)

2)SET键:进入设置模式

3)UP键:参数增加

4)DOWN键:参数减少

5)OK键:确认保存并退出(可选)

电路要点:

  • 上拉输入方式,按下为低电平
  • 软件消抖为主,必要时RC消抖辅助
  • 按键线尽量短,避免干扰误触发

4.6 LED路灯驱动模块

4.6.1 LED控制方式

LED可作为路灯模拟输出:

1)小功率LED:GPIO直接驱动(需限流)。

2)高亮LED或灯带:使用三极管/MOSFET驱动并外接电源。

4.6.2 MOSFET低边驱动设计要点

1)采用逻辑电平MOSFET,确保3.3V/5V门极可完全导通。

2)并联续流二极管(若驱动感性负载,如继电器)

3)门极串联电阻与下拉电阻防止误触发。

4.7 参数存储模块(可选)

为实现断电保存,系统可使用:

1)单片机内部Flash模拟EEPROM

2)外部EEPROM(如24C02)

保存内容包括:

  • 开灯时间段Start、End
  • 光照下限Low、上限High
    保存策略:仅在用户确认保存时写入,延长存储寿命。

5、系统程序设计(模块化详细说明)

5.1 软件总体架构

采用"定时任务 + 状态机"结构:

1)1ms定时中断:

  • 数码管扫描
  • 按键扫描计时
  • 软定时器累加生成1秒事件
    2)1秒事件:
  • 分秒计时更新
  • 光照采样滤波(也可更快周期采样)
  • 控制决策执行(灯开关)
    3)主循环:
  • 处理按键事件
  • 界面状态更新(显示内容切换、设置界面)
  • 参数保存与显示刷新

核心模块划分:

1)TimeKeeper(分秒计时)

2)LightSensor(ADC采样与百分比换算)

3)Display (数码管显示与动态扫描)

4)KeyInput(按键扫描与消抖)

5)Config(参数设置、校验与保存)

6)LampControl(优先级控制策略)

5.2 分秒计时模块设计

1)变量:minute、second。

2)每1秒触发:second++,到60清零并minute++。

3)minute可循环0~59或继续累加,显示时取余。

为减少误差,建议使用定时器中断累加时间,而不是软件延时。

5.3 光照采集与滤波模块设计

1)每200ms采样一次ADC,得到adc_raw。

2)将adc_raw映射为0~100%光照值。

3)滤波:

  • percent = 0.8percent_old + 0.2 percent_new
    4)输出稳定的LightPercent用于显示与控制。

并可增加异常检测:ADC值异常(如断线导致恒为0或满量程)时提示故障并采用安全策略(例如默认开灯)。

5.4 显示模块设计(数码管动态扫描)

5.4.1 显示缓冲区设计

定义display_buf4保存四位数字:

  • TIME模式:显示MMSS
  • LIGHT模式:显示0~100%(例如"0750"表示75.0%,或"0075"表示75%)

5.4.2 扫描函数设计

每1ms切换一位:

1)关闭全部位选

2)输出段码

3)打开当前位选

4)index++循环

刷新频率足够高则显示稳定。

5.5 按键扫描与消抖模块设计

5.5.1 扫描策略

每10ms读取按键状态:

1)连续稳定状态达到3次判定为有效按键。

2)采用边沿触发只产生一次事件。

3)长按可实现快速加减(设置阈值时很有用)。

5.5.2 按键功能分配

  • MODE:显示模式切换
  • SET:进入设置状态
  • UP/DOWN:调整参数
  • OK:保存并退出
  • 长按SET:恢复默认参数或复位(可选)

5.6 参数设置模块设计

设置内容包括:

1)开灯时间段Start_Min:Start_Sec、End_Min:End_Sec(或简化为秒数)。

2)光照下限Light_Low(0~100)

3)光照上限Light_High(0~100)

设置流程:

1)按SET进入设置:依次设置Start、End、Low、High。

2)UP/DOWN调整数值。

3)OK保存并退出。

4)每一步都进行范围约束与上下限关系校验。

为了减少操作复杂度,也可以把时间段用"开始分钟、结束分钟"表示,仅设置分钟即可,但题目要求显示分秒,因此本设计支持分秒。

5.7 路灯控制模块(优先级策略实现)

该模块是系统核心逻辑,应清晰表达"光照优先"原则。

1)首先计算光照层控制结果:

  • if LightPercent < Low → ForceOn
  • else if LightPercent > High → ForceOff
  • else → NoForce
    2)如果NoForce,则计算时间段层结果:
  • if NowInTimeRange → TimeOn
  • else → TimeOff
    3)最终输出:
  • ForceOn/ForceOff优先
  • 否则执行TimeOn/TimeOff

并配合回差控制,保持灯状态稳定。

6、参考程序示例(核心逻辑可移植)

c 复制代码
/************************************************************
 * 基于单片机的自动路灯监控系统(示例代码)
 * 功能:
 * 1) 数码管显示:时间(分秒) / 光照百分比(按键切换)
 * 2) 定时开灯:用户设置开灯时间段
 * 3) 光照阈值开关灯:低于下限开灯,高于上限关灯
 * 4) 优先级:光照控制优先于时间段控制
 ************************************************************/

#include <stdint.h>
#include <stdbool.h>

/*==================== 参数范围 ====================*/
#define LIGHT_MIN   0
#define LIGHT_MAX   100

/*==================== 默认参数 ====================*/
static uint8_t  g_lightLow  = 30;   // 光照下限(%):低于此开灯
static uint8_t  g_lightHigh = 60;   // 光照上限(%):高于此关灯

/* 时间段:用秒表示,便于比较(0~3599,表示00:00~59:59循环) */
static uint16_t g_startSec = 18 * 60;  // 默认18:00(仅示例,实际分秒显示为MM:SS)
static uint16_t g_endSec   =  6 * 60;  // 默认06:00(跨界区间示例)

/*==================== 系统运行时间(分秒) ====================*/
static uint8_t  g_min = 0;
static uint8_t  g_sec = 0;

/*==================== 光照数据 ====================*/
static uint8_t  g_lightPercent = 0;

/*==================== 显示模式 ====================*/
typedef enum { DISP_TIME=0, DISP_LIGHT } DispMode;
static DispMode g_dispMode = DISP_TIME;

/*==================== 灯状态 ====================*/
static bool g_lampOn = false;

/*==================== 硬件抽象接口(需移植实现) ====================*/
void HW_Init(void);
uint32_t HW_TickMs(void);

/* ADC采样:返回0~ADC_MAX */
uint16_t HW_ADC_Read(void);
uint16_t HW_ADC_Max(void);

/* 数码管显示:设置显示缓冲区并动态扫描 */
void HW_Display_SetDigits(uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3); // 4位数码管示例

/* 按键 */
bool HW_Key_MODE(void);
bool HW_Key_SET(void);
bool HW_Key_UP(void);
bool HW_Key_DOWN(void);
bool HW_Key_OK(void);

/* LED路灯 */
void HW_Lamp(bool on);

/* 存储(可选) */
bool HW_LoadParams(uint16_t *startSec, uint16_t *endSec, uint8_t *low, uint8_t *high);
void HW_SaveParams(uint16_t startSec, uint16_t endSec, uint8_t low, uint8_t high);

/*==================== 工具:限幅 ====================*/
static uint8_t clamp_u8(int v, int minv, int maxv) {
    if (v < minv) return (uint8_t)minv;
    if (v > maxv) return (uint8_t)maxv;
    return (uint8_t)v;
}

/*==================== 时间转换:分秒 -> 秒 ====================*/
static uint16_t toSec(uint8_t m, uint8_t s) {
    return (uint16_t)m * 60 + s;
}

/*==================== 时间段判断(支持跨界) ====================*/
static bool inTimeRange(uint16_t now, uint16_t start, uint16_t end) {
    if (start <= end) {
        return (now >= start && now < end);
    } else {
        /* 跨界:例如50:00~10:00 => [50:00,60:00)或[00:00,10:00) */
        return (now >= start || now < end);
    }
}

/*==================== 光照采样与百分比换算 ====================*/
static uint8_t lightPercentFromADC(uint16_t adc, uint16_t adcMax) {
    /* 示例:adc越大表示越亮(若相反可用100-xxx) */
    uint32_t p = (uint32_t)adc * 100 / adcMax;
    if (p > 100) p = 100;
    return (uint8_t)p;
}

/* 指数滤波(简单) */
static uint8_t filterLight(uint8_t last, uint8_t now) {
    /* 0.8*last + 0.2*now */
    return (uint8_t)((last * 8 + now * 2) / 10);
}

/*==================== 灯控制优先级逻辑 ====================*/
static void LampControl_Update(void) {
    bool forceValid = false;
    bool forceOn = false;

    /* 光照层:优先级最高 */
    if (g_lightPercent < g_lightLow) {
        forceValid = true;
        forceOn = true;
    } else if (g_lightPercent > g_lightHigh) {
        forceValid = true;
        forceOn = false;
    }

    if (forceValid) {
        g_lampOn = forceOn;
    } else {
        /* 光照允许:执行时间段控制 */
        uint16_t now = toSec(g_min, g_sec);
        bool timeOn = inTimeRange(now, g_startSec, g_endSec);
        g_lampOn = timeOn;
    }

    HW_Lamp(g_lampOn);
}

/*==================== 显示刷新 ====================*/
static void Display_Update(void) {
    if (g_dispMode == DISP_TIME) {
        /* 显示MM:SS */
        uint8_t m_tens = g_min / 10;
        uint8_t m_ones = g_min % 10;
        uint8_t s_tens = g_sec / 10;
        uint8_t s_ones = g_sec % 10;
        HW_Display_SetDigits(m_tens, m_ones, s_tens, s_ones);
    } else {
        /* 显示光照百分比:例如 075% 显示为 0 7 5 0 或 0 7 5  */
        uint8_t p = g_lightPercent;
        uint8_t h = p / 100;
        uint8_t t = (p / 10) % 10;
        uint8_t o = p % 10;

        /* 这里用四位显示:0 h t o(h一般为0或1) */
        HW_Display_SetDigits(0, h, t, o);
    }
}

/*==================== 按键边沿检测(简化) ====================*/
static bool edge(bool now, bool *last) {
    bool e = (!(*last) && now);
    *last = now;
    return e;
}

/*==================== 主程序 ====================*/
int main(void) {
    HW_Init();

    /* 读取参数(可选) */
    uint16_t s, e;
    uint8_t low, high;
    if (HW_LoadParams(&s, &e, &low, &high)) {
        g_startSec = s;
        g_endSec = e;
        g_lightLow = low;
        g_lightHigh = high;
    }

    uint32_t last1s = HW_TickMs();
    uint32_t lastSample = HW_TickMs();
    uint32_t lastDisp = HW_TickMs();

    bool lastMODE=false;

    while (1) {
        uint32_t nowMs = HW_TickMs();

        /* 1秒计时 */
        if (nowMs - last1s >= 1000) {
            last1s += 1000;

            g_sec++;
            if (g_sec >= 60) {
                g_sec = 0;
                g_min++;
                if (g_min >= 60) g_min = 0;
            }

            /* 每秒更新一次控制决策 */
            LampControl_Update();
        }

        /* 光照采样(例如200ms一次) */
        if (nowMs - lastSample >= 200) {
            lastSample += 200;

            uint16_t adc = HW_ADC_Read();
            uint8_t pNew = lightPercentFromADC(adc, HW_ADC_Max());
            g_lightPercent = filterLight(g_lightPercent, pNew);
        }

        /* 显示刷新(例如50ms) */
        if (nowMs - lastDisp >= 50) {
            lastDisp += 50;
            Display_Update();
        }

        /* MODE键:切换显示内容 */
        bool m = HW_Key_MODE();
        if (edge(m, &lastMODE)) {
            g_dispMode = (g_dispMode == DISP_TIME) ? DISP_LIGHT : DISP_TIME;
        }

        /* 其他按键:SET/UP/DOWN/OK进入参数设置(此处仅给结构,具体见下文扩展) */
        /* 可实现设置界面状态机:设置开灯时间段、设置光照Low/High并保存 */
    }

    return 0;
}

7、参数设置界面与逻辑实现建议(程序模块扩展说明)

7.1 设置界面状态机设计

为了实现"开灯时间段设置 + 光照上下限设置",可定义设置状态:

1)CFG_NONE:正常运行

2)CFG_SET_START_MIN:设置开始分钟

3)CFG_SET_START_SEC:设置开始秒

4)CFG_SET_END_MIN:设置结束分钟

5)CFG_SET_END_SEC:设置结束秒

6)CFG_SET_LOW:设置光照下限

7)CFG_SET_HIGH:设置光照上限

8)CFG_SAVE:保存并退出

按键逻辑:

  • SET:进入设置或切换下一个设置项
  • UP/DOWN:调整当前项
  • OK:保存并退出
  • 超时无操作自动退出(可选)

7.2 参数校验策略

1)光照阈值必须Low < High,最小差值可设5%。

2)时间段参数必须在0~59范围内。

3)跨界时间段应允许存在。

4)保存时写入EEPROM/Flash,并带校验字节。

7.3 控制策略的稳定性增强

1)光照阈值加入确认次数:连续3次低于下限才开灯,连续3次高于上限才关灯。

2)灯状态最小保持时间:例如灯开启后至少保持30秒,减少抖动。

3)夜间车辆灯光干扰:可设置"短时强光忽略"机制,避免车灯照射导致误关灯。

8、系统测试与验证方案

8.1 功能测试

1)时间显示准确性:运行10分钟,检查分秒递增正确,无跳秒。

2)光照显示一致性:遮挡传感器,观察光照百分比下降;照亮传感器,观察上升。

3)光照阈值控制:设置Low=30、High=60,验证低于30开灯,高于60关灯,30~60保持状态。

4)时间段控制:设置时间段并验证在区间内灯亮,在区间外灯灭。

5)优先级验证:

  • 不在时间段内但光照低于Low → 仍应开灯(光照优先)
  • 在时间段内但光照高于High → 仍应关灯(光照优先)
  • 光照在区间内 → 由时间段决定灯状态

8.2 稳定性测试

1)光照临界点抖动测试:在Low/High附近缓慢变化,检查灯不频繁闪烁。

2)按键快速触发测试:连按MODE与SET,显示切换与设置不紊乱。

3)长时间运行测试:连续运行数小时,确认无死机与显示异常。

9、总结

本设计完成了基于单片机的自动路灯监控系统,实现了时间(分、秒)显示、光照检测与百分比显示、按键切换显示内容、开灯时间段设置、光照上下限阈值设置以及路灯自动控制等功能。系统采用回差控制与滤波策略提高光照判断稳定性,避免灯光频繁闪烁;并按照"光照权限优先于时间段控制"的核心要求实现优先级决策,使系统既能在光照不足时及时开启路灯保障安全,又能在光照充足时自动关闭路灯实现节能。通过模块化电路设计与状态机程序结构,该系统具有良好的可靠性、可扩展性与工程应用价值,可用于道路照明控制教学演示及小型智能照明场景的实际应用。

相关推荐
隔窗听雨眠1 小时前
在STM32上跑通TinyML:从模型训练到推理优化的完整实战指南
stm32·单片机·嵌入式硬件
ryanuo73 小时前
Mac(M芯片)上进行嵌入式开发遇到的问题
嵌入式硬件·macos·开发板
机器视觉知识推荐、就业指导4 小时前
为什么同一个引脚不能同时做按键和串口
stm32·单片机·嵌入式硬件
崇山峻岭之间4 小时前
单片机基本定时器实验
单片机·嵌入式硬件
DS小龙哥4 小时前
基于ESP32设计的智能养蜂监测系统
stm32·单片机·嵌入式硬件·物联网·华为云
夜月yeyue5 小时前
STM32 DMA 双缓冲采样
linux·stm32·单片机·嵌入式硬件·系统架构
羊羊小栈5 小时前
Uplift营销供应链协同决策系统(基于Uplift因果推断与运筹优化算法)
前端·人工智能·算法·毕业设计·大作业
西城微科方案开发5 小时前
SIC8P370D2L-PLP16 8位OTP单片机 低功耗多功能MCU详解
单片机·嵌入式硬件
踏着七彩祥云的小丑8 小时前
嵌入式测试第 32 天:升级测试:固件OTA升级、断点续传、回滚测试
单片机·嵌入式硬件·学习
点灯小铭8 小时前
基于单片机与DAC0832的双路波形信号发生系统设计
数据库·单片机·mongodb·毕业设计·课程设计·期末大作业