// Libraries einbinden #include "Wire.h" #include "Adafruit_TCS34725.h" #include LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display. ACHTUNG: Adresse kann auch 0x3F sein !!! // Anschlüsse: // GND - GND // VCC - 5V // SDA - ANALOG Pin 4 // SCL - ANALOG pin 5 // Color Sensor-Objekt initialisieren // Parameter siehe: https://learn.adafruit.com/adafruit-color-sensors/program-it Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_1X); // =========================== // ======= SETUP ========= // =========================== // setup() wird einmal beim Start des Arduino ausgeführt void setup() { // Serielle Kommunikation zur Ausgabe der Wert im seriellen Monitor Serial.begin(9600); lcd.begin(); // initialize the lcd lcd.backlight(); lcd.setCursor(0,0); lcd.print("Farbsensor"); lcd.setCursor(0,1); lcd.print("Version 1.0"); delay(3000); lcd.setCursor(0,0); lcd.print(" "); lcd.setCursor(0,1); lcd.print(" "); // Überprüfen, ob Color Sensor sich auch zurückmeldet if (tcs.begin()) { // Alles OK Serial.println("Sensor gefunden"); } else { // Kein Sensor gefunden. Programm an dieser Stelle einfrieren Serial.println("TCS34725 nicht gefunden ... Ablauf gestoppt!"); while (1); // Halt! } } // =========================== // ======= LOOP ========= // =========================== // loop() wird wiederholt, solange der Arduino läuft void loop() { // Der Sensor liefert Werte für R, G, B und einen Clear-Wert zurück uint16_t clearcol, red, green, blue; float r, g, b; delay(100); // Farbmessung dauert c. 50ms tcs.getRawData(&red, &green, &blue, &clearcol); // Mein Versuch einer Farbbestimmung für // die 5 M&M-Farben Rot, Grün, Blau, Orange und Gelb // relative Farbanteile // alle Werte ergeben in Summe 1 r = 1.0 * red / (red + green + blue); g = 1.0 * green / (red + green + blue); b = 1.0 * blue / (red + green + blue); // Clear-Wert und r,g,b seriell ausgeben zur Kontrolle Serial.print("\tClear:"); Serial.print(clearcol); Serial.print("\tRed:"); Serial.print(r); Serial.print("\tGreen:"); Serial.print(g); Serial.print("\tBlue:"); Serial.print(b); if ((r > 0.5) && (g < 0.25) && (b < 0.25)) { Serial.print("\tROT"); lcd.setCursor(0,0); lcd.print(r,2); lcd.print(" "); lcd.print(g,2); lcd.print(" "); lcd.print(b,2); lcd.setCursor(0,1); lcd.print("ROT "); } else if ((r < 0.35) && (g > 0.45) && (b < 0.3)) { Serial.print("\tGRUEN"); lcd.setCursor(0,0); lcd.print(r,2); lcd.print(" "); lcd.print(g,2); lcd.print(" "); lcd.print(b,2); lcd.setCursor(0,1); lcd.print("GRUEN "); } else if ((r < 0.2) && (g < 0.35) && (b > 0.5)) { Serial.print("\tBLAU"); lcd.setCursor(0,0); lcd.print(r,2); lcd.print(" "); lcd.print(g,2); lcd.print(" "); lcd.print(b,2); lcd.setCursor(0,1); lcd.print("BLAU "); } // Gelb und Orange sind etwas tricky, aber nach etwas // Herumprobieren haben sich bei mir diese Werte als // gut erwiesen else if ((r > 0.35) && (g > 0.4) && (b < 0.2)) { Serial.print("\tGELB"); lcd.setCursor(0,0); lcd.print(r,2); lcd.print(" "); lcd.print(g,2); lcd.print(" "); lcd.print(b,2); lcd.setCursor(0,1); lcd.print("GELB "); } else if ((r > 0.4) && (g > 0.22) && (b < 0.2)) { Serial.print("\tORANGE"); lcd.setCursor(0,0); lcd.print(r,2); lcd.print(" "); lcd.print(g,2); lcd.print(" "); lcd.print(b,2); lcd.setCursor(0,1); lcd.print("ORANGE "); } // Wenn keine Regel greift, dann ehrlich sein else { Serial.print("\tNICHT ERKANNT"); lcd.setCursor(0,0); lcd.print(r,2); lcd.print(" "); lcd.print(g,2); lcd.print(" "); lcd.print(b,2); lcd.setCursor(0,1); lcd.print("NICHT ERKANNT "); } // Zeilenwechsel ausgeben Serial.println(""); // Wartezeit anpassen für serielles Debugging delay(100); }