TCS230/TCS3200 Color Sensor with Arduino: Complete Implementation
The TCS230/TCS3200 represents industry-standard programmable color light-to-frequency converters interfacing with Arduino Uno through precise digital pin timing. Sensor contains 16 photodiodes with Red, Green, Blue, and Clear filters (4 each) sequentially activated via S2/S3 control lines outputting square wave frequencies proportional to detected color intensity.
Arduino measures pulse density using pulseIn() function on dedicated frequency output pin. Frequency-to-color calibration converts raw Hz measurements into standardized RGB values enabling reliable color identification across lighting conditions and surface types.
Complete Components Specification
- Arduino UNO R3 microcontroller board
- TCS230/TCS3200 Color Sensor Module (5V compatible)
- Male-to-male jumper wires (minimum 8 pieces)
- External 12V DC power supply adapter (1A capacity)
- White surface reference for calibration
- Breadboard for prototyping deployment
System Block Architecture

Precision Hardware Integration Protocol
VCC (Sensor): Connect to Arduino 5V power rail
GND (Sensor): Connect to Arduino GND rail
OUT (Frequency): Connect to Arduino Digital Pin 8 (pulseIn() input)
S0: Connect to Arduino Digital Pin 4 (frequency scaling)
S1: Connect to Arduino Digital Pin 5 (frequency scaling)
S2 (Filter Select): Connect to Arduino Digital Pin 11
S3 (Filter Select): Connect to Arduino Digital Pin 12
Jumper wires establish all 8 sensor-to-Arduino connections per specified pin mapping. TCS230 operates at 2%, 20%, or 200% frequency scaling modes controlled through S0/S1 truth table.
// TCS230/TCS3200 Color Sensor with Arduino Uno - Professional Implementation
// Pin 8: Sensor OUT (frequency), Pins 4,5: S0/S1 scaling, Pins 11,12: S2/S3 filters
const int S0 = 4;
const int S1 = 5;
const int S2 = 11;
const int S3 = 12;
const int sensorOut = 8;
// Calibration values (adjust for your lighting conditions)
const int redMin = 200;
const int redMax = 1000;
const int greenMin = 200;
const int greenMax = 1000;
const int blueMin = 200;
const int blueMax = 1000;
void setup() {
Serial.begin(9600);
// Configure sensor control pins
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(sensorOut, INPUT);
// Set 20% scaling frequency for optimal resolution
digitalWrite(S0, HIGH);
digitalWrite(S1, LOW);
Serial.println("TCS230 Color Sensor Initialized - Place object before sensor");
}
void loop() {
// Read all three color channels
int redFreq = getFrequency();
int greenFreq = getFrequency();
int blueFreq = getFrequency();
// Convert frequencies to 0-255 RGB values
int red = mapFreq(redFreq, redMin, redMax);
int green = mapFreq(greenFreq, greenMin, greenMax);
int blue = mapFreq(blueFreq, blueMin, blueMax);
// Display results
Serial.print("R:"); Serial.print(red);
Serial.print(" G:"); Serial.print(green);
Serial.print(" B:"); Serial.print(blue);
Serial.print(" Raw:"];
Serial.print(redFreq); Serial.print(",");
Serial.print(greenFreq); Serial.print(",");
Serial.println(blueFreq);
delay(500);
}
int getFrequency() {
// Cycle through R,G,B filters
digitalWrite(S2, LOW);
digitalWrite(S3, LOW); // Red
delay(10);
unsigned long redPulse = pulseIn(sensorOut, LOW);
digitalWrite(S2, HIGH);
digitalWrite(S3, LOW); // Green
delay(10);
unsigned long greenPulse = pulseIn(sensorOut, LOW);
digitalWrite(S2, LOW);
digitalWrite(S3, HIGH); // Blue
delay(10);
unsigned long bluePulse = pulseIn(sensorOut, LOW);
return (redPulse + greenPulse + bluePulse) / 3;
}
int mapFreq(int freq, int minVal, int maxVal) {
int result = map(freq, minVal, maxVal, 255, 0);
return constrain(result, 0, 255);
}
Arduino IDE Professional Development Protocol
Launch Arduino IDE and establish new sketch document. Copy complete production code ensuring precise pin definitions match hardware wiring configuration.
Connect Arduino Uno to development host via USB cable. Verify board selection (Tools → Board → Arduino Uno) and COM port assignment for reliable firmware deployment.
Execute comprehensive code verification via checkmark icon validating syntax, memory utilization, and timing function compatibility.
Upload production firmware using right arrow icon. Monitor progress ensures complete bootloader overwrite and execution readiness.
Activate Serial Monitor (Tools → Serial Monitor) configuring 9600 baud rate. Observe real-time RGB frequency measurements and calibrated color values.
// TCS230 Color Recognition System - Automatic Color Classification
const int redThreshold = 100;
const int greenThreshold = 100;
const int blueThreshold = 100;
void loop() {
int redFreq = readRed();
int greenFreq = readGreen();
int blueFreq = readBlue();
String detectedColor = identifyColor(redFreq, greenFreq, blueFreq);
Serial.print("Detected Color: ");
Serial.print(detectedColor);
Serial.print(" | R:"); Serial.print(redFreq);
Serial.print(" G:"); Serial.print(greenFreq);
Serial.print(" B:"); Serial.println(blueFreq);
delay(1000);
}
int readRed() {
digitalWrite(S2, LOW);
digitalWrite(S3, LOW);
return pulseIn(sensorOut, LOW);
}
int readGreen() {
digitalWrite(S2, HIGH);
digitalWrite(S3, LOW);
return pulseIn(sensorOut, LOW);
}
int readBlue() {
digitalWrite(S2, LOW);
digitalWrite(S3, HIGH);
return pulseIn(sensorOut, LOW);
}
String identifyColor(int r, int g, int b) {
if(r < redThreshold && g > greenThreshold && b > blueThreshold) return "RED";
if(g < greenThreshold && r > redThreshold && b > blueThreshold) return "GREEN";
if(b < blueThreshold && r > redThreshold && g > greenThreshold) return "BLUE";
if(r < 300 && g < 300 && b < 300) return "BLACK";
if(r > 800 && g > 800 && b > 800) return "WHITE";
return "UNKNOWN";
}
Advanced Color Sensing Operation
TCS230 photodiodes sequentially filter Red (620-750nm), Green (495-570nm), Blue (450-495nm) spectral bands outputting square wave frequencies 2Hz-500kHz proportional to photon flux density. Arduino pulseIn() measures 10us-100ms pulse widths converting to color intensity values.
20% scaling mode (S0=HIGH, S1=LOW) provides optimal dynamic range for ambient lighting. Sequential R-G-B-Clear readings enable white balance compensation and surface reflectance characterization.
Industrial Applications & System Integration
- Automated manufacturing quality control - product color verification
- Recycling facility material sorting - plastic/resin identification
- Agricultural produce grading - ripeness detection by color
- Pharmaceutical pill verification - coating color inspection
- Textile industry fabric dyeing quality assurance
- Food processing contamination detection
- Medical test strip analysis
// Color Sensor + RGB LED - Real-time Color Matching System
const int redLed = 9;
const int greenLed = 10;
const int blueLed = 11;
void loop() {
int r = readRed();
int g = readGreen();
int b = readBlue();
// Map sensor frequencies to LED PWM values
int ledR = map(r, 200, 1000, 0, 255);
int ledG = map(g, 200, 1000, 0, 255);
int ledB = map(b, 200, 1000, 0, 255);
// Drive RGB LED matching detected color
analogWrite(redLed, constrain(ledR, 0, 255));
analogWrite(greenLed, constrain(ledG, 0, 255));
analogWrite(blueLed, constrain(ledB, 0, 255));
Serial.print("Sensor: ");
Serial.print(r); Serial.print(",");
Serial.print(g); Serial.print(",");
Serial.print(b);
Serial.print(" | LED: ");
Serial.print(ledR); Serial.print(",");
Serial.print(ledG); Serial.print(",");
Serial.println(ledB);
delay(100);
}
// Industrial Color Sorting System - Relay/Servo Control
const int sortRedPin = 7; // Red bin sorter
const int sortBluePin = 6; // Blue bin sorter
void loop() {
String color = identifyColor(readRed(), readGreen(), readBlue());
if(color == "RED") {
digitalWrite(sortRedPin, HIGH);
delay(500);
digitalWrite(sortRedPin, LOW);
}
else if(color == "BLUE") {
digitalWrite(sortBluePin, HIGH);
delay(500);
digitalWrite(sortBluePin, LOW);
}
Serial.println("Sorting: " + color);
delay(2000);
}
Production Calibration Procedures
- Capture minimum/maximum frequency values across pure Red/Green/Blue/white/black reference surfaces
- Adjust map() function parameters matching ambient lighting conditions
- Implement running average filtering reducing electrical noise impact
- Periodic recalibration compensates LED aging and environmental drift
- S0/S1 scaling selection optimizes dynamic range avoiding frequency overflow
Technical Performance Specifications
TCS230 delivers ±10% color accuracy across 400-700nm visible spectrum. 20% scaling produces 2kHz-50kHz output range readable by Arduino pulseIn() within 2ms integration time. 16:1 signal-to-noise ratio enables reliable detection under fluorescent/incandescent illumination.