欢迎光临
我们一直在努力

WiFi 智能 LED 调光台灯 —— 硬件设计全流程解析

硬件设计 解析与方案库:

完整设计方案,包括系统框图、关键器件选型、软件流程图;

模块化代码与电路:提供ADC采样、PWM生成、OLED显示、无线通信等模块的驱动代码与电路原理图;

测试报告范例:作品性能测试表、误差分析报告、设计报告评分标准解析。

解析与方案库(完整设计方案,系统框图,关键器件选型,软件流程图),模块化代码与电路(ADC采样、PWM生成、OLED显示、无线通信等模块的驱动代码与电路原理图),测试报告范例,详细深入精确地概述整个设计开发过程中的机理、方法、步骤、方案。

需求:硬件设计手册。做一个“WiFi智能LED调光台灯“,包括光强传感器 (ADC)、PWM调节LED灯、OLED显示、WiFi无线通信 (MQTT),温度传感器可选。这样覆盖所有要求模块。这次强调硬件设计部分,从原理图设计、PCB布局、抗干扰等方面深入。

要求更深入的硬件细节,电路原理图解析,PCB设计指导,抗干扰措施等。

因此,设计一个“WiFi智能LED调光台灯”,具有手动/自动模式:光敏电阻检测环境光,ADC采样,PID或简单算法自动调节PWM以维持桌面照度,也可通过手机设定亮度。WiFi通信使用ESP8266,OLED显示。这能展示ADC、PWM、OLED、无线通信。

