Farbsensor TCS34725 und Arduino: Schritt-fÃŧr-Schritt-Anleitung
In diesem Beitrag mÃļchte ich dir den kleinen, gÃŧnstigen Farbsensor TCS34725 vorstellen und zeigen, wie du diesen am Arduino UNO R3 anschlieÃt und programmierst. Im Beitrag Arduino Lektion 60: Sensor fÃŧr Licht, Farbe und Gesten (APDS-9960) habe ich dir bereits ein multifunktionales Modul vorgestellt, welches ebenso die Farbe erkennen kann. Dieser Sensor stellt jedoch eine gÃŧnstige Alternative dar, wenn man lediglich das Feature der Farberkennung benÃļtigt.
https://youtu.be/WoLlCKWz2ok
Der TCS34725 Ãŧberzeugt durch seine einfache Integration Ãŧber die I2C-Schnittstelle und die umfangreiche UnterstÃŧtzung durch Bibliotheken wie die von Adafruit. Mit diesem Sensor lassen sich präzise RGB-Werte und Umgebungslichtdaten messen, was ihn ideal fÃŧr Projekte wie Farbkalibrierung, Beleuchtungsautomatisierung oder DIY-Roboter macht.
In diesem Beitrag zeige ich dir nicht nur, wie du den Sensor anschlieÃt, sondern auch, wie du die erfassten Farbwerte in deinem Projekt nutzen kannst. Als praktisches Beispiel verbinden wir eine RGB-LED, die die vom Sensor erkannten Farben in Echtzeit darstellt. So kannst du die Farberkennung auf anschauliche Weise erleben.
Bezug des Farbsensors TCS34725
Den hier vorgestellten Farbsensor bekommst du sehr gÃŧnstig auf den einschlägigen Plattformen.
- ebay.de* - ab 2,32 âŦ
- aliexpress.com - 2,59 âŦ
- amazon.de* - 3 âŦ
Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du Ãŧber diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstÃŧtzen. Der Preis fÃŧr dich bleibt dabei unverändert. Vielen Dank fÃŧr deine UnterstÃŧtzung!
Der Farbsensor verfÃŧgt Ãŧber eine I2C Schnittstelle und kann mit 5 V und 3.3V betrieben werden. Die beiden sehr leuchtstarken LEDs sind dauerhaft aktiv, kÃļnnen aber nach Bedarf Ãŧber den Pin LED deaktiviert werden.
Aufbau des Farbsensors TCS34725
Anschluss des Farbsensors TCS34725 via I2C an den Arduino
Durch die erwähnte I2C Schnittstelle ist der Anschluss an den Arduino sehr einfach und wir benÃļtigen fÃŧr diesen lediglich vier Breadboardkabel. Zusätzlich zum Farbsensor wird eine RGB-LED integriert, die die vom Sensor erkannten Farben visuell darstellt.
FÃŧr den Aufbau der Schaltung am Arduino benÃļtigst du:
- einen Arduino kompatiblen Mikrocontroller
- Arduino UNO R3*
- Arduino Nano V3*
- ein passendes Datenkabel*
- diverse Breadboardkabel*, männlich - männlich, 10 cm
- ein 170 Pin / 400 Pin Breadboard*
- eine RGB LED 5050*
Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du Ãŧber diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstÃŧtzen. Der Preis fÃŧr dich bleibt dabei unverändert. Vielen Dank fÃŧr deine UnterstÃŧtzung!
Programmieren des Farbsensors TCS34725 am Arduino UNO R3
FÃŧr die Programmierung des Arduino verwende ich die Arduino IDE 2.3.3 welche du unter https://www.arduino.cc/en/software fÃŧr Windows, macOS und Linux herunterladen kannst.
FÃŧr das Ansteuern / auslesen des Farbsensors benÃļtigen wir zusätzlich eine Bibliothek, hier gibt es diverse auf dem Markt welche ebenso kostenfrei erhältlich sind. Ich habe mit der Adafruit TCS34725 erfolgreich die Farbe auslesen kÃļnnen und mÃļchte dir diese herzlich empfehlen.
Um die Bibliothek zu installieren, musst du links den Bibliotheksverwalter (1) Ãļffnen und dort nach "Adafruit TCS34725" (2) suchen. Im ersten Eintrag wählst du hier die Schaltfläche "INSTALLIEREN" (3). Diese Bibliothek hat eine Abhängigkeit zu Adafruit BusIO welches wir ebenso installieren mÃŧssen, daher klicken wir in dem Dialog ebenso auf "ALLE INSTALLIEREN" (4)
Nachfolgend mÃļchte ich dir zeigen, wie du die Farbe auslesen und auf einer RGB LED darstellen kannst. Es wird zunächst nur die Farbe Rot, GrÃŧn und Blau dargestellt.
// Bibliotheken zur Steuerung und Auslesung des Farbsensors
#include
#include "Adafruit_TCS34725.h"
// Pins, an denen die RGB-LED angeschlossen ist
#define red 10
#define green 9
#define blue 11
// Instanziieren eines Objekts vom Typ Adafruit_TCS34725 mit spezifischen Parametern
Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_614MS, TCS34725_GAIN_1X);
// Variablen zum Speichern der Farbdaten und Lichtwerte
uint16_t r, g, b, c, colorTemp, lux;
void setup(void) {
// Starten der seriellen Kommunikation mit einer Baudrate von 9600
Serial.begin(9600);
// Definieren der LED-Pins als Ausgänge
pinMode(red, OUTPUT);
pinMode(green, OUTPUT);
pinMode(blue, OUTPUT);
// Initialisieren der Kommunikation mit dem Farbsensor
tcs.begin();
}
void loop(void) {
// Auslesen der Rohdaten (Rot, GrÃŧn, Blau, Klarheit) vom Sensor
tcs.getRawData(&r, &g, &b, &c);
// Berechnen der Farbtemperatur in Kelvin
colorTemp = tcs.calculateColorTemperature_dn40(r, g, b, c);
// Berechnen der Beleuchtungsstärke (Lux)
lux = tcs.calculateLux(r, g, b);
// Berechnen der RGB-Werte fÃŧr Rot, GrÃŧn und Blau basierend auf den Rohdaten
byte rgbColorRed = calcColorValue(r, c);
byte rgbColorGreen = calcColorValue(g, c);
byte rgbColorBlue = calcColorValue(b, c);
// Vergleichen der RGB-Werte, um die dominante Farbe zu ermitteln
byte maxColor = compareValues(rgbColorRed, rgbColorGreen, rgbColorBlue);
// ÃberprÃŧfen, welche der Farben (Rot, GrÃŧn, Blau) dominiert
bool isMainColorRed = maxColor == rgbColorRed;
bool isMainColorGreen = maxColor == rgbColorGreen;
bool isMainColorBlue = maxColor == rgbColorBlue;
// Setzen der LED-Farben basierend auf der dominanten Farbe
analogWrite(red, isMainColorRed ? 255 : 0);
analogWrite(green, isMainColorGreen ? 255 : 0);
analogWrite(blue, isMainColorBlue ? 255 : 0);
// Ausgabe der Farbtemperatur und Lux-Werte auf der seriellen Schnittstelle
Serial.println("Color Temp: " + String(colorTemp, DEC) + " K");
Serial.println("Lux: " + String(lux, DEC));
Serial.println("Rot: " + String(r, DEC));
Serial.println("GrÃŧn: " + String(g, DEC));
Serial.println("Blau: " + String(b, DEC));
Serial.println("Klarheit: " + String(c, DEC));
// Ausgabe der berechneten RGB-Werte auf der seriellen Schnittstelle
Serial.print("RGB-Wert: (" + String(rgbColorRed, DEC) + "," + String(rgbColorGreen) + "," + String(rgbColorBlue) + ")");
}
// Berechnet den RGB-Wert aus einem Farbwert (Rot, GrÃŧn oder Blau) und dem Klarheitswert
uint16_t calcColorValue(uint16_t color, uint16_t clarityValue) {
double rgbColorValue = (double)color / (double)clarityValue;
return round(rgbColorValue * 255);
}
// Vergleicht die RGB-Werte und gibt die dominante Farbe zurÃŧck
byte compareValues(byte r, byte g, byte b) {
if (r > g && r > b) {
return r;
} else if (g > r && g > b) {
return g;
} else if (b > r && b > g) {
return b;
}
return 0;
}
Umrechnen des Farbwertes in RGB Werte
Vom Sensor erhalten wir lediglich die Rohdaten fÃŧr die Farbinformationen um daraus einen RGB Wert zu berechnen nutze ich nachfolgende Formel:
Bedeutung der Variablen:
- 255: Die maximale RGB-Wert-Skala, auf die die Werte angepasst werden.
- Farbwert (color): Der Rohwert eines Farbkanals (Rot, GrÃŧn oder Blau), den der Sensor liefert.
- Klarheitswert (clarityValue): Ein Maà fÃŧr die Gesamtlichtintensität (Summe aller Farben und Helligkeit), um die Farbe zu normalisieren.
// Berechnet den RGB-Wert aus einem Farbwert (Rot, GrÃŧn oder Blau) und dem Klarheitswert
uint16_t calcColorValue(uint16_t color, uint16_t clarityValue) {
double rgbColorValue = (double)color / (double)clarityValue;
return round(rgbColorValue * 255);
}
Ermitteln der Farbe (einfache LÃļsung)
Zunächst konzentriere ich mich darauf, die drei Grundfarben Rot, GrÃŧn und Blau darzustellen. DafÃŧr verwende ich zu Beginn drei einfarbige WÃŧrfel in Rosa, GrÃŧn und Blau. Anhand der berechneten RGB-Werte lässt sich die dominante Farbe bestimmen, die dann Ãŧber die RGB-LED visualisiert wird.
// Berechnen der RGB-Werte fÃŧr Rot, GrÃŧn und Blau basierend auf den Rohdaten
byte rgbColorRed = calcColorValue(r, c);
byte rgbColorGreen = calcColorValue(g, c);
byte rgbColorBlue = calcColorValue(b, c);
// Vergleichen der RGB-Werte, um die dominante Farbe zu ermitteln
byte maxColor = compareValues(rgbColorRed, rgbColorGreen, rgbColorBlue);
// ÃberprÃŧfen, welche der Farben (Rot, GrÃŧn, Blau) dominiert
bool isMainColorRed = maxColor == rgbColorRed;
bool isMainColorGreen = maxColor == rgbColorGreen;
bool isMainColorBlue = maxColor == rgbColorBlue;
// Setzen der LED-Farben basierend auf der dominanten Farbe
analogWrite(red, isMainColorRed ? 255 : 0);
analogWrite(green, isMainColorGreen ? 255 : 0);
analogWrite(blue, isMainColorBlue ? 255 : 0);
Erweitern der Schaltung um einen Abstandssensor um die LEDs / den Sensor zu aktivieren
Wenn man etwas Stromsparen und ebenso auch den Sensor schonen mÃļchte, dann kann man einen kleinen Abstandssensor in die Schaltung integrieren und so die LEDs und die Messung abhängig davon mach, ob sich ein Gegenstand vor dem Sensor befindet.
FÃŧr die Schaltung verwende ich einen Infrarotabstandssensor welcher einen digitalen und analogen Ausgang hat. Da mich lediglich interessiert, ob sich ein Gegenstand vor dem Sensor befindet, verwende ich den digitalen Ausgang, welchen man Ãŧber einen Drehpotentiometer einstellen kann.
Infrarot Abstandssensor - TCRT5000
RÃŧckseite des Infrarot Abstandssensors
Im Code mÃŧssen wir recht wenig anpassen, denn der digitale Ausgang wird ähnlich einem Taster abgefragt und wir reagieren wenn dier LOW ist. Sollte der Ausgang HIGH sein so fÃŧhren wir keine Messung durch und deaktivien ebenso die RGB LED (alle Farbwerte auf 0).
#define led 5
#define irSensor 7
void setup(void) {
...
pinMode(led, OUTPUT);
pinMode(irSensor, INPUT);
digitalWrite(led, HIGH);
...
}
void loop(void) {
if (digitalRead(irSensor) == HIGH) {
digitalWrite(led, LOW);
analogWrite(red, 0);
analogWrite(green, 0);
analogWrite(blue, 0);
return;
}
digitalWrite(led, HIGH);
...
}
Read the full article