

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