跳到主要内容

项目 1:室内温度监测系统

🎯 项目目标​

构建一个温度监测系统:

  • 使用 BME280 传感器持续监测环境温度
  • LED 颜色随温度变化(绿→黄→红)
  • 在屏幕上实时显示温度值

📋 所需硬件​

组件数量连接
Steamania JoyKit V21主控制器
BME280 温度传感器1I2C 总线
WS2812B 全彩 LED1板载或外部

🔧 电路设置​

  1. BME280 传感器:连接到 I2C 总线(SDA, SCL, VCC, GND)
  2. WS2812B LED:使用板载 LED 或连接到专用 PWM 引脚

💡 核心任务​

任务 1:启用温度传感器​

  • 使用指令 0xC3 启用 BME280 模块
  • 温度值将自动存储在寄存器 R2E 中

任务 2:读取温度并映射到颜色​

  • 从 R2E 读取温度(值 × 10,如 25.3°C = 253)
  • 实现颜色映射逻辑:
    • 低温 (< 20°C): 绿色 (0x00FF00)
    • 中温 (20-30°C): 黄色 (0xFFFF00)
    • 高温 (> 30°C): 红色 (0xFF0000)

任务 3:控制 LED 颜色​

  • 使用指令 0xE4 设置 LED 颜色
  • 随温度变化实时更新颜色

任务 4:显示温度​

  • 使用指令 0x55 在屏幕上显示温度
  • 显示一位小数的值

📝 参考方案​

程序代码​

000 C3 0001 0000  ; 启用 BME280 温度传感器
001 C7 0001 0000 ; 启用 WS2812B LED 控制
002 10 0028 FFFF ; 设置前景色为白色(用于文本)
003 0E 0000 0010 ; 跳转到第 010 行的主循环

; 主循环 - 从第 010 行开始
010 11 0001 002E ; 复制 R2E(温度)到 R01 进行处理
011 04 00C8 0020 ; 如果 R00 > 20.0°C(200),跳转到高温检查
012 E4 00FF 0000 ; 设置 LED 为绿色(温度 < 20°C)
013 0E 0000 0030 ; 跳转到显示更新

020 04 012C 0028 ; 如果 R00 > 30.0°C(300),跳转到高温
021 E4 00FF FF00 ; 设置 LED 为黄色(20°C ≤ 温度 ≤ 30°C)
022 0E 0000 0030 ; 跳转到显示更新

028 E4 00FF 0000 ; 设置 LED 为红色(温度 > 30°C)

; 显示更新 - 第 030 行
030 55 0000 0011 ; 在位置 (0,0) 显示温度
031 02 03E8 0000 ; 延时 1000 毫秒(1 秒)
032 0E 0000 0010 ; 跳转回第 010 行(循环)

详细解释​

初始化(第 000-003 行)​

第 000 行:C3 0001 0000

  • 启用 BME280 温湿度传感器
  • 启用后,温度每约 1 秒自动存储到 R2E

第 001 行:C7 0001 0000

  • 启用 WS2812B 全彩 LED 控制
  • 使用指令 0xE4 前必须启用

第 002 行:10 0028 FFFF

  • 向寄存器 R28 写入 0xFFFF
  • R28 控制绘图/文本命令的前景色
  • 0xFFFF = RGB565 格式的白色

第 003 行:0E 0000 0010

  • 无条件跳转到第 010 行
  • 跳过温度检查逻辑,开始主循环

温度检查逻辑(第 010-028 行)​

第 010 行:11 0001 002E

  • 从 R2E 复制温度值到 R01
  • R00 用于比较,所以先复制到 R00
  • R2E 中的温度以值×10 存储(如 25.3°C = 253 = 0x00FD)

第 011 行:04 00C8 0020

  • 条件跳转:如果 R00 > 200(20.0°C),跳转到第 020 行
  • 00C8 = 十进制 200 = 20.0°C
  • 如果温度 ≤ 20°C,继续到下一行(设置 LED 为绿色)

第 012 行:E4 00FF 0000

  • 设置 LED #0 为绿色
  • 格式:E4 [LED 索引] [R][G] [B]
  • 00FF 0000 = RGB 格式的绿色

第 013 行:0E 0000 0030

  • 跳转到第 030 行更新显示并继续循环

第 020 行:04 012C 0028

  • 条件跳转:如果 R00 > 300(30.0°C),跳转到第 028 行
  • 012C = 十进制 300 = 30.0°C
  • 如果温度 ≤ 30°C,继续到下一行(设置 LED 为黄色)

第 021 行:E4 00FF FF00

  • 设置 LED #0 为黄色
  • 00FF FF00 = RGB 格式的黄色

第 022 行:0E 0000 0030

  • 跳转到第 030 行更新显示并继续循环

第 028 行:E4 00FF 0000

  • 设置 LED #0 为红色(温度 > 30°C)
  • 00FF 0000 = RGB 格式的红色
  • 直接执行到第 030 行(不需要跳转)

显示和循环(第 030-032 行)​

第 030 行:55 0000 0011

  • 在屏幕位置 (0, 0) 显示温度值
  • 格式:55 [X:Y] [值:颜色]
  • 显示 R01 中的值(包含来自 R2E 的温度)

第 031 行:02 03E8 0000

  • 延时 1000 毫秒(1 秒)
  • 03E8 = 十进制 1000
  • 0000 = 毫秒单位
  • 防止更新过快,使变化可见

第 032 行:0E 0000 0010

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

🎨 颜色映射表​

温度范围LED 颜色RGB 值十六进制颜色
< 20°C绿色(0, 255, 0)00FF00
20-30°C黄色(255, 255, 0)FFFF00
> 30°C红色(255, 0, 0)FF0000

🔍 关键学习点​

  1. 传感器集成:如何启用和读取 I2C 传感器
  2. 条件逻辑:使用基于比较的跳转进行决策
  3. 颜色控制:RGB 颜色表示和 LED 控制
  4. 程序流程:创建带有初始化部分的主循环
  5. 数据表示:理解温度缩放(×10)

🧪 测试清单​

  • BME280 传感器正确连接并启用
  • 温度 < 20°C 时 LED 变为绿色
  • 20°C ≤ 温度 ≤ 30°C 时 LED 变为黄色
  • 温度 > 30°C 时 LED 变为红色
  • 温度值在屏幕上正确显示
  • 大约每秒更新一次

💡 扩展挑战​

尝试这些修改以加深理解:

  1. 添加更多颜色级别:添加橙色(25-30°C)和蓝色(< 15°C)
  2. 显示温度趋势:显示温度是上升还是下降
  3. 添加警报:如果温度超过 35°C,LED 闪烁红色
  4. 记录最高温度:跟踪并显示达到的最高温度
  5. 双 LED 系统:使用两个不同颜色的 LED 以获得更宽的范围

📚 相关文档​

本项目使用的指令​

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

额外参考​