Go Down

Topic: Wer hat Erfahrungen mit dem TCS34725 Farbsensor? (Read 189 times) previous topic - next topic

themanfrommoon

Mar 30, 2019, 11:19 pm Last Edit: Mar 30, 2019, 11:21 pm by themanfrommoon
Moin,

wer hat Erfahrungen mit dem TCS34725 Farbsensor?

Ich habe den Sensor an einem nodeMCU angeschlossen.
Der Sensor wird erkannt.
Auf die serielle Schnittstelle werden Daten geschrieben.

z.B.:

Color Temp: 3536 K - Lux: 762 - R: 1197 G: 1060 B: 713 C: 2894

Nur leider kann ich damit wenig anfangen.
Ich brauche die R, G, B Werte auf einer Skala von 0-255

Leider weiss ich nicht, auf welcher Skala der Sensor die Werte ausspuckt.

Color Temp ist die Farbtemperatur
Lux wohl die Lichtstärke
Und was mag wohl der C Wert sein?

Zusätzlich durchschaue ich die Anschlüsse auch noch nicht wirklich.
Wofür ist der 3,3 Volt Anschluss? Braucht man den zwingend (der Sensor schmeißt auch ohne dieses Werte raus)


Lieben Gruß,
Chris

uwefed

R: RED
G: GREEN
B: BLUE
C: CLEAR entspricht Weiß
LUX ist die Helligkeit
COLOR TEMP ist die Farbtemperatur, wieviel Rot bzw Blau im weißen Licht ist.

Welche Bibliothek verwendest Du?
Welchen Sketch benutzt Du?
Grüße Uwe

 

themanfrommoon

Ich benutze die Adafruit_TCS34725.h

Und nun möchte ich ein Display ansteuern, bei dem drei Balken, je einer für den Rot, Blau und Grün, angezeigt werden.

Aktuell siehts so aus:
Code: [Select]
#include <Wire.h>
#include <Adafruit_TCS34725.h>


/* Initialise with specific int time and gain values */
Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_700MS, TCS34725_GAIN_1X);
const int interruptPin = 2;
volatile boolean state = false;


//Interrupt Service Routine
void isr()
{
  state = true;
}


/* tcs.getRawData() does a delay(Integration_Time) after the sensor readout.
  We don't need to wait for the next integration cycle because we receive an interrupt when the integration cycle is complete*/
void getRawData_noDelay(uint16_t *r, uint16_t *g, uint16_t *b, uint16_t *c)
{
  *c = tcs.read16(TCS34725_CDATAL);
  *r = tcs.read16(TCS34725_RDATAL);
  *g = tcs.read16(TCS34725_GDATAL);
  *b = tcs.read16(TCS34725_BDATAL);
}


void setup() {
  pinMode(interruptPin, INPUT_PULLUP); //TCS interrupt output is Active-LOW and Open-Drain
  attachInterrupt(digitalPinToInterrupt(interruptPin), isr, FALLING);

  Serial.begin(9600);

  if (tcs.begin()) {
    Serial.println("Found sensor");
  } else {
    Serial.println("No TCS34725 found ... check your connections");
    while (1);
  }

  // Set persistence filter to generate an interrupt for every RGB Cycle, regardless of the integration limits
  tcs.write8(TCS34725_PERS, TCS34725_PERS_NONE);
  tcs.setInterrupt(true);

  Serial.flush();
}


void loop() {
  //if (state) {
  uint16_t r, g, b, c, colorTemp, lux;
  getRawData_noDelay(&r, &g, &b, &c);
  r /= 256; g /= 256; b /= 256;
  //    colorTemp = tcs.calculateColorTemperature(r, g, b);
  //    lux = tcs.calculateLux(r, g, b);

  //    Serial.print("Color Temp: "); Serial.print(colorTemp, DEC); Serial.print(" K - ");
  //    Serial.print("Lux: "); Serial.print(lux, DEC); Serial.print(" - ");
  Serial.print("R: "); Serial.print(r, DEC); Serial.print(" ");
  Serial.print("G: "); Serial.print(g, DEC); Serial.print(" ");
  Serial.print("B: "); Serial.print(b, DEC); Serial.print(" ");
  //    Serial.print("C: "); Serial.print(c, DEC); Serial.print(" ");
  Serial.println(" ");
  Serial.flush();

  //tcs.clearInterrupt();
  //state = false;
  //}
}

