跳到主要内容

第 3 题:模拟社区路灯照明系统

🎯 项目目标​

构建一个自动路灯系统:

  • 使用光传感器检测环境光照强度
  • 自动控制 4 个全彩 LED(蓝光)作为路灯
  • 环境越暗点亮的 LED 越多
  • 在屏幕上实时显示传感器数值

📋 所需硬件​

组件数量连接
Steamania JoyKit V21主控制器
TCS34725 颜色传感器1I2C 总线(用于环境光检测)
WS2812B 全彩 LED4板载 + 外部(配置为蓝色路灯)

🔧 电路设置​

  1. TCS34725 传感器:连接到 I2C 总线(SDA, SCL, VCC, GND)
  2. 4x WS2812B LED:
    • LED #0:板载(如有)或外部
    • LED #1-3:外部 LED 串联连接
    • 全部配置为发出蓝光(路灯模拟)

💡 核心任务​

任务 1:启用光传感器​

  • 使用指令 0xC4 启用 TCS34725 颜色传感器
  • 光强度值存储在寄存器 R31-R33(RGB 分量)
  • 从 RGB 值计算总光强度

任务 2:实现多级阈值逻辑​

  • 基于传感器读数定义 5 个光级别:
    • 很亮 (> 800):所有 LED 关闭
    • 亮 (600-800):1 个 LED 亮
    • 中等 (400-600):2 个 LED 亮
    • 暗 (200-400):3 个 LED 亮
    • 很暗 (< 200):所有 4 个 LED 亮

任务 3:控制多个 LED​

  • 使用指令 0xE4 独立控制每个 LED
  • 将所有激活的 LED 设置为蓝色(0x0000FF)
  • 实现顺序或并行 LED 控制

任务 4:显示实时数据​

  • 显示当前光强度值
  • 显示激活的 LED 数量
  • 实时更新显示

📝 参考方案​

程序代码​

000 C4 0001 0000  ; 启用 TCS34725 颜色传感器
001 C7 0001 0000 ; 启用 WS2812B LED 控制
002 10 0028 FFFF ; 设置前景色为白色(用于文本)
003 10 0029 0000 ; 设置背景色为黑色
004 0E 0000 0010 ; 跳转到主循环

; 主循环 - 读取传感器并计算光强度
010 11 0001 0031 ; R01 = R31(红色分量)
011 11 0002 0032 ; R02 = R32(绿色分量)
012 11 0003 0033 ; R03 = R33(蓝色分量)

; 计算平均光强度:(R + G + B) / 3
013 32 0004 0102 ; R04 = R01 + R02
014 32 0004 0403 ; R04 = R04 + R03(总和 = R + G + B)
015 10 0005 0003 ; R05 = 3(除数)
016 32 0004 0405 ; R04 = R04 / R05(平均值)

; 多级阈值检测
017 04 0320 0030 ; 如果 R04 > 800,跳转到级别 0(全关)
018 04 0258 0040 ; 如果 R04 > 600,跳转到级别 1(1 个 LED)
019 04 0190 0050 ; 如果 R04 > 400,跳转到级别 2(2 个 LED)
01A 04 00C8 0060 ; 如果 R04 > 200,跳转到级别 3(3 个 LED)
01B 0E 0000 0070 ; 否则级别 4(全 4 个 LED)

; 级别 0:很亮(光 > 800)- 所有 LED 关闭
030 E4 0000 0000 ; LED #0:关
031 E4 0100 0000 ; LED #1:关
032 E4 0200 0000 ; LED #2:关
033 E4 0300 0000 ; LED #3:关
034 10 0020 0000 ; R20 = 0(激活 LED 数量)
035 0E 0000 0080 ; 跳转到显示更新

; 级别 1:亮(600 < 光 ≤ 800)- 1 个 LED 亮
040 E4 0000 00FF ; LED #0:亮(蓝色)
041 E4 0100 0000 ; LED #1:关
042 E4 0200 0000 ; LED #2:关
043 E4 0300 0000 ; LED #3:关
044 10 0020 0001 ; R20 = 1
045 0E 0000 0080 ; 跳转到显示

; 级别 2:中等(400 < 光 ≤ 600)- 2 个 LED 亮
050 E4 0000 00FF ; LED #0:亮(蓝色)
051 E4 0100 00FF ; LED #1:亮(蓝色)
052 E4 0200 0000 ; LED #2:关
053 E4 0300 0000 ; LED #3:关
054 10 0020 0002 ; R20 = 2
055 0E 0000 0080 ; 跳转到显示

; 级别 3:暗(200 < 光 ≤ 400)- 3 个 LED 亮
060 E4 0000 00FF ; LED #0:亮(蓝色)
061 E4 0100 00FF ; LED #1:亮(蓝色)
062 E4 0200 00FF ; LED #2:亮(蓝色)
063 E4 0300 0000 ; LED #3:关
064 10 0020 0003 ; R20 = 3
065 0E 0000 0080 ; 跳转到显示

