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

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、总结

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

相关推荐
polarislove02149 小时前
10.1 [ADC] 逐次逼近型ADC-嵌入式铁头山羊STM32笔记
笔记·stm32·嵌入式硬件
谈思汽车9 小时前
TEE or HSM/SE?车载安全技术选型指南
嵌入式硬件·安全·智能汽车·可信执行环境·汽车信息安全
单片机系统设计9 小时前
基于STM32的智能垃圾桶/语音分类/自动开盖/矩阵按键
stm32·矩阵·毕业设计·语音识别·智能垃圾桶
-曾牛10 小时前
【汇编语言入门】从第一个加法程序吃透汇编核心基础
汇编·单片机·嵌入式硬件·汇编语言·病毒分析·lcx·逆向开发
IT方大同10 小时前
ADC&DAC概述
嵌入式硬件
luoluoal11 小时前
基于python的某在线中药店销售数据统计与分析系统(源码+文档)
python·mysql·django·毕业设计·源码
三品吉他手会点灯11 小时前
STM32F103 学习笔记-21-串口通信(第3节)-STM32串口初始化结构体和固件库讲解
笔记·stm32·单片机·嵌入式硬件·学习
Lester_110111 小时前
单片机EEPROM写入数据之前为什么要先擦除?
单片机·嵌入式软件
点灯小铭11 小时前
基于单片机的多功能LCD万年历时钟设计与温度显示系统
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
点灯小铭11 小时前
基于单片机的玉米播种机漏播检测装置设计与实现
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业