Inhaltsverzeichnis
Für dieses Projekt benötigst du
Aufgabenstellung
Im Seriellen Monitor sollen die mit dem Farbsensor TCS34725 ermittelten Farbwerte angezeigt werden. Wird jeweils ein farbiger Streifen in den Farben rot, grün oder blau über den Farbsensor gehalten, zeigt der Serielle Monitor die entsprechende Farbe an.
Der RGB-Farbraum
Der RGB-Farbraum besteht aus den drei Grundfarben rot, grün und blau. Fast alle Farben entstehen durch das Mischen dieser drei Grundfarben. Jede Farbe hat 256 Helligkeitsstufen, eine nichtaktive Farbe hat den Wert 0, die volle Helligkeit wird mit dem Wert 255 dargestellt.
Die Farbmischung wird durch den Wert der Helligkeit der drei Farben dargestellt.
Beispiele:
rot: 255, 0, 0
grün: 0, 255, 0
blau: 0, 0, 255
gelb: 255, 255, 0
schwarz: 0, 0, 0
weiß: 255, 255, 255
Die Hardware
Der Farbsensor kann die Farben rot, grün und blau (RGB) unterscheiden. Er wird mit I2C angeschlossen.
Wenn dir kein Grove-Shield zur Verfügung steht, kannst du den Stecker mit Kabeln verbinden und am Mikrocontroller anschließen.
Farbwerte im Seriellen Monitor anzeigen
Der Schaltplan
Hinweise zum Quellcode
Die gemessenen Farbwerte hängen von der Helligkeit der Umgebung ab. Mit Hilfe des Seriellen Monitors kannst du die Messergebnisse beobachten und anschließend in Zeilen 66 bis 68 den Grenzwert anpassen.
Benötigte Bibliothek
Der Quellcode
#include "Adafruit_TCS34725.h"
/*
TCS34725_INTEGRATIONTIME
längere Zeiten erhöhen die Empfindlichkeit besonders bei schwachem Licht
mögliche Werte: 2.4MS, 50MS, 101MS, 154MS
----------
TCS34725_GAIN
Empfindlichkeit einstellen
4X, 16X, 60X
*/
Adafruit_TCS34725 RGBSensor = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_4X);
void setup()
{
Serial.begin(9600);
// auf serielle Verbindung warten
while (!Serial);
delay(1000);
// Farbsensor starten
if (RGBSensor.begin())
{
Serial.println("Sensor gefunden!");
}
// wenn der Sensor nicht gefunden wurde
else
{
Serial.println("Sensor nicht gefunden");
// Programm anhalten
while (1);
}
}
void loop()
{
// Variable für die Farben
float rot, gruen, blau;
// Sensor einschalten
RGBSensor.setInterrupt(false);
delay(60);
// Daten erfassen
RGBSensor.getRGB(&rot, &gruen, &blau);
// Sensor ausschalten
RGBSensor.setInterrupt(true);
// Farbwerte anzeigen
Serial.print("rot:\t");
Serial.print(int(rot));
Serial.print("\tgrün:\t");
Serial.print(int(gruen));
Serial.print("\tblau:\t");
Serial.println(int(blau));
// Grenzwert, bei dem die entsprechende Farbe erkannt wurde
// im Beispiel 100
// mit Hilfe der Anzeige im Seriellen Monitor anpassen
if (rot > 100) Serial.println("roter Streifen");
if (gruen > 100) Serial.println("grüner Streifen");
if (blau > 100) Serial.println("blauer Streifen");
delay(500);
}
Erweiterung des Programms: Farbwerte mit einer RGB-LED sichtbar machen
Die Schaltung wird mit einer RGB-LED erweitert. Wird ein farbiger Streifen in den Farben rot, grün oder blau über den Sensor gehalten, leuchtet die entsprechende farbige LED.
Das Programm im Film
Der Schaltplan
Der Quellcode
#include "Adafruit_TCS34725.h"
/*
TCS34725_INTEGRATIONTIME
längere Zeiten erhöhen die Empfindlichkeit besonders bei schwachem Licht
mögliche Werte: 2.4MS, 50MS, 101MS, 154MS
----------
TCS34725_GAIN
Empfindlichkeit einstellen
4X, 16X, 60X
*/
Adafruit_TCS34725 RGBSensor = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_4X);
// Pins der RGB-LED
int roteLED = 6;
int grueneLED = 5;
int blaueLED = 4;
void setup()
{
Serial.begin(9600);
// auf serielle Verbindung warten
while (!Serial);
delay(1000);
pinMode(roteLED, OUTPUT);
pinMode(grueneLED, OUTPUT);
pinMode(blaueLED, OUTPUT);
// Farbsensor starten
if (RGBSensor.begin())
{
Serial.println("Sensor gefunden!");
}
// wenn der Sensor nicht gefunden wurde
else
{
Serial.println("Sensor nicht gefunden");
// Programm anhalten
while (1);
}
}
void loop()
{
// Variable für die Farben
float rot, gruen, blau;
// Sensor einschalten
RGBSensor.setInterrupt(false);
delay(60);
// Daten erfassen
RGBSensor.getRGB(&rot, &gruen, &blau);
// Sensor ausschalten
RGBSensor.setInterrupt(true);
// Farbwerte anzeigen
Serial.print("rot:\t");
Serial.print(int(rot));
Serial.print("\tgrün:\t");
Serial.print(int(gruen));
Serial.print("\tblau:\t");
Serial.println(int(blau));
// Grenzwerte -> RGB-LED bleibt aus
// mit Hilfe der Anzeige im Seriellen Monitor anpassen
if (rot < 100 && gruen < 100 && blau < 100)
{
digitalWrite(roteLED, LOW);
digitalWrite(grueneLED, LOW);
digitalWrite(blaueLED, LOW);
}
// wird der Grenzwert überschritten leuchtet die RGB-LED
// in der entsprechenden Farbe
// mit Hilfe der Anzeige im Seriellen Monitor anpassen
if (rot > 100)
{
digitalWrite(roteLED, HIGH);
Serial.println("roter Streifen");
}
if (gruen > 100)
{
digitalWrite(grueneLED, HIGH);
Serial.println("grüner Streifen");
}
if (blau > 100)
{
digitalWrite(blaueLED, HIGH);
Serial.println("blauer Streifen");
}
delay(500);
}
Funduino - Dein Onlineshop für Mikroelektronik
-
Dauerhaft bis zu 10% Rabatt für Schüler, Studenten und Lehrkräfte
-
Mehr als 3.500 Artikel sofort verfügbar!
-
Über 8 Jahre Erfahrung mit Arduino, 3D-Druck und co.