项目 1:室内温度监测系统
🎯 项目目标
构建一个温度监测系统:
- 使用 BME280 传感器持续监测环境温度
- LED 颜色随温度变化(绿→黄→红)
- 在屏幕上实时显示温度值
📋 所需硬件
| 组件 | 数量 | 连接 |
|---|---|---|
| Steamania JoyKit V2 | 1 | 主控制器 |
| BME280 温度传感器 | 1 | I2C 总线 |
| WS2812B 全彩 LED | 1 | 板载或外部 |
🔧 电路设置
- BME280 传感器:连接到 I2C 总线(SDA, SCL, VCC, GND)
- 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用于比较,所以先复制到R00R2E中的温度以值×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= 十进制 10000000= 毫秒单位- 防止更新过快,使变化可见
第 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 |
🔍 关键学习点
- 传感器集成:如何启用和读取 I2C 传感器
- 条件逻辑:使用基于比较的跳转进行决策
- 颜色控制:RGB 颜色表示和 LED 控制
- 程序流程:创建带有初始化部分的主循环
- 数据表示:理解温度缩放(×10)
🧪 测试清单
- BME280 传感器正确连接并启用
- 温度 < 20°C 时 LED 变为绿色
- 20°C ≤ 温度 ≤ 30°C 时 LED 变为黄色
- 温度 > 30°C 时 LED 变为红色
- 温度值在屏幕上正确显示
- 大约每秒更新一次
💡 扩展挑战
尝试这些修改以加深理解:
- 添加更多颜色级别:添加橙色(25-30°C)和蓝色(< 15°C)
- 显示温度趋势:显示温度是上升还是下降
- 添加警报:如果温度超过 35°C,LED 闪烁红色
- 记录最高温度:跟踪并显示达到的最高温度
- 双 LED 系统:使用两个不同颜色的 LED 以获得更宽的范围
📚 相关文档
本项目使用的指令
| 操作码 | 名称 | 描述 | 文档链接 |
|---|---|---|---|
0x02 | 延时 | 设置毫秒级延时时间 | 延时 |
0x04 | 大于跳转 | 如果 R00 > 立即数则跳转 | 条件跳转 |
0x0E | 无条件跳转 | 跳转到指定行号 | 无条件跳转 |
0x10 | 写入寄存器 | 将立即数写入寄存器 | 寄存器操作 |
0x11 | 复制寄存器 | 将一个寄存器的值复制到另一个 | 寄存器操作 |
0x55 | 显示文本 | 在屏幕上显示寄存器值 | 文本输出 |
0xC3 | 启用 BME280 | 启用温湿度传感器模块 | 外部设备 |
0xCB | 启用 WS2812B | 启用 LED 控制模块 | 外部设备 |
0xE4 | 设置 LED 颜色 | 为指定 LED 设置 RGB 颜色 | 彩灯与音乐 |