Tue. Jul 28th, 2026

AI suggests the code below as a sample program. I am going to try it.

#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_TCS34725.h>

// Create sensor object
Adafruit_TCS34725 tcs(
    TCS34725_INTEGRATIONTIME_50MS,
    TCS34725_GAIN_4X
);

// LED control pin on AtomS3U Grove port
#define LED_PIN 2   // adjust if your Grove port uses a different pin

void setup() {
  Serial.begin(115200);
  Wire.begin();   // AtomS3U uses default SDA/SCL pins

  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, HIGH);   // LED off (active low)

  if (!tcs.begin()) {
    Serial.println("TCS34725 not found");
    while (1);
  }

  Serial.println("TCS34725 ready");
}

void loop() {
  uint16_t r, g, b, c;

  // LED on (active low)
  digitalWrite(LED_PIN, LOW);
  delay(10);

  tcs.getRawData(&r, &g, &b, &c);

  Serial.print("R: "); Serial.print(r);
  Serial.print("  G: "); Serial.print(g);
  Serial.print("  B: "); Serial.print(b);
  Serial.print("  C: "); Serial.println(c);

  // LED off
  digitalWrite(LED_PIN, HIGH);

  delay(500);
}
String getColorName(uint16_t r, uint16_t g, uint16_t b) {

  // Avoid divide-by-zero
  uint16_t sum = r + g + b;
  if (sum == 0) return "Black";

  float rf = (float)r / sum;
  float gf = (float)g / sum;
  float bf = (float)b / sum;

  // Basic thresholds
  if (sum < 50) return "Very Dark";

  if (rf > 0.45 && gf < 0.30 && bf < 0.30) return "Red";
  if (gf > 0.45 && rf < 0.30 && bf < 0.30) return "Green";
  if (bf > 0.45 && rf < 0.30 && gf < 0.30) return "Blue";

  if (rf > 0.33 && gf > 0.33 && bf < 0.20) return "Yellow";
  if (rf > 0.33 && bf > 0.33 && gf < 0.20) return "Magenta";
  if (gf > 0.33 && bf > 0.33 && rf < 0.20) return "Cyan";

  if (rf > 0.30 && gf > 0.30 && bf > 0.30) return "White";

  return "Unknown";
}

String getColorName(uint16_t r, uint16_t g, uint16_t b) {

  uint16_t sum = r + g + b;
  if (sum < 30) return "Very Dark";

  float rf = (float)r / sum;
  float gf = (float)g / sum;
  float bf = (float)b / sum;

  // Dominant colour detection
  if (rf > gf && rf > bf) {
    // Red dominant
    if (gf > 0.30) return "Yellow";     // red + green = yellow
    if (bf > 0.30) return "Magenta";    // red + blue = magenta
    return "Red";
  }

  if (gf > rf && gf > bf) {
    // Green dominant
    if (rf > 0.30) return "Yellow";     // green + red = yellow
    if (bf > 0.30) return "Cyan";       // green + blue = cyan
    return "Green";
  }

  if (bf > rf && bf > gf) {
    // Blue dominant
    if (rf > 0.30) return "Magenta";    // blue + red = magenta
    if (gf > 0.30) return "Cyan";       // blue + green = cyan
    return "Blue";
  }

  // If all similar
  if (rf > 0.28 && gf > 0.28 && bf > 0.28) return "White";

  return "Unknown";
}