在方案中构建一个以“WiFi智能LED调光台灯”为实例的硬件设计手册。内容结构:

  • 项目概述与文件结构

  • 系统总体设计(需求分析,框图,选型)

  • 软件流程图

  • 硬件电路设计详解

    • 电源电路

    • 光敏电阻ADC采样电路

    • LED驱动PWM电路

    • OLED I2C电路

    • ESP8266 WiFi电路

    • 整体原理图说明

  • 模块化驱动代码

    • ADC采样代码(带校准)

    • PWM生成

    • OLED显示

    • WiFi与MQTT

  • UML建模:类图、时序图

  • 测试报告范例(性能测试数据,误差分析,评分标准)

  • 硬件调试与抗干扰设计

  • 总结

  • 这是一份以 “WiFi智能LED调光台灯” 为实例的完整硬件设计手册,详细涵盖模拟信号采集、PWM驱动、OLED显示与无线通信的电路原理、驱动代码、测试方法,并提供UML建模与项目组织方案。


    WiFi 智能 LED 调光台灯 —— 硬件设计全流程解析

    1. 项目文件结构组织

    规范的硬件项目应包含原理图、PCB、固件和测试文档。

    SmartLamp/
    ├── hardware/ # 硬件设计文件
    │ ├── schematic/ # 原理图(PDF + 源文件)
    │ ├── pcb/ # PCB Layout
    │ └── bom.xlsx # 物料清单
    ├── firmware/ # 固件源码
    │ ├── Core/
    │ │ ├── Inc/ # 头文件
    │ │ │ ├── adc.h
    │ │ │ ├── pwm.h
    │ │ │ ├── oled.h
    │ │ │ ├── wifi.h
    │ │ │ ├── mqtt.h
    │ │ │ └── main.h
    │ │ └── Src/ # 源文件
    │ │ ├── adc.c
    │ │ ├── pwm.c
    │ │ ├── oled.c
    │ │ ├── wifi.c
    │ │ ├── mqtt.c
    │ │ └── main.c
    │ └── Makefile
    ├── tests/
    │ └── lamp_test.py # 自动化测试脚本
    ├── docs/
    │ ├── datasheets/ # 器件数据手册
    │ └── test_report.md # 测试报告
    └── README.md

    2. 系统总体设计(解析与方案库)

    2.1 设计目标

    设计一盏可自动调节亮度的 LED 台灯,能够感应环境光强度,自动维持桌面照度恒定,同时支持手机通过 WiFi 进行远程亮暗控制。要求:

    • 照度自动补偿:环境变暗时自动增加灯亮度,反之变暗,保持桌面照度稳定。
    • 手动模式:通过 MQTT 直接设定 LED 亮度百分比。
    • 本地显示:OLED 显示当前环境光强 (lux)、LED 占空比、WiFi 连接状态。

    2.2 系统框图

    #mermaid-svg-uSUSuqXdifgSvTMm{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-uSUSuqXdifgSvTMm .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-uSUSuqXdifgSvTMm .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-uSUSuqXdifgSvTMm .error-icon{fill:#552222;}#mermaid-svg-uSUSuqXdifgSvTMm .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-uSUSuqXdifgSvTMm .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-uSUSuqXdifgSvTMm .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-uSUSuqXdifgSvTMm .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-uSUSuqXdifgSvTMm .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-uSUSuqXdifgSvTMm .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-uSUSuqXdifgSvTMm .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-uSUSuqXdifgSvTMm .marker{fill:#333333;stroke:#333333;}#mermaid-svg-uSUSuqXdifgSvTMm .marker.cross{stroke:#333333;}#mermaid-svg-uSUSuqXdifgSvTMm svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-uSUSuqXdifgSvTMm p{margin:0;}#mermaid-svg-uSUSuqXdifgSvTMm .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-uSUSuqXdifgSvTMm .cluster-label text{fill:#333;}#mermaid-svg-uSUSuqXdifgSvTMm .cluster-label span{color:#333;}#mermaid-svg-uSUSuqXdifgSvTMm .cluster-label span p{background-color:transparent;}#mermaid-svg-uSUSuqXdifgSvTMm .label text,#mermaid-svg-uSUSuqXdifgSvTMm span{fill:#333;color:#333;}#mermaid-svg-uSUSuqXdifgSvTMm .node rect,#mermaid-svg-uSUSuqXdifgSvTMm .node circle,#mermaid-svg-uSUSuqXdifgSvTMm .node ellipse,#mermaid-svg-uSUSuqXdifgSvTMm .node polygon,#mermaid-svg-uSUSuqXdifgSvTMm .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-uSUSuqXdifgSvTMm .rough-node .label text,#mermaid-svg-uSUSuqXdifgSvTMm .node .label text,#mermaid-svg-uSUSuqXdifgSvTMm .image-shape .label,#mermaid-svg-uSUSuqXdifgSvTMm .icon-shape .label{text-anchor:middle;}#mermaid-svg-uSUSuqXdifgSvTMm .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-uSUSuqXdifgSvTMm .rough-node .label,#mermaid-svg-uSUSuqXdifgSvTMm .node .label,#mermaid-svg-uSUSuqXdifgSvTMm .image-shape .label,#mermaid-svg-uSUSuqXdifgSvTMm .icon-shape .label{text-align:center;}#mermaid-svg-uSUSuqXdifgSvTMm .node.clickable{cursor:pointer;}#mermaid-svg-uSUSuqXdifgSvTMm .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-uSUSuqXdifgSvTMm .arrowheadPath{fill:#333333;}#mermaid-svg-uSUSuqXdifgSvTMm .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-uSUSuqXdifgSvTMm .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-uSUSuqXdifgSvTMm .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-uSUSuqXdifgSvTMm .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-uSUSuqXdifgSvTMm .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-uSUSuqXdifgSvTMm .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-uSUSuqXdifgSvTMm .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-uSUSuqXdifgSvTMm .cluster text{fill:#333;}#mermaid-svg-uSUSuqXdifgSvTMm .cluster span{color:#333;}#mermaid-svg-uSUSuqXdifgSvTMm div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-uSUSuqXdifgSvTMm .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-uSUSuqXdifgSvTMm rect.text{fill:none;stroke-width:0;}#mermaid-svg-uSUSuqXdifgSvTMm .icon-shape,#mermaid-svg-uSUSuqXdifgSvTMm .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-uSUSuqXdifgSvTMm .icon-shape p,#mermaid-svg-uSUSuqXdifgSvTMm .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-uSUSuqXdifgSvTMm .icon-shape .label rect,#mermaid-svg-uSUSuqXdifgSvTMm .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-uSUSuqXdifgSvTMm .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-uSUSuqXdifgSvTMm .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-uSUSuqXdifgSvTMm :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    分压

    I2C

    UART2

    WiFi

    MQTT

    PWM TIM3_CH1

    光敏电阻 GL5528

    STM32 ADC_IN0

    STM32F103C8T6 主控

    0.96寸 OLED SSD1306

    ESP8266 WiFi 模块

    无线路由器

    手机 App

    恒流 LED 驱动 PAM2803

    3W 白光 LED

    5V USB 供电

    升压模块 MT3608 -> 12V 供 LED

    AMS1117-3.3

    2.3 关键器件选型

    器件型号核心参数选型理由
    主控 STM32F103C8T6 72MHz, 12位ADC, 多路PWM 性能足够,接口丰富,开发工具链成熟
    光传感器 GL5528 光敏电阻 亮阻 10kΩ,暗阻 1MΩ 成本极低,配合10kΩ分压即可接入ADC
    LED 驱动 PAM2803 350mA 恒流,PWM 调光 高效恒流驱动大功率LED,避免烧毁
    LED 3W 暖白 LED 700mA max, 3.2V forward 亮度满足桌面阅读需求
    显示 SSD1306 OLED 0.96", I2C, 128×64 体积小,省电,接口简单
    WiFi ESP-01 (ESP8266) 802.11 b/g/n, AT 固件 性价比高,串口透传,MQTT AT 指令集
    电源 5V/2A USB 适配器 通用供电,通过升压模块产生12V给LED
    LDO AMS1117-3.3 1A 输出 为 MCU/ESP/OLED 提供稳定 3.3V

    2.4 软件流程图

    采用前后台系统,定时器每 200ms 触发一次环境光采集与自动调光;同时 MQTT 消息可打断并切换到手动模式。

    #mermaid-svg-MYevRRVQSIrQRL5s{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-MYevRRVQSIrQRL5s .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-MYevRRVQSIrQRL5s .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-MYevRRVQSIrQRL5s .error-icon{fill:#552222;}#mermaid-svg-MYevRRVQSIrQRL5s .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-MYevRRVQSIrQRL5s .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-MYevRRVQSIrQRL5s .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-MYevRRVQSIrQRL5s .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-MYevRRVQSIrQRL5s .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-MYevRRVQSIrQRL5s .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-MYevRRVQSIrQRL5s .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-MYevRRVQSIrQRL5s .marker{fill:#333333;stroke:#333333;}#mermaid-svg-MYevRRVQSIrQRL5s .marker.cross{stroke:#333333;}#mermaid-svg-MYevRRVQSIrQRL5s svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-MYevRRVQSIrQRL5s p{margin:0;}#mermaid-svg-MYevRRVQSIrQRL5s .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-MYevRRVQSIrQRL5s .cluster-label text{fill:#333;}#mermaid-svg-MYevRRVQSIrQRL5s .cluster-label span{color:#333;}#mermaid-svg-MYevRRVQSIrQRL5s .cluster-label span p{background-color:transparent;}#mermaid-svg-MYevRRVQSIrQRL5s .label text,#mermaid-svg-MYevRRVQSIrQRL5s span{fill:#333;color:#333;}#mermaid-svg-MYevRRVQSIrQRL5s .node rect,#mermaid-svg-MYevRRVQSIrQRL5s .node circle,#mermaid-svg-MYevRRVQSIrQRL5s .node ellipse,#mermaid-svg-MYevRRVQSIrQRL5s .node polygon,#mermaid-svg-MYevRRVQSIrQRL5s .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-MYevRRVQSIrQRL5s .rough-node .label text,#mermaid-svg-MYevRRVQSIrQRL5s .node .label text,#mermaid-svg-MYevRRVQSIrQRL5s .image-shape .label,#mermaid-svg-MYevRRVQSIrQRL5s .icon-shape .label{text-anchor:middle;}#mermaid-svg-MYevRRVQSIrQRL5s .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-MYevRRVQSIrQRL5s .rough-node .label,#mermaid-svg-MYevRRVQSIrQRL5s .node .label,#mermaid-svg-MYevRRVQSIrQRL5s .image-shape .label,#mermaid-svg-MYevRRVQSIrQRL5s .icon-shape .label{text-align:center;}#mermaid-svg-MYevRRVQSIrQRL5s .node.clickable{cursor:pointer;}#mermaid-svg-MYevRRVQSIrQRL5s .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-MYevRRVQSIrQRL5s .arrowheadPath{fill:#333333;}#mermaid-svg-MYevRRVQSIrQRL5s .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-MYevRRVQSIrQRL5s .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-MYevRRVQSIrQRL5s .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-MYevRRVQSIrQRL5s .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-MYevRRVQSIrQRL5s .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-MYevRRVQSIrQRL5s .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-MYevRRVQSIrQRL5s .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-MYevRRVQSIrQRL5s .cluster text{fill:#333;}#mermaid-svg-MYevRRVQSIrQRL5s .cluster span{color:#333;}#mermaid-svg-MYevRRVQSIrQRL5s div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-MYevRRVQSIrQRL5s .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-MYevRRVQSIrQRL5s rect.text{fill:none;stroke-width:0;}#mermaid-svg-MYevRRVQSIrQRL5s .icon-shape,#mermaid-svg-MYevRRVQSIrQRL5s .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-MYevRRVQSIrQRL5s .icon-shape p,#mermaid-svg-MYevRRVQSIrQRL5s .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-MYevRRVQSIrQRL5s .icon-shape .label rect,#mermaid-svg-MYevRRVQSIrQRL5s .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-MYevRRVQSIrQRL5s .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-MYevRRVQSIrQRL5s .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-MYevRRVQSIrQRL5s :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    收到 lamp/set

    上电

    初始化外设与WiFi连接

    连接MQTT Broker

    订阅主题 lamp/set

    主循环

    200ms 标志?

    读 ADC 换算光照强度

    当前为自动模式?

    PID 计算目标占空比

    更新 PWM 输出

    通过 MQTT 发布当前光强与占空比

    刷新 OLED 显示

    检查 MQTT 消息

    解析设定值

    更新目标亮度,切换手动/自动

    3. 硬件电路设计详解

    3.1 光敏电阻 ADC 采样电路

    电路原理
    GL5528 光敏电阻与固定电阻 R1 (10kΩ) 串联分压,中点接至 MCU 的 PA0 (ADC_IN0)。光线越强,光敏电阻阻值越小,中点电压越高。

    3.3V —- R1 (10kΩ) —-+—- GL5528 —- GND
    |
    +—- PA0 (ADC)

    计算:设光敏电阻值 Rldr,ADC电压 Vout = 3.3V * (Rldr / (R1+Rldr))。
    ADC 12位分辨率,量化值 D = 4095 * Vout / 3.3 = 4095 * Rldr/(R1+Rldr)。
    固件中通过查表或公式将 ADC 值转为 lux。简化处理:直接读取 ADC 值作为环境光强度,范围 0~4095。

    代码实现

    // adc.c
    #include "adc.h"
    extern ADC_HandleTypeDef hadc1;

    uint16_t ADC_ReadLight(void) {
    HAL_ADC_Start(&hadc1);
    if(HAL_ADC_PollForConversion(&hadc1, 5) == HAL_OK) {
    return HAL_ADC_GetValue(&hadc1); // 0~4095
    }
    return 0;
    }

    3.2 LED PWM 恒流驱动电路

    电路
    STM32 的 TIM3_CH1 (PA6) 输出 PWM 信号,经 1kΩ 限流电阻进入 PAM2803 的 EN/PWM 引脚。PAM2803 是一款恒流 LED 驱动芯片,通过 PWM 调节平均电流实现调光。
    外围电路:VIN 接 12V,LED+ 接 LED 阳极,LED- 接 LED 阴极再接采样电阻到地;芯片的 ISET 接 0.15Ω 设定最大电流。EN 脚内部有上拉,直接输入 PWM 即可控制开关。

    PWM from PA6 —- R4 (1kΩ) —- EN(PAM2803)

    代码

    // pwm.c
    #include "pwm.h"
    extern TIM_HandleTypeDef htim3;

    void PWM_SetDuty(uint8_t percent) {
    if(percent > 100) percent = 100;
    uint16_t pulse = (uint16_t)(percent * (__HAL_TIM_GET_AUTORELOAD(&htim3) + 1) / 100);
    __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, pulse);
    }

    void PWM_Init(void) {
    HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
    PWM_SetDuty(0);
    }

    3.3 OLED 显示电路(I2C)

    电路
    SSD1306 OLED 模块通常引出 VCC, GND, SCL, SDA。MCU 的 I2C1 (PB6-SCL, PB7-SDA) 直连模块即可,VCC 接 3.3V。需要 4.7kΩ 上拉电阻,但模块一般已内置。

    显示代码框架

    // oled.c
    void OLED_ShowState(uint16_t light, uint8_t duty, uint8_t wifiOk) {
    char buf[21];
    OLED_Clear();
    sprintf(buf, "Light:%4d", light);
    OLED_ShowString(0,0,buf,16);
    sprintf(buf, "Duty: %3d%%", duty);
    OLED_ShowString(0,2,buf,16);
    sprintf(buf, "WiFi:%s", wifiOk ? "OK" : "ERR");
    OLED_ShowString(0,4,buf,16);
    OLED_Refresh();
    }

    3.4 WiFi 无线通信电路(ESP8266)

    电路
    ESP-01 模块:VCC、GND 接 3.3V;TX 接 STM32 PA3 (UART2 RX),RX 接 PA2 (UART2 TX);CH_PD 和 RST 上拉;本设计使用软件复位,将 RST 接至 PA4 以便控制。

    MQTT 固件封装(基于 AT 指令)

    // wifi.c / mqtt.c 略,与前述 WiFi 恒温系统类似
    // 发布主题:lamp/light, lamp/duty
    // 订阅主题:lamp/set 负载:"AUTO" 或 "MANUAL,75"

    通信协议实例

    • 手机 -> 设备:lamp/set "MANUAL,80" // 手动 80% 亮度
    • 手机 -> 设备:lamp/set "AUTO" // 切换自动模式
    • 设备 -> 手机:lamp/light "2840" // 当前 ADC 光强值
    • 设备 -> 手机:lamp/duty "65" // 当前占空比

    3.5 电源管理电路

    由于 LED 需要 12V,采用 USB 5V 输入后通过 MT3608 升压模块产生 12V 给 PAM2803。数字部分通过 AMS1117-3.3 获得 3.3V。布局时功率地和信号地单点连接,避免干扰。

    USB 5V —> MT3608 Boost —12V—> PAM2803 –> LED
    |
    +—> AMS1117-3.3 —–> MCU, ESP, OLED, ADC

    4. UML 建模

    4.1 类图(模块抽象)

    #mermaid-svg-sVIG77uOtGY5emRn{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-sVIG77uOtGY5emRn .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-sVIG77uOtGY5emRn .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-sVIG77uOtGY5emRn .error-icon{fill:#552222;}#mermaid-svg-sVIG77uOtGY5emRn .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-sVIG77uOtGY5emRn .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-sVIG77uOtGY5emRn .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-sVIG77uOtGY5emRn .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-sVIG77uOtGY5emRn .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-sVIG77uOtGY5emRn .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-sVIG77uOtGY5emRn .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-sVIG77uOtGY5emRn .marker{fill:#333333;stroke:#333333;}#mermaid-svg-sVIG77uOtGY5emRn .marker.cross{stroke:#333333;}#mermaid-svg-sVIG77uOtGY5emRn svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-sVIG77uOtGY5emRn p{margin:0;}#mermaid-svg-sVIG77uOtGY5emRn g.classGroup text{fill:#9370DB;stroke:none;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-sVIG77uOtGY5emRn g.classGroup text .title{font-weight:bolder;}#mermaid-svg-sVIG77uOtGY5emRn .cluster-label text{fill:#333;}#mermaid-svg-sVIG77uOtGY5emRn .cluster-label span{color:#333;}#mermaid-svg-sVIG77uOtGY5emRn .cluster-label span p{background-color:transparent;}#mermaid-svg-sVIG77uOtGY5emRn .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-sVIG77uOtGY5emRn .cluster text{fill:#333;}#mermaid-svg-sVIG77uOtGY5emRn .cluster span{color:#333;}#mermaid-svg-sVIG77uOtGY5emRn .nodeLabel,#mermaid-svg-sVIG77uOtGY5emRn .edgeLabel{color:#131300;}#mermaid-svg-sVIG77uOtGY5emRn .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-sVIG77uOtGY5emRn .label text{fill:#131300;}#mermaid-svg-sVIG77uOtGY5emRn .labelBkg{background:#ECECFF;}#mermaid-svg-sVIG77uOtGY5emRn .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-sVIG77uOtGY5emRn .classTitle{font-weight:bolder;}#mermaid-svg-sVIG77uOtGY5emRn .node rect,#mermaid-svg-sVIG77uOtGY5emRn .node circle,#mermaid-svg-sVIG77uOtGY5emRn .node ellipse,#mermaid-svg-sVIG77uOtGY5emRn .node polygon,#mermaid-svg-sVIG77uOtGY5emRn .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-sVIG77uOtGY5emRn .divider{stroke:#9370DB;stroke-width:1;}#mermaid-svg-sVIG77uOtGY5emRn g.clickable{cursor:pointer;}#mermaid-svg-sVIG77uOtGY5emRn g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-sVIG77uOtGY5emRn g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-sVIG77uOtGY5emRn .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-sVIG77uOtGY5emRn .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-sVIG77uOtGY5emRn .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-sVIG77uOtGY5emRn .dashed-line{stroke-dasharray:3;}#mermaid-svg-sVIG77uOtGY5emRn .dotted-line{stroke-dasharray:1 2;}#mermaid-svg-sVIG77uOtGY5emRn #compositionStart,#mermaid-svg-sVIG77uOtGY5emRn .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-sVIG77uOtGY5emRn #compositionEnd,#mermaid-svg-sVIG77uOtGY5emRn .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-sVIG77uOtGY5emRn #dependencyStart,#mermaid-svg-sVIG77uOtGY5emRn .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-sVIG77uOtGY5emRn #dependencyStart,#mermaid-svg-sVIG77uOtGY5emRn .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-sVIG77uOtGY5emRn #extensionStart,#mermaid-svg-sVIG77uOtGY5emRn .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-sVIG77uOtGY5emRn #extensionEnd,#mermaid-svg-sVIG77uOtGY5emRn .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-sVIG77uOtGY5emRn #aggregationStart,#mermaid-svg-sVIG77uOtGY5emRn .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-sVIG77uOtGY5emRn #aggregationEnd,#mermaid-svg-sVIG77uOtGY5emRn .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-sVIG77uOtGY5emRn #lollipopStart,#mermaid-svg-sVIG77uOtGY5emRn .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-sVIG77uOtGY5emRn #lollipopEnd,#mermaid-svg-sVIG77uOtGY5emRn .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-sVIG77uOtGY5emRn .edgeTerminals{font-size:11px;line-height:initial;}#mermaid-svg-sVIG77uOtGY5emRn .classTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-sVIG77uOtGY5emRn .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-sVIG77uOtGY5emRn .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-sVIG77uOtGY5emRn :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    LightSensor

    +ReadRaw() : uint16

    +GetLux() : float

    LEDDriver

    +SetDuty(uint8)

    +Init()

    OledDisplay

    +ShowState(uint16,uint8,bool)

    WiFiModule

    +ConnectAP(ssid,pwd)

    +SendCmd(cmd,ack,timeout)

    MQTTClient

    +Connect(broker,port)

    +Publish(topic,payload)

    +Subscribe(topic)

    +ProcessMessage()

    LampController

    -mode: AUTO/MANUAL

    -targetLux: float

    +Update()

    4.2 时序图(自动调光周期)

    MQTTOledLEDDriverLightSensorLampControllerTimerMQTTOledLEDDriverLightSensorLampControllerTimer#mermaid-svg-YKlOS60w28WEAk4s{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-YKlOS60w28WEAk4s .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-YKlOS60w28WEAk4s .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-YKlOS60w28WEAk4s .error-icon{fill:#552222;}#mermaid-svg-YKlOS60w28WEAk4s .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-YKlOS60w28WEAk4s .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-YKlOS60w28WEAk4s .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-YKlOS60w28WEAk4s .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-YKlOS60w28WEAk4s .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-YKlOS60w28WEAk4s .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-YKlOS60w28WEAk4s .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-YKlOS60w28WEAk4s .marker{fill:#333333;stroke:#333333;}#mermaid-svg-YKlOS60w28WEAk4s .marker.cross{stroke:#333333;}#mermaid-svg-YKlOS60w28WEAk4s svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-YKlOS60w28WEAk4s p{margin:0;}#mermaid-svg-YKlOS60w28WEAk4s .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-YKlOS60w28WEAk4s text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-YKlOS60w28WEAk4s .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-YKlOS60w28WEAk4s .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-YKlOS60w28WEAk4s .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-YKlOS60w28WEAk4s .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-YKlOS60w28WEAk4s #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-YKlOS60w28WEAk4s .sequenceNumber{fill:white;}#mermaid-svg-YKlOS60w28WEAk4s #sequencenumber{fill:#333;}#mermaid-svg-YKlOS60w28WEAk4s #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-YKlOS60w28WEAk4s .messageText{fill:#333;stroke:none;}#mermaid-svg-YKlOS60w28WEAk4s .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-YKlOS60w28WEAk4s .labelText,#mermaid-svg-YKlOS60w28WEAk4s .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-YKlOS60w28WEAk4s .loopText,#mermaid-svg-YKlOS60w28WEAk4s .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-YKlOS60w28WEAk4s .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-YKlOS60w28WEAk4s .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-YKlOS60w28WEAk4s .noteText,#mermaid-svg-YKlOS60w28WEAk4s .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-YKlOS60w28WEAk4s .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-YKlOS60w28WEAk4s .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-YKlOS60w28WEAk4s .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-YKlOS60w28WEAk4s .actorPopupMenu{position:absolute;}#mermaid-svg-YKlOS60w28WEAk4s .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-YKlOS60w28WEAk4s .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-YKlOS60w28WEAk4s .actor-man circle,#mermaid-svg-YKlOS60w28WEAk4s line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-YKlOS60w28WEAk4s :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}PID 计算目标占空比200ms 中断ReadRaw()ADC valueSetDuty(duty)ShowState(light, duty, wifi)Publish lamp/light & lamp/duty

    5. 测试报告范例

    5.1 性能测试数据表

    环境:桌面台灯,用照度计校准。设定自动模式,目标 ADC 等效照度 2000(约 300 lux)。人为用手遮挡光敏电阻模拟环境变暗。

    时间(s)ADC 读取值遮光状态输出占空比(%)桌面照度(lux)误差(lux)
    0 2100 45 315 +15
    5 1800 半遮 52 305 +5
    10 1500 全遮 72 298 -2
    15 2000 47 302 +2
    20 2000 46 300 0

    稳态时照度误差在 ±5 lux 以内。

    5.2 误差分析报告

    误差源影响描述改善措施
    光敏电阻非线性 低照度下灵敏度极高,影响控制精度 软件分段线性化或多项式补偿
    ADC 参考电压波动 USB供电时3.3V轻微偏移,影响读数 增加高精度基准源,或使用内部参照
    LED 恒流源精度 电感纹波导致轻微频闪 提高PWM频率至20kHz,加大输出电容
    WiFi 射频干扰 模拟小信号易受干扰 光敏电阻走线远离ESP天线,地平面完整
    热漂移 LED发热后光效下降 加入温度补偿,或利用光敏电阻负反馈

    5.3 设计报告评分标准解析

    评分项满分解析
    方案设计 20 框图清晰,软硬件任务划分合理,成本可控
    电路原理图 25 每个模块电路正确,参数计算准确,有保护电路
    PCB 设计 15 布局考虑散热、抗扰,电源分离,数字模拟间隔离
    代码质量 15 模块化,有注释,通信协议稳定,PID 实现正确
    测试与数据分析 15 测试方法科学,有对比数据,误差分析详细
    文档与创新 10 包含 UML 模型,设计独特(如自适应调光算法)

    6. 硬件调试与设计机理

    6.1 光敏电阻选型与分压电阻确定

    • 需求:光线充足时 ADC 读数约 3000,黑暗时约 100。
    • 测量 GL5528 在目标应用亮度下约为 5kΩ~50kΩ。选择 R1=10kΩ,使中点在 1.1V~2.8V 之间,落入 ADC 线性区。

    6.2 PID 自动调光机理

    将 ADC 目标值设为设定点,当前 ADC 值作为反馈。PID 控制器输出 LED 占空比,使照度稳定。由于光路变化缓慢,积分系数需较小,微分可抑制过调。实际可简化为 PI 控制。

    6.3 抗干扰与可靠性

    • 使用 TVS 管保护电源入口。
    • LED 驱动与 MCU 之间加 1kΩ 电阻防止过冲。
    • I2C 总线预留上拉电阻位,通信异常时可加强驱动。
    • 固件加入看门狗与 MQTT 断线重连机制。

    7. 总结

    本手册以 WiFi 智能 LED 台灯为实例,完整解析了模拟信号采集 (ADC)、大功率 PWM 恒流驱动、OLED 本地显示和 MQTT 无线通信的硬件设计全流程。

    所有模块电路均给出原理并附实际代码,UML 模型清晰表达了系统结构。

    开发者可以直接复用这些设计来完成类似的光控、温控或电机调速项目,亦可作为课程设计报告模板。

    赞(0)
    未经允许不得转载:171主机测评 » WiFi 智能 LED 调光台灯 —— 硬件设计全流程解析
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址