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