postmaster-ino

Hi

Ein Datenblatt kann durchaus Klarheit verschaffen - Stichwort Klar: C ist der Messwert ohne Farbfilter.
Bei R,G,B hast Du jeweils einen Farbfilter vor den Photo-Dioden.

Woher hast Du die Farb-Temperatur und die Luxe?
Das ist ein Farb-Sensor, kein 'brenn einen Laser da durch'-Teil.
Der Sensor nimmt normal das vom zur Farbe bestimmenden Gegenstand reflektierten Licht auf.
Damit werden (normal) nicht die neuesten LED-Beamer auf Farb-Treue bewertet.

Im Normalfall hat man eine feste unveränderliche Lichtquelle, entweder weiße LEDs, oder man liest auch hier und da von R-G-B LEDs, damit nur die entsprechende Farbe zurück geworfen werden kann.
Mein Sensor (allerdings ein TCS3200) hat selber noch 4 weiße LEDs aufgesetzt und soll wohl auf 10mm Abstand 'eingenordet' sein - da ich noch mechanische Probleme habe, ist der Sensor noch nicht 'im Dienst'.

Allgemeine Vorgehensweise:
Referenz-Farben messen, in meinem Fall 10 rote Kügelchen (grün, gelb, mannich viele Farben ...)
Die Min/Max-Werte werden mitgehalten und in einem virtuellem HSV-Farbraum 'positioniert'.
So sollte sich pro Farbe eine Punkte-Wolke ergeben.
Wenn jetzt eine Unbekannte kommt, werden die Werte eingelesen und anhand des Abstand zu den Farbwolken (bzw. Deren Mitte) entschieden, welche Farbe man hier wohl gesehen hat.

Leider ist das bei mir auch noch nur Theorie, mein Sortier-Apparillo hat noch mechanische Probleme, die Kügelchen zu vereinzeln - und so kommen keine neuen Messwerte.

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

themanfrommoon

Quote
Woher hast Du die Farb-Temperatur und die Luxe?
Die rechnet die Lib aus.

themanfrommoon

Interessant wäre auch noch, ob man den Sensor schneller stellen kann.
Momentan kommt es mir vor, als ob nur ca. jede Sekunde ein Werteset ausgegeben wird.
Kann man den Sensor irgendwie umprogrammieren, dass z.B. 10 Wertesets pro Sekunde ausgegeben werden?

Irgendwie sowas steht auf Seite 10+11 im Datenblatt.
Leider versteh ich das nicht so richtig, noch könnte ich das umsetzen :-(

Lieben Gruß,
Chris

Serenifly

#6
Mar 31, 2019, 12:31 pm Last Edit: Mar 31, 2019, 01:58 pm by Serenifly
Die Messzeit wird hauptsächlich durch die Integrationszeit bestimmt. Die steht bei dir doch klar auf 700ms.
Power Management ist was ganz anderes und spielt hier keine Rolle

Von der Integrationszeit hängt auch die tatsächliche maximale Farbtiefe ab. Siehe Seite 16. Bei 154ms und 700ms hast du die maximale 16 Bit. Dann teilt du den Wert durch 256 und du hast 8 Bit (256 * 256 -1 = 65535). Bei niedrigeren Zeiten musst du entsprechend anders rechnen

themanfrommoon

Okay, und welchen Code muss man schreiben um die Integrationszeit zu verkleinern?

Serenifly

#8
Mar 31, 2019, 05:49 pm Last Edit: Mar 31, 2019, 05:50 pm by Serenifly
Quote
Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_700MS, TCS34725_GAIN_1X);
Kann auch zur Laufzeit verändert werden mit setIntegrationTime(...)

Und schau dir mal die Library an. Du musst doch nur in den Header schauen um zu sehen was die kann und was an Konstanten gibt:
https://github.com/adafruit/Adafruit_TCS34725/blob/master/Adafruit_TCS34725.h
Zeile 140ff

Go Up