; 级别 4:很暗(光 ≤ 200)- 全 4 个 LED 亮
070 E4 0000 00FF ; LED #0:亮(蓝色)
071 E4 0100 00FF ; LED #1:亮(蓝色)
072 E4 0200 00FF ; LED #2:亮(蓝色)
073 E4 0300 00FF ; LED #3:亮(蓝色)
074 10 0020 0004 ; R20 = 4
; 直接执行到显示更新

; 显示更新
080 55 0000 0011 ; 在 (0, 0) 显示光值
081 55 0050 0020 ; 在 (5, 0) 显示 LED 数量
082 02 03E8 0000 ; 延时 1000 毫秒
083 0E 0000 0010 ; 跳转回开始

🔍 详细解释​

初始化(第 000-004 行)​

第 000 行:C4 0001 0000

  • 启用 TCS34725 颜色传感器模块
  • 传感器自动测量环境光并存储 RGB 值
  • R31 = 红色分量,R32 = 绿色分量,R33 = 蓝色分量
  • 值范围 0-65535(16 位)

第 001 行:C7 0001 0000

  • 启用 WS2812B 全彩 LED 控制
  • 支持独立控制最多 4 个或更多 LED
  • 每个 LED 通过索引寻址(0, 1, 2, 3...)

第 002 行:10 0028 FFFF

  • 设置前景色为白色(0xFFFF,RGB565 格式)
  • 用于屏幕文本显示

第 003 行:10 0029 0000

  • 设置背景色为黑色
  • 为文本显示提供对比度

第 004 行:0E 0000 0010

  • 跳转到主循环第 010 行

光强度计算(第 010-016 行)​

第 010 行:11 0001 0031

  • 从 R31 复制红色分量到 R01
  • 为计算做准备

第 011 行:11 0002 0032

  • 从 R32 复制绿色分量到 R02

第 012 行:11 0003 0033

  • 从 R33 复制蓝色分量到 R03

第 013 行:32 0004 0102

  • R04 = R01 + R02(红色 + 绿色)
  • 使用指令 0x32 进行寄存器加法

第 014 行:32 0004 0403

  • R04 = R04 + R03(总和 = R + G + B)
  • R04 现在包含总光强度

第 015 行:10 0005 0003

  • 设置 R05 = 3(除法除数)

第 016 行:32 0004 0405

  • R04 = R04 / R05(平均值 = 总和 / 3)
  • R04 现在包含平均光强度(0-65535 范围)

阈值检测(第 017-01B 行)​

第 017 行:04 0320 0030

  • 如果 R04 > 800(很亮),跳转到第 030 行(所有 LED 关闭)
  • 0320 = 十六进制 800

第 018 行:04 0258 0040

  • 如果 R04 > 600(亮),跳转到第 040 行(1 个 LED 亮)
  • 0258 = 十六进制 600

第 019 行:04 0190 0050

  • 如果 R04 > 400(中等),跳转到第 050 行(2 个 LED 亮)
  • 0190 = 十六进制 400

第 01A 行:04 00C8 0060

  • 如果 R04 > 200(暗),跳转到第 060 行(3 个 LED 亮)
  • 00C8 = 十六进制 200

第 01B 行:0E 0000 0070

  • 否则(很暗,≤ 200),继续到第 070 行(全 4 个 LED 亮)

按级别控制 LED​

级别 0:很亮(第 030-035 行)​

  • 全 4 个 LED 关闭
  • E4 [LED 索引] 0000 0000 = 黑色/关闭
  • R20 = 0(存储 LED 数量用于显示)

级别 1:亮(第 040-045 行)​

  • LED #0 亮(蓝色:0000 00FF)
  • LED #1-3 关闭
  • R20 = 1

级别 2:中等(第 050-055 行)​

  • LED #0-1 亮(蓝色)
  • LED #2-3 关闭
  • R20 = 2

级别 3:暗(第 060-065 行)​

  • LED #0-2 亮(蓝色)
  • LED #3 关闭
  • R20 = 3

级别 4:很暗(第 070-074 行)​

  • 全 4 个 LED 亮(蓝色)
  • R20 = 4

显示更新(第 080-083 行)​

第 080 行:55 0000 0011

  • 在屏幕位置 (0, 0) 显示光强度值
  • 显示 R04 中的值(平均光强度)

第 081 行:55 0050 0020

  • 在位置 (5, 0) 显示 LED 数量
  • 显示 R20 中的值(激活的 LED 数量)

第 082 行:02 03E8 0000

  • 延时 1000 毫秒(1 秒)
  • 03E8 = 十进制 1000
  • 提供稳定的更新并防止闪烁

