{"id":429,"date":"2026-07-20T22:36:30","date_gmt":"2026-07-20T21:36:30","guid":{"rendered":"https:\/\/myjetsonnano.perseus314.com\/?p=429"},"modified":"2026-07-21T00:55:04","modified_gmt":"2026-07-20T23:55:04","slug":"i2c-color-sensor-v2-0","status":"publish","type":"post","link":"https:\/\/myjetsonnano.perseus314.com\/index.php\/2026\/07\/20\/i2c-color-sensor-v2-0\/","title":{"rendered":"I\u00b2C Color Sensor V2.0 (TCS34725)"},"content":{"rendered":"\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"474\" height=\"474\" src=\"https:\/\/myjetsonnano.perseus314.com\/wp-content\/uploads\/2026\/07\/image-32.png\" alt=\"\" class=\"wp-image-430\" srcset=\"https:\/\/myjetsonnano.perseus314.com\/wp-content\/uploads\/2026\/07\/image-32.png 474w, https:\/\/myjetsonnano.perseus314.com\/wp-content\/uploads\/2026\/07\/image-32-300x300.png 300w, https:\/\/myjetsonnano.perseus314.com\/wp-content\/uploads\/2026\/07\/image-32-150x150.png 150w\" sizes=\"auto, (max-width: 474px) 100vw, 474px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"400\" src=\"https:\/\/myjetsonnano.perseus314.com\/wp-content\/uploads\/2026\/07\/image-33.png\" alt=\"\" class=\"wp-image-431\" srcset=\"https:\/\/myjetsonnano.perseus314.com\/wp-content\/uploads\/2026\/07\/image-33.png 400w, https:\/\/myjetsonnano.perseus314.com\/wp-content\/uploads\/2026\/07\/image-33-300x300.png 300w, https:\/\/myjetsonnano.perseus314.com\/wp-content\/uploads\/2026\/07\/image-33-150x150.png 150w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">AI suggests the code below as a sample program. I am going to try it.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;Arduino.h>\n#include &lt;Wire.h>\n#include &lt;Adafruit_TCS34725.h>\n\n\/\/ Create sensor object\nAdafruit_TCS34725 tcs(\n    TCS34725_INTEGRATIONTIME_50MS,\n    TCS34725_GAIN_4X\n);\n\n\/\/ LED control pin on AtomS3U Grove port\n#define LED_PIN 2   \/\/ adjust if your Grove port uses a different pin\n\nvoid setup() {\n  Serial.begin(115200);\n  Wire.begin();   \/\/ AtomS3U uses default SDA\/SCL pins\n\n  pinMode(LED_PIN, OUTPUT);\n  digitalWrite(LED_PIN, HIGH);   \/\/ LED off (active low)\n\n  if (!tcs.begin()) {\n    Serial.println(\"TCS34725 not found\");\n    while (1);\n  }\n\n  Serial.println(\"TCS34725 ready\");\n}\n\nvoid loop() {\n  uint16_t r, g, b, c;\n\n  \/\/ LED on (active low)\n  digitalWrite(LED_PIN, LOW);\n  delay(10);\n\n  tcs.getRawData(&amp;r, &amp;g, &amp;b, &amp;c);\n\n  Serial.print(\"R: \"); Serial.print(r);\n  Serial.print(\"  G: \"); Serial.print(g);\n  Serial.print(\"  B: \"); Serial.print(b);\n  Serial.print(\"  C: \"); Serial.println(c);\n\n  \/\/ LED off\n  digitalWrite(LED_PIN, HIGH);\n\n  delay(500);\n}\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>String getColorName(uint16_t r, uint16_t g, uint16_t b) {\n\n  \/\/ Avoid divide-by-zero\n  uint16_t sum = r + g + b;\n  if (sum == 0) return \"Black\";\n\n  float rf = (float)r \/ sum;\n  float gf = (float)g \/ sum;\n  float bf = (float)b \/ sum;\n\n  \/\/ Basic thresholds\n  if (sum &lt; 50) return \"Very Dark\";\n\n  if (rf > 0.45 &amp;&amp; gf &lt; 0.30 &amp;&amp; bf &lt; 0.30) return \"Red\";\n  if (gf > 0.45 &amp;&amp; rf &lt; 0.30 &amp;&amp; bf &lt; 0.30) return \"Green\";\n  if (bf > 0.45 &amp;&amp; rf &lt; 0.30 &amp;&amp; gf &lt; 0.30) return \"Blue\";\n\n  if (rf > 0.33 &amp;&amp; gf > 0.33 &amp;&amp; bf &lt; 0.20) return \"Yellow\";\n  if (rf > 0.33 &amp;&amp; bf > 0.33 &amp;&amp; gf &lt; 0.20) return \"Magenta\";\n  if (gf > 0.33 &amp;&amp; bf > 0.33 &amp;&amp; rf &lt; 0.20) return \"Cyan\";\n\n  if (rf > 0.30 &amp;&amp; gf > 0.30 &amp;&amp; bf > 0.30) return \"White\";\n\n  return \"Unknown\";\n}\n\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>String getColorName(uint16_t r, uint16_t g, uint16_t b) {\n\n  uint16_t sum = r + g + b;\n  if (sum &lt; 30) return \"Very Dark\";\n\n  float rf = (float)r \/ sum;\n  float gf = (float)g \/ sum;\n  float bf = (float)b \/ sum;\n\n  \/\/ Dominant colour detection\n  if (rf > gf &amp;&amp; rf > bf) {\n    \/\/ Red dominant\n    if (gf > 0.30) return \"Yellow\";     \/\/ red + green = yellow\n    if (bf > 0.30) return \"Magenta\";    \/\/ red + blue = magenta\n    return \"Red\";\n  }\n\n  if (gf > rf &amp;&amp; gf > bf) {\n    \/\/ Green dominant\n    if (rf > 0.30) return \"Yellow\";     \/\/ green + red = yellow\n    if (bf > 0.30) return \"Cyan\";       \/\/ green + blue = cyan\n    return \"Green\";\n  }\n\n  if (bf > rf &amp;&amp; bf > gf) {\n    \/\/ Blue dominant\n    if (rf > 0.30) return \"Magenta\";    \/\/ blue + red = magenta\n    if (gf > 0.30) return \"Cyan\";       \/\/ blue + green = cyan\n    return \"Blue\";\n  }\n\n  \/\/ If all similar\n  if (rf > 0.28 &amp;&amp; gf > 0.28 &amp;&amp; bf > 0.28) return \"White\";\n\n  return \"Unknown\";\n}\n\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>String getColorName(uint16_t r, uint16_t g, uint16_t b, uint16_t c) {\n\n  uint16_t sum = r + g + b;\n  if (sum &lt; 30 || c &lt; 30) return \"Very Dark\";\n\n  float rf = (float)r \/ sum;\n  float gf = (float)g \/ sum;\n  float bf = (float)b \/ sum;\n\n  \/\/ Bright neutral: treat as white\n  if (c > 800 &amp;&amp; rf > 0.25 &amp;&amp; gf > 0.25 &amp;&amp; bf > 0.25) {\n    return \"White\";\n  }\n\n  const float margin = 0.08;\n\n  bool gDominant = (gf > rf + margin) &amp;&amp; (gf > bf + margin);\n  bool rDominant = (rf > gf + margin) &amp;&amp; (rf > bf + margin);\n  bool bDominant = (bf > rf + margin) &amp;&amp; (bf > gf + margin);\n\n  \/\/ --- Explicit colour patterns (based on your real readings) ---\n\n  \/\/ Cyan: green + blue strong, red low\n  if (gf > 0.35 &amp;&amp; bf > 0.35 &amp;&amp; rf &lt; 0.25) {\n    return \"Cyan\";\n  }\n\n  \/\/ Purple: red + blue strong, green low\n  if (rf > 0.33 &amp;&amp; bf > 0.33 &amp;&amp; gf &lt; 0.27) {\n    return \"Purple\";\n  }\n\n  \/\/ Yellow: red high, green high, blue low (tuned to your readings)\n  if (rf > 0.38 &amp;&amp; gf > 0.32 &amp;&amp; bf &lt; 0.22) {\n    return \"Yellow\";\n  }\n\n  \/\/ --- Dominant colour logic ---\n\n  if (gDominant) {\n    if (bf > 0.30) return \"Cyan\";\n    return \"Green\";\n  }\n\n  if (rDominant) {\n    if (bf > 0.30) return \"Magenta\";\n    return \"Red\";\n  }\n\n  if (bDominant) {\n    if (rf > 0.30 &amp;&amp; gf &lt; 0.27) return \"Purple\";\n    if (gf > 0.30) return \"Cyan\";\n    return \"Blue\";\n  }\n\n  \/\/ Balanced channels \u2192 white\n  if (rf > 0.28 &amp;&amp; gf > 0.28 &amp;&amp; bf > 0.28) return \"White\";\n\n  return \"Unknown\";\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Whole program as it stands now &#8230;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;Arduino.h>\n#include &lt;Wire.h>\n#include &lt;Adafruit_TCS34725.h>\n\n\/\/ see https:\/\/github.com\/Seeed-Studio\/Grove_I2C_Color_Sensor_TCS3472\n\n\n\/\/ Create sensor object\nAdafruit_TCS34725 tcs(\n    TCS34725_INTEGRATIONTIME_154MS,\n    TCS34725_GAIN_16X\n);\n\n\/\/ LED control pin on AtomS3U Grove port\n#define LED_PIN 3   \/\/ adjust if your Grove port uses a different pin\n\nString getColorName(uint16_t r, uint16_t g, uint16_t b, uint16_t c) {\n\n  uint16_t sum = r + g + b;\n  if (sum &lt; 30 || c &lt; 30) return \"Very Dark\";\n\n  float rf = (float)r \/ sum;\n  float gf = (float)g \/ sum;\n  float bf = (float)b \/ sum;\n\n  \/\/ Bright neutral: treat as white\n  if (c > 800 &amp;&amp; rf > 0.25 &amp;&amp; gf > 0.25 &amp;&amp; bf > 0.25) {\n    return \"White\";\n  }\n\n  const float margin = 0.08;\n\n  bool gDominant = (gf > rf + margin) &amp;&amp; (gf > bf + margin);\n  bool rDominant = (rf > gf + margin) &amp;&amp; (rf > bf + margin);\n  bool bDominant = (bf > rf + margin) &amp;&amp; (bf > gf + margin);\n\n  \/\/ --- Explicit colour patterns (based on your real readings) ---\n\n  \/\/ Cyan: green + blue strong, red low\n  if (gf > 0.35 &amp;&amp; bf > 0.35 &amp;&amp; rf &lt; 0.25) {\n    return \"Cyan\";\n  }\n\n  \/\/ Purple: red + blue strong, green low\n  if (rf > 0.33 &amp;&amp; bf > 0.33 &amp;&amp; gf &lt; 0.27) {\n    return \"Purple\";\n  }\n\n  \/\/ Yellow: red high, green high, blue low (tuned to your readings)\n  if (rf > 0.38 &amp;&amp; gf > 0.32 &amp;&amp; bf &lt; 0.22) {\n    return \"Yellow\";\n  }\n\n  \/\/ --- Dominant colour logic ---\n\n  if (gDominant) {\n    if (bf > 0.30) return \"Cyan\";\n    return \"Green\";\n  }\n\n  if (rDominant) {\n    if (bf > 0.30) return \"Magenta\";\n    return \"Red\";\n  }\n\n  if (bDominant) {\n    if (rf > 0.30 &amp;&amp; gf &lt; 0.27) return \"Purple\";\n    if (gf > 0.30) return \"Cyan\";\n    return \"Blue\";\n  }\n\n  \/\/ Balanced channels \u2192 white\n  if (rf > 0.28 &amp;&amp; gf > 0.28 &amp;&amp; bf > 0.28) return \"White\";\n\n  return \"Unknown\";\n}\n\nvoid setup() {\n  Serial.begin(115200);\n  Wire.begin();   \/\/ AtomS3U uses default SDA\/SCL pins\n\n  pinMode(LED_PIN, OUTPUT);\n  digitalWrite(LED_PIN, HIGH);   \/\/ LED off (active low)\n\n  if (!tcs.begin()) {\n    Serial.println(\"TCS34725 not found\");\n    while (1);\n  }\n\n  Serial.println(\"TCS34725 ready\");\n}\n\nvoid loop() {\n  uint16_t r, g, b, c;\n  tcs.getRawData(&amp;r, &amp;g, &amp;b, &amp;c);\n  String name = getColorName(r, g, b, c);\n  Serial.printf(\"R:%u G:%u B:%u C:%u -> %s\\n\", r, g, b, c, name.c_str());\n  delay(1000);\n}\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>AI suggests the code below as a sample program. I am going to try it. Whole program as it stands now &#8230;<\/p>\n","protected":false},"author":1,"featured_media":431,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-429","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorised"],"_links":{"self":[{"href":"https:\/\/myjetsonnano.perseus314.com\/index.php\/wp-json\/wp\/v2\/posts\/429","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/myjetsonnano.perseus314.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/myjetsonnano.perseus314.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/myjetsonnano.perseus314.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/myjetsonnano.perseus314.com\/index.php\/wp-json\/wp\/v2\/comments?post=429"}],"version-history":[{"count":5,"href":"https:\/\/myjetsonnano.perseus314.com\/index.php\/wp-json\/wp\/v2\/posts\/429\/revisions"}],"predecessor-version":[{"id":437,"href":"https:\/\/myjetsonnano.perseus314.com\/index.php\/wp-json\/wp\/v2\/posts\/429\/revisions\/437"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/myjetsonnano.perseus314.com\/index.php\/wp-json\/wp\/v2\/media\/431"}],"wp:attachment":[{"href":"https:\/\/myjetsonnano.perseus314.com\/index.php\/wp-json\/wp\/v2\/media?parent=429"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/myjetsonnano.perseus314.com\/index.php\/wp-json\/wp\/v2\/categories?post=429"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/myjetsonnano.perseus314.com\/index.php\/wp-json\/wp\/v2\/tags?post=429"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}