基础任务二:
实现板载RGB的全彩控制,实时显示当前获取的颜色;
这个任务我们拆解一下就在我们过程2中颜色传感器驱动以及按键获取再加上驱动板子上的RGB:
一、硬件连接确认
重要提醒:根据 Adafruit 官方文档,ESP32-S3 Reverse TFT Feather 板载的 NeoPixel LED 实际连接在 GPIO 33 上。这与许多其他 ESP32 开发板不同,使用时务必确认引脚定义,避免因引脚配置错误导致 LED 无法正常工作。

二、核心代码经验
1. 初始化注意事项
Adafruit_NeoPixel pixels(NUMPIXELS, RGB_PIN, NEO_GRB + NEO_KHZ800);第三个参数很关键
NEO_GRB 表示 LED 芯片的色序,不同厂商的 LED 可能使用不同顺序(如 GRB、RGB、RGBW 等)。
若颜色显示异常(如红色显示为蓝色),可尝试改为 NEO_RGB + NEO_KHZ800。
2. 亮度设置技巧
推荐起始亮度:
pixels.setBrightness(30)
室内使用建议亮度:10~50
电池供电场景:建议不超过 30,节省电量
高亮度(>150):可能导致颜色失真
3. 颜色定义优化
推荐使用预定义常量:
uint32_t colors[] = {
pixels.Color(255, 0, 0), // 红
pixels.Color(0, 255, 0), // 绿
pixels.Color(0, 0, 255), // 蓝
pixels.Color(255, 255, 0), // 黄
pixels.Color(255, 0, 255), // 紫
pixels.Color(0, 255, 255) // 青
};4. 呼吸灯效果
void breathingEffect(uint32_t color, int duration) {
for(int i=0; i<=255; i++) {
pixels.setBrightness(i);
pixels.setPixelColor(0, color);
pixels.show();
delay(duration/512);
}
for(int i=255; i>=0; i--) {
pixels.setBrightness(i);
pixels.setPixelColor(0, color);
pixels.show();
delay(duration/512);
}
}5. 平滑颜色过渡
void colorTransition(uint32_t fromColor, uint32_t toColor, int steps) {
uint8_t fromR = (fromColor >> 16) & 0xFF;
uint8_t fromG = (fromColor >> 8) & 0xFF;
uint8_t fromB = fromColor & 0xFF;
uint8_t toR = (toColor >> 16) & 0xFF;
uint8_t toG = (toColor >> 8) & 0xFF;
uint8_t toB = toColor & 0xFF;
for(int i=0; i<=steps; i++) {
float ratio = (float)i / steps;
uint8_t r = fromR + (toR - fromR) * ratio;
uint8_t g = fromG + (toG - fromG) * ratio;
uint8_t b = fromB + (toB - fromB) * ratio;
pixels.setPixelColor(0, pixels.Color(r, g, b));
pixels.show();
delay(20);
}
}6. 系统状态指示灯
enum SystemStatus {
STATUS_OK,
STATUS_WARNING,
STATUS_ERROR,
STATUS_CONNECTING
};
void indicateStatus(SystemStatus status) {
switch(status) {
case STATUS_OK:
pixels.setPixelColor(0, pixels.Color(0, 255, 0));
break;
case STATUS_WARNING:
pixels.setPixelColor(0, pixels.Color(255, 150, 0));
break;
case STATUS_ERROR:
pixels.setPixelColor(0, pixels.Color(255, 0, 0));
break;
case STATUS_CONNECTING:
// 闪烁蓝色
pixels.setPixelColor(0, pixels.Color(0, 0, 255));
pixels.show();
delay(200);
pixels.clear();
pixels.show();
delay(200);
return;
}
pixels.show();
}三、常见问题排查
LED 不亮
检查引脚定义是否为 GPIO 33
确认已调用 pixels.begin() 和 pixels.show()
检查电源是否充足(NeoPixel 对电压较敏感)
颜色显示错误
尝试不同色序(NEO_GRB、NEO_RGB、NEO_BRG 等)
检查颜色值是否超出 0-255 范围
闪烁异常
添加 delay() 延迟,避免刷新过快
检查是否有其他中断干扰
确保供电稳定
四、最佳实践总结
在 setup() 中调用 begin()
设置合理的默认亮度
每次更改颜色后需调用 pixels.show() 才会生效
避免在高速循环中频繁调用 show()
为长时间运行的项目添加异常处理
五、把此贴内容和过程2中的代码融合:
#include <Adafruit_NeoPixel.h>
// TCS3200引脚定义
int s0 = 12, s1 = 11, s2 = 10, s3 = 9;
int outPin = 6;
// 板载RGB LED引脚定义
#define RGB_PIN 33
#define NUMPIXELS 1
// 频率测量变量
volatile unsigned long pulseCount = 0;
unsigned long redFrequency = 0, greenFrequency = 0, blueFrequency = 0;
// 初始化NeoPixel对象
Adafruit_NeoPixel pixels(NUMPIXELS, RGB_PIN, NEO_GRB + NEO_KHZ800);
// 预定义颜色
uint32_t redColor = pixels.Color(255, 0, 0);
uint32_t greenColor = pixels.Color(0, 255, 0);
uint32_t blueColor = pixels.Color(0, 0, 255);
// 中断函数
void IRAM_ATTR countPulse() {
pulseCount++;
}
void setup() {
Serial.begin(115200);
// 初始化TCS3200引脚
pinMode(s0, OUTPUT);
pinMode(s1, OUTPUT);
pinMode(s2, OUTPUT);
pinMode(s3, OUTPUT);
// 设置频率缩放为20%(HIGH, LOW)
digitalWrite(s0, HIGH);
digitalWrite(s1, LOW);
// 初始化out引脚并附加中断
pinMode(outPin, INPUT);
attachInterrupt(digitalPinToInterrupt(outPin), countPulse, FALLING);
// 初始化RGB LED
pixels.begin();
pixels.setBrightness(30); // 设置亮度(0-255)
Serial.println("TCS3200颜色传感器 - 带RGB显示");
Serial.println("=============================");
}
void loop() {
// 读取红色
digitalWrite(s2, LOW);
digitalWrite(s3, LOW);
delay(10);
pulseCount = 0;
delay(100);
redFrequency = pulseCount;
// 读取绿色
digitalWrite(s2, HIGH);
digitalWrite(s3, HIGH);
delay(10);
pulseCount = 0;
delay(100);
greenFrequency = pulseCount;
// 读取蓝色
digitalWrite(s2, LOW);
digitalWrite(s3, HIGH);
delay(10);
pulseCount = 0;
delay(100);
blueFrequency = pulseCount;
// 打印频率值
Serial.print("红: ");
Serial.print(redFrequency);
Serial.print(" 绿: ");
Serial.print(greenFrequency);
Serial.print(" 蓝: ");
Serial.print(blueFrequency);
Serial.print(" 颜色: ");
// 简单的颜色判断并显示到RGB LED
if (redFrequency > greenFrequency && redFrequency > blueFrequency) {
Serial.println("红色");
pixels.setPixelColor(0, redColor);
}
else if (greenFrequency > redFrequency && greenFrequency > blueFrequency) {
Serial.println("绿色");
pixels.setPixelColor(0, greenColor);
}
else if (blueFrequency > redFrequency && blueFrequency > greenFrequency) {
Serial.println("蓝色");
pixels.setPixelColor(0, blueColor);
}
else {
Serial.println("其他颜色");
}
// 更新LED显示
pixels.show();
delay(1000);
}


我要赚赏金