String getColorName(uint16_t r, uint16_t g, uint16_t b, uint16_t c) {

  uint16_t sum = r + g + b;
  if (sum < 30 || c < 30) return "Very Dark";

  float rf = (float)r / sum;
  float gf = (float)g / sum;
  float bf = (float)b / sum;

  // Bright neutral: treat as white
  if (c > 800 && rf > 0.25 && gf > 0.25 && bf > 0.25) {
    return "White";
  }

  const float margin = 0.08;

  bool gDominant = (gf > rf + margin) && (gf > bf + margin);
  bool rDominant = (rf > gf + margin) && (rf > bf + margin);
  bool bDominant = (bf > rf + margin) && (bf > gf + margin);

  // --- Explicit colour patterns (based on your real readings) ---

  // Cyan: green + blue strong, red low
  if (gf > 0.35 && bf > 0.35 && rf < 0.25) {
    return "Cyan";
  }

  // Purple: red + blue strong, green low
  if (rf > 0.33 && bf > 0.33 && gf < 0.27) {
    return "Purple";
  }

  // Yellow: red high, green high, blue low (tuned to your readings)
  if (rf > 0.38 && gf > 0.32 && bf < 0.22) {
    return "Yellow";
  }

  // --- Dominant colour logic ---

  if (gDominant) {
    if (bf > 0.30) return "Cyan";
    return "Green";
  }

  if (rDominant) {
    if (bf > 0.30) return "Magenta";
    return "Red";
  }

  if (bDominant) {
    if (rf > 0.30 && gf < 0.27) return "Purple";
    if (gf > 0.30) return "Cyan";
    return "Blue";
  }

  // Balanced channels → white
  if (rf > 0.28 && gf > 0.28 && bf > 0.28) return "White";

  return "Unknown";
}

Whole program as it stands now …

#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_TCS34725.h>

// see https://github.com/Seeed-Studio/Grove_I2C_Color_Sensor_TCS3472


// Create sensor object
Adafruit_TCS34725 tcs(
    TCS34725_INTEGRATIONTIME_154MS,
    TCS34725_GAIN_16X
);

// LED control pin on AtomS3U Grove port
#define LED_PIN 3   // adjust if your Grove port uses a different pin

String getColorName(uint16_t r, uint16_t g, uint16_t b, uint16_t c) {

  uint16_t sum = r + g + b;
  if (sum < 30 || c < 30) return "Very Dark";

  float rf = (float)r / sum;
  float gf = (float)g / sum;
  float bf = (float)b / sum;

  // Bright neutral: treat as white
  if (c > 800 && rf > 0.25 && gf > 0.25 && bf > 0.25) {
    return "White";
  }

  const float margin = 0.08;

  bool gDominant = (gf > rf + margin) && (gf > bf + margin);
  bool rDominant = (rf > gf + margin) && (rf > bf + margin);
  bool bDominant = (bf > rf + margin) && (bf > gf + margin);

  // --- Explicit colour patterns (based on your real readings) ---

  // Cyan: green + blue strong, red low
  if (gf > 0.35 && bf > 0.35 && rf < 0.25) {
    return "Cyan";
  }

  // Purple: red + blue strong, green low
  if (rf > 0.33 && bf > 0.33 && gf < 0.27) {
    return "Purple";
  }

  // Yellow: red high, green high, blue low (tuned to your readings)
  if (rf > 0.38 && gf > 0.32 && bf < 0.22) {
    return "Yellow";
  }

  // --- Dominant colour logic ---

  if (gDominant) {
    if (bf > 0.30) return "Cyan";
    return "Green";
  }

  if (rDominant) {
    if (bf > 0.30) return "Magenta";
    return "Red";
  }

  if (bDominant) {
    if (rf > 0.30 && gf < 0.27) return "Purple";
    if (gf > 0.30) return "Cyan";
    return "Blue";
  }

  // Balanced channels → white
  if (rf > 0.28 && gf > 0.28 && bf > 0.28) return "White";

  return "Unknown";
}

void setup() {
  Serial.begin(115200);
  Wire.begin();   // AtomS3U uses default SDA/SCL pins

  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, HIGH);   // LED off (active low)

  if (!tcs.begin()) {
    Serial.println("TCS34725 not found");
    while (1);
  }

  Serial.println("TCS34725 ready");
}

void loop() {
  uint16_t r, g, b, c;
  tcs.getRawData(&r, &g, &b, &c);
  String name = getColorName(r, g, b, c);
  Serial.printf("R:%u G:%u B:%u C:%u -> %s\n", r, g, b, c, name.c_str());
  delay(1000);
}

By admin

Leave a Reply

Your email address will not be published. Required fields are marked *