这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【Let'sdo第3期-拾色播放器DIY】过程贴3:颜色传感器+板载RGB

共2条 1/1 1 跳转至

【Let'sdo第3期-拾色播放器DIY】过程贴3:颜色传感器+板载RGB

助工
2025-12-14 22:06:58     打赏

基础任务二:

实现板载RGB的全彩控制,实时显示当前获取的颜色;

这个任务我们拆解一下就在我们过程2中颜色传感器驱动以及按键获取再加上驱动板子上的RGB:


一、硬件连接确认

  • 重要提醒:根据 Adafruit 官方文档,ESP32-S3 Reverse TFT Feather 板载的 NeoPixel LED 实际连接在 GPIO 33 上。这与许多其他 ESP32 开发板不同,使用时务必确认引脚定义,避免因引脚配置错误导致 LED 无法正常工作。

image.png


二、核心代码经验

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);
}


image.png

image.png

image.png




关键词: 拾色     播放器     过程     颜色     传感器     驱动     板载RGB    

专家
2025-12-15 09:10:55     打赏
2楼

谢谢分享


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]