第 3 题:模拟社区路灯照明系统
🎯 项目目标
构建一个自动路灯系统:
- 使用光传感器检测环境光照强度
- 自动控制 4 个全彩 LED(蓝光)作为路灯
- 环境越暗点亮的 LED 越多
- 在屏幕上实时显示传感器数值
📋 所需硬件
| 组件 | 数量 | 连接 |
|---|---|---|
| Steamania JoyKit V2 | 1 | 主控制器 |
| TCS34725 颜色传感器 | 1 | I2C 总线(用于环境光检测) |
| WS2812B 全彩 LED | 4 | 板载 + 外部(配置为蓝色路灯) |
🔧 电路设置
- TCS34725 传感器:连接到 I2C 总线(SDA, SCL, VCC, GND)
- 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 激活 |
|---|---|---|---|
| 很亮 | > 800 | 0 | 无 |
| 亮 | 601-800 | 1 | LED #0 |
| 中等 | 401-600 | 2 | LED #0, #1 |
| 暗 | 201-400 | 3 | LED #0, #1, #2 |
| 很暗 | ≤ 200 | 4 | 全 4 个 LED |
🔧 LED 颜色配置
所有激活的 LED 设置为蓝色以模拟路灯:
E4 [LED 索引] 0000 00FF
│ │ └─ 蓝色(FF = 255 = 最大亮度)
│ └───── 绿色(00 = 关闭)
└───────────────── LED 索引(00-03)
🔍 关键学习点
- 传感器集成:读取和处理来自颜色/光传感器的数据
- 多级逻辑:实现 5 级阈值检测
- 顺序控制:独立控制多个输出
- 数据可视化:显示实时传感器值
- 自动化:创建光响应自动系统
- 寄存器算术:使用加法和除法进行计算
🧪 测试清单
- TCS34725 传感器正确连接并启用
- 光强度值在屏幕上正确显示
- 全 4 个 LED 响应光级别变化
- 阈值转换平滑准确
- LED 正确设置为蓝色
- 系统大约每秒更新一次
- 环境越暗点亮的 LED 越多
💡 扩展挑战
- 可调阈值:添加按键调节光灵敏度
- 渐变调光:使用 PWM 在级别间平滑过渡
- 不同颜色:为不同光级别使用不同颜色
- 数据记录:跟踪并显示最小/最大光值
- 基于时间的控制:添加 RTC 模块模拟日落/日出
- 运动检测:添加 PIR 传感器仅在检测到运动时点亮
- 能量监测:计算并显示功耗
- 无线控制:添加蓝牙进行远程监测
🐛 常见问题和解决方案
问题 1:LED 不亮
原因:LED 控制未启用或 LED 索引不正确 解决方案:验证第 001 行启用 LED 控制并检查 LED 索引(0-3)
问题 2:光值看起来不正确
原因:传感器未校准或计算错误 解决方案:检查传感器启用(第 000 行)并验证 RGB 平均逻辑
问题 3:阈值与预期行为不匹配
原因:阈值需要根据实际环境调整 解决方案:根据实际读数修改第 017-01A 行的阈值
问题 4:只有部分 LED 工作
原因:LED 链连接不正确 解决方案:检查物理连接和 LED 索引
问题 5:显示更新太快/太慢
原因:延时时间不正确 解决方案:调整第 082 行的延时值(如 500ms 更快,2000ms 更慢)
📊 现实世界应用
此项目模拟现实世界智慧城市应用:
- 能源效率:仅根据条件使用必要的照明
- 自动控制:无需人工干预
- 可扩展性:可扩展到控制数百个路灯
- 智慧城市:基于物联网的城市照明系统基础
- 安全:确保在需要时提供足够的照明
📚 相关文档
本项目使用的指令
| 操作码 | 名称 | 描述 | 文档链接 |
|---|---|---|---|
0x02 | 延时 | 设置毫秒级延时时间 | 延时 |
0x04 | 大于跳转 | 如果 R00 > 立即数则跳转 | 条件跳转 |
0x0E | 无条件跳转 | 跳转到指定行号 | 无条件跳转 |
0x10 | 写入寄存器 | 将立即数写入寄存器 | 寄存器操作 |
0x11 | 复制寄存器 | 将一个寄存器的值复制到另一个 | 寄存器操作 |
0x32 | 寄存器加法 | 两个寄存器相加,结果存入第一个寄存器 | 寄存器操作 |
0x55 | 显示文本 | 在屏幕上显示寄存器值 | 文本输出 |
0xC4 | 启用 TCS34725 | 启用颜色/光传感器模块 | 外部设备 |
0xCB | 启用 WS2812B | 启用 LED 控制模块 | 外部设备 |
0xE4 | 设置 LED 颜色 | 为指定 LED 设置 RGB 颜色 | 彩灯与音乐 |
额外参考
🎓 评估标准
| 标准 | 优秀 (5) | 良好 (4) | 满意 (3) | 需改进 (2) |
|---|---|---|---|---|
| 电路设置 | 所有组件正确连接 | 小连接错误 | 一些连接不正确 | 主要接线问题 |
| 程序逻辑 | 清晰高效的代码,阈值适当 | 工作代码,小问题 | 代码工作但效率低 | 代码工作不正确 |
| LED 控制 | 全 4 个 LED 正确响应光级别 | 3 个 LED 工作正确 | 2 个 LED 工作正确 | 1 个或更少 LED 工作 |
| 显示 | 清晰显示光值和 LED 数量 | 正确显示一个值 | 显示有错误 | 无显示输出 |
| 测试和调试 | 彻底测试,处理所有边界情况 | 测试大多数情况 | 基础测试 | 很少或没有测试 |