第 083 行:0E 0000 0010

  • 跳转回第 010 行
  • 创建无限循环以持续监测

🎨 光级别阈值表​

光级别强度范围LED 亮蓝色 LED 激活
很亮> 8000无
亮601-8001LED #0
中等401-6002LED #0, #1
暗201-4003LED #0, #1, #2
很暗≤ 2004全 4 个 LED

🔧 LED 颜色配置​

所有激活的 LED 设置为蓝色以模拟路灯:

E4 [LED 索引] 0000 00FF
│ │ └─ 蓝色(FF = 255 = 最大亮度)
│ └───── 绿色(00 = 关闭)
└───────────────── LED 索引(00-03)

🔍 关键学习点​

  1. 传感器集成:读取和处理来自颜色/光传感器的数据
  2. 多级逻辑:实现 5 级阈值检测
  3. 顺序控制:独立控制多个输出
  4. 数据可视化:显示实时传感器值
  5. 自动化:创建光响应自动系统
  6. 寄存器算术:使用加法和除法进行计算

🧪 测试清单​

  • TCS34725 传感器正确连接并启用
  • 光强度值在屏幕上正确显示
  • 全 4 个 LED 响应光级别变化
  • 阈值转换平滑准确
  • LED 正确设置为蓝色
  • 系统大约每秒更新一次
  • 环境越暗点亮的 LED 越多

💡 扩展挑战​

  1. 可调阈值:添加按键调节光灵敏度
  2. 渐变调光:使用 PWM 在级别间平滑过渡
  3. 不同颜色:为不同光级别使用不同颜色
  4. 数据记录:跟踪并显示最小/最大光值
  5. 基于时间的控制:添加 RTC 模块模拟日落/日出
  6. 运动检测:添加 PIR 传感器仅在检测到运动时点亮
  7. 能量监测:计算并显示功耗
  8. 无线控制:添加蓝牙进行远程监测

🐛 常见问题和解决方案​

问题 1:LED 不亮​

原因:LED 控制未启用或 LED 索引不正确 解决方案:验证第 001 行启用 LED 控制并检查 LED 索引(0-3)

问题 2:光值看起来不正确​

原因:传感器未校准或计算错误 解决方案:检查传感器启用(第 000 行)并验证 RGB 平均逻辑

问题 3:阈值与预期行为不匹配​

原因:阈值需要根据实际环境调整 解决方案:根据实际读数修改第 017-01A 行的阈值

问题 4:只有部分 LED 工作​

原因:LED 链连接不正确 解决方案:检查物理连接和 LED 索引

问题 5:显示更新太快/太慢​

原因:延时时间不正确 解决方案:调整第 082 行的延时值(如 500ms 更快,2000ms 更慢)

📊 现实世界应用​

此项目模拟现实世界智慧城市应用:

  1. 能源效率:仅根据条件使用必要的照明
  2. 自动控制:无需人工干预
  3. 可扩展性:可扩展到控制数百个路灯
  4. 智慧城市:基于物联网的城市照明系统基础
  5. 安全:确保在需要时提供足够的照明

📚 相关文档​

本项目使用的指令​

操作码名称描述文档链接
0x02延时设置毫秒级延时时间延时
0x04大于跳转如果 R00 > 立即数则跳转条件跳转
0x0E无条件跳转跳转到指定行号无条件跳转
0x10写入寄存器将立即数写入寄存器寄存器操作
0x11复制寄存器将一个寄存器的值复制到另一个寄存器操作
0x32寄存器加法两个寄存器相加,结果存入第一个寄存器寄存器操作
0x55显示文本在屏幕上显示寄存器值文本输出
0xC4启用 TCS34725启用颜色/光传感器模块外部设备
0xCB启用 WS2812B启用 LED 控制模块外部设备
0xE4设置 LED 颜色为指定 LED 设置 RGB 颜色彩灯与音乐

额外参考​

  • 寄存器映射 - 完整寄存器文档
    • R31-R33: TCS34725 RGB 数据寄存器
    • R28: 前景色寄存器
    • R29: 背景色寄存器
  • 指令集概览 - 完整指令集总览

🎓 评估标准​

标准优秀 (5)良好 (4)满意 (3)需改进 (2)
电路设置所有组件正确连接小连接错误一些连接不正确主要接线问题
程序逻辑清晰高效的代码,阈值适当工作代码,小问题代码工作但效率低代码工作不正确
LED 控制全 4 个 LED 正确响应光级别3 个 LED 工作正确2 个 LED 工作正确1 个或更少 LED 工作
显示清晰显示光值和 LED 数量正确显示一个值显示有错误无显示输出
测试和调试彻底测试,处理所有边界情况测试大多数情况基础测试很少或没有测试