Arduino Farbsensor TCS3200

Hallo,ich habe Folgendes Problem: Bei meinem Farbsensor, den ich an einen Arduino angeschlossen habe leuchten zwar die LEDs aber es werden keine Frequenzwerte ausgegeben bzw. es wird im Programm nur 0 angezeigt.

Angeschlossen habe ich den Farbsensor folgendermaßen:
GND = GND
OUT= Pin 8
S2= 7
S3= 6
VCC= 5V

andere Seite der Anschlüsse:
VCC, LED und GND ungenutzt
S1 = Pin 5
S0 = Pin 4

Elegoo Uno

Nach dem Video habe ich mich gerichtet:

Der Code ist ebenfalls der aus dem Video

Ich hoffe jemand kann mir weiterhelfen
Danke schonmal für die Antworten !

wie man einen Link erstellt: https://forum.arduino.cc/index.php/topic,148850.0.html

es fehlen weiters:
Link auf Datasheet des TCS3200
Code
Schaltplan
ECHT-Bild deiner Verkabelung

Hi

Einige Klicks später fand ich auch einen Sketch, Den ich auf meinen Nano pressen konnte.
Da der Sensor vier 'Farben' kennt (R,G,B, alle Sensoren), habe ich den Sketch etwas erweitert, weiter habe ich die Anschlüsse an meine Gegebenheiten angepasst.
Bei mir werden Sensorwerte ausgegeben.

/*     Arduino Color Sensing Tutorial
    by Dejan Nedelkovski, www.HowToMechatronics.com
*/
//Quelle: https://howtomechatronics.com/tutorials/arduino/arduino-color-sensing-tutorial-tcs230-tcs3200-color-sensor/
//vom Video https://www.youtube.com/watch?v=CPUXxuyd9xw

const byte S0 = 2;      //Pins an meine Gegebenheiten angepasst
const byte S1 = 3;
const byte S2 = 4;
const byte S3 = 6;
const byte sensorOut = 5;
//const byte Pin_oe = 7;    //Enable, Low-Aktive
//const boolean AN = LOW;

enum farbe : byte {ROT, BLAU, GRUEN, CLEAR, crlf};  //Durcharbeiten der Farben anhand dieser Namen
const uint32_t waittime = 10;

uint16_t frequency = 0;                             //Ich erwarte nur positive Ergebnisse unterhalb 65536

void setup() {
  pinMode(S0, OUTPUT);  //Pins einstellen
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);
  pinMode(S3, OUTPUT);
  //  pinMode(Pin_oe, OUTPUT);  //der OE Pin (LowAktiv) macht nicht ganz, was ich erwartet habe, daher auskommentiert
  pinMode(sensorOut, INPUT);

  // Setting frequency-scaling to 20% - siehe Datenblatt des Sensor
  digitalWrite(S0, HIGH);
  digitalWrite(S1, LOW);
  //  digitalWrite(Pin_oe, AN);
  Serial.begin(9600);
}

void loop() {
  //  digitalWrite(Pin_oe, millis() % 1000 < 500);  //sollte eigentlich die LEDs des Sensor laufend an/aus schalten
  static byte farbwahl = farbe::ROT;  //wir beginnen mit dem roten Sensor
  static uint32_t lastmillis = 0;     //letzte gemerkte Zeit
  static boolean doread = false;      //sollen wir einen Farbwert lesen?
  static byte temp = 0;               //Variable, um zwischen den Anzeigen mehr Leerzeit zu haben
  switch (farbwahl) {
    case ROT:
      if (millis() - lastmillis < waittime) break;  //ist die Wartezeit zwischen den Messungen bereits um?
      lastmillis = millis();  // bei Nein, wird per break; die switch-Abfrage verlassen, sonst 'neue Zeit merken'
      Serial.print("R=");     //Ausgabe Terminal
      // Setting red filtered photodiodes to be read
      digitalWrite(S2, LOW);  //Sensor auf diesen Filter einstellen
      digitalWrite(S3, LOW);
      farbwahl = GRUEN;       //nächsten Sensor einstellen
      doread = true;          //Lesen auslösen
      break;
    case GRUEN:
      if (millis() - lastmillis < waittime) break;    // ... das Gleiche 'in Grün' :) - also bei allen Filtern
      lastmillis = millis();
      Serial.print("G=");
      // Setting Green filtered photodiodes to be read
      digitalWrite(S2, HIGH);
      digitalWrite(S3, HIGH);
      farbwahl = BLAU;
      doread = true;
      break;
    case BLAU:
      if (millis() - lastmillis < waittime) break;
      lastmillis = millis();
      Serial.print("B=");
      // Setting Blue filtered photodiodes to be read
      digitalWrite(S2, LOW);
      digitalWrite(S3, HIGH);
      farbwahl = CLEAR;
      doread = true;
      break;
    case CLEAR:
      if (millis() - lastmillis < waittime) break;
      lastmillis = millis();
      Serial.print("C=");
      // Setting without filtered photodiodes to be read
      digitalWrite(S2, HIGH);
      digitalWrite(S3, LOW);
      farbwahl = crlf;          //Als Nächstes Zeilenumbruch (und Wartezeit)
      doread = true;
      break;
    case crlf:
      if (temp == 0) {          //erster Aufruf?
        temp = 100;             //JA, 100x Warten
        break;
      } else {
        if (millis() - lastmillis < waittime) break;    //in den 100x Warten: Wartezeit vorbei? Nein->break
      }
      lastmillis = millis();  //Sonst aktuelle Zeit merken
      temp--;                 //und Wert um 1 senken
      if (temp == 0) {        //sind wir auf 0
        Serial.println();     //Zeilenumbruch zum Terminal
        farbwahl = ROT;       //nächste Messung wieder Rot
      }
  }
  if (doread) {               //Sollen wir Farbwert auslesen?
    // Reading the output frequency
    frequency = pulseIn(sensorOut, LOW);  //Zeit des PWM-Signal messen
    // Printing the value on the serial monitor
    Serial.print(frequency);//printing RED color frequency
    Serial.print("  ");
    doread = false;   //und 'merken', daß wir Nichts auslesen - bis zum nächsten Sensor
  }
}

Beim 'in die Luft starren' zeigt Er Folgendes:

23:47:34.501 -> R=181  G=216  B=195  C=62  
23:47:35.533 -> R=169  G=209  B=191  C=60  
23:47:36.611 -> R=178  G=215  B=193  C=61  
23:47:37.642 -> R=175  G=213  B=195  C=62  
23:47:38.673 -> R=171  G=209  B=190  C=60  
23:47:39.705 -> R=183  G=216  B=196  C=61  
23:47:40.783 -> R=173  G=213  B=192  C=60  
23:47:41.814 -> R=177  G=213  B=193  C=61  
23:47:42.845 -> R=174  G=213  B=192  C=61

MfG

Edit
... etwas am Sketch gespielt - man könnte jetzt noch andere Dinge in loop() erledigen.
... Kommentare - was man selber sehen will, sollte man Anderen auch zu Lesen geben ...

Hi, danke erstmal für ihre Antwort !

Hier mein Code:

const byte S0 = 4;
const byte S1= 5;
const byte S2= 6;
const byte S3= 7;
const byte sensorOut = 8;

int frequency = 0;
void setup() {
  pinMode(S0, OUTPUT);
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);
  pinMode(S3, OUTPUT);
  pinMode(sensorOut, INPUT);

  digitalWrite(S0,HIGH);
  digitalWrite(S1,LOW);
 
  Serial.begin(9600);
  
}

void loop() {
 // Setting red filtered photodiodes to be read
  digitalWrite(S2,LOW);
  digitalWrite(S3,LOW);
  // Reading the output frequency
  frequency = pulseIn(sensorOut, LOW);
  // Printing the value on the serial monitor
  Serial.print("R= ");//printing name
  Serial.print(frequency);//printing RED color frequency
  Serial.print("  ");
  delay(100);
  // Setting Green filtered photodiodes to be read
  digitalWrite(S2,HIGH);
  digitalWrite(S3,HIGH);
  // Reading the output frequency
  frequency = pulseIn(sensorOut, LOW);
  // Printing the value on the serial monitor
  Serial.print("G= ");//printing name
  Serial.print(frequency);//printing RED color frequency
  Serial.print("  ");
  delay(100);
  // Setting Blue filtered photodiodes to be read
  digitalWrite(S2,LOW);
  digitalWrite(S3,HIGH);
  // Reading the output frequency
  frequency = pulseIn(sensorOut, LOW);
  // Printing the value on the serial monitor
  Serial.print("B= ");//printing name
  Serial.print(frequency);//printing RED color frequency
  Serial.println("  ");
  delay(100);
}

Hier meine Ausgabe :

R= 0  G= 0  B= 0  
R= 0  G= 0  B= 0  
R= 0  G= 0  B= 0  
R= 0  G= 0  B= 0  
R= 0  G= 0  B= 0  
R= 0  G= 0  B= 0  
R= 0  G= 0  B= 0  
R= 0  G= 0  B= 0  
R= 0  G= 0

Angeschlossen habe ich den Farbsensor folgendermaßen:

Einziger Unterschied ist, dass S2 auf 6 und S3 auf 7 angeschlossen sind.
Die Anschlüsse VCC, LED und GND sind nicht angeschlossen.
DataSheet habe ich auch nur zu dem TCS3200 gefunden der anstatt die Anschlüsse LED OE hat.

Habe schon mehrere Stunden versucht das Teil zum Laufen zu bringen aber es funktioniert nicht. Kann es sein, dass der Sensor kaputt ist, obwohl die LEDs leuchten?

Hi

Das ist ein aktiver SENSOR - Der braucht Strom - zumindest Vcc und GND solltest Du Ihm schon gönnen.
Was meinst Du mit 'LED ist nicht angeschlossen'?
Wenn LED==OE ist, dann frei lassen - der Pin ist LOW-AKTIV und kann unbeschaltet bleiben.

Vcc und GND musst Du aber an 5V/GND anschließen - dabei sollten auch die LEDs angehen (da OE/LED nicht auf HIGH liegt).

Ohne Futter kann das beste Pferd nicht furzen - die soll Das ein kleiner Sensor hinbekommen?

MfG

Erstaml danke für deine Antwort!
Ich habe den Sensor ja an GND und VCC angeschlossen. Der Sensor hat aber auf beiden Seiten VCC und GND Anschlüsse. Die VCC und GND Anschlüsse habe ich wie in dem Schaltplan, den ich oben reingeschickt habe, nur auf einer Seite angeschlossen. Auf der anderen Seite sind die VCC und GND, sowie LED nicht angeschlossen. Den OE Anschluss gibt es bei mir nicht. Und alle LEDs leuchten aber der Serielle Monitor gibt leider nur 0 als Wert aus.
Ich würde ja gerne ein Bild von meiner Verkabelung schicken aber die Datei darf höchstens 2MB groß sein :frowning:

Soll ich die beiden anderen VCC und GND-Anschlüsse auch mal anschließen oder ist das nicht nötig ?

Hi

Denke, die Vcc und GND-Anschlüsse sind auf der Sensor-Platine bereits verbunden (ein Sinn, warum Die doppelt vorhanden sind, sehe ich aber nicht).
Versuchen kannst Du Das, kann mir aber kaum vorstellen, daß Das das Problem behebt - Versuch macht kluch!

Ich befürchte, so kommen wir aber nicht wirklich weiter.
Woher hast Du diesen Sensor?
Nur, weil der Fiat 500 ähnliches macht, wie der Lamborghini vom Nachbarn, ist die Bedienung nicht überall gleich - denke, Dein Sensor tickt 'irgendwie anders'.
Von dem Fritzing-Bildchen weiter oben sollte Das eigentlich halbwegs laufen.

MfG

Patroklus:
Ich würde ja gerne ein Bild von meiner Verkabelung schicken aber die Datei darf höchstens 2MB groß sein :frowning:

Bildbearbeitungsprogramme wurden schon vor geraumer Zeit erfunden. Die Göße ändern können oft auch gute Betrachter (z.B. Irfanview).

Gruß Tommy

Hi, gekauft habe ich den Sensor im Funduinoshop.
Die Bilder von der Verkabelung habe ich jetzt hochgeladen.
Habe auch mal VCC und GND an die anderen beiden Anschlüsse umgesteckt aber das Problem bleibt vorhanden. An dem Code erkenne ich auch keinerlei Fehler

Hi

Blöd - auf Fundino.de finde ich
Anleitungen für Zubehör, Nr.07 – Farbsensor den TCS3200.
Ggf. meldest Du Dich bei Fundino und fragst, was Du Da feines bekommen hast.

MfG

Ja ich habe auch schon bei Funduino nachgefragt, was das Problem sein könnte. Die Antwort war Folgende:
0 am analogen Port deutet auf ein einlesen von GND hin oder Nutzung eines falschen (nicht definierten) Ports

Komisch ist auch, dass auf dem Bild ein anderer Farbsensor vorliegt, als ich bekommen habe. Es ist zwar auch ein TCS3200 aber die GY-31 Variante.

Die Antwort von Funduino hat aber auch überhaupt nichts mit dem Modul und dessen Abfrage zu tun.
Die sollten lesen lernen.

Gruß Tommy

Ja der Sensor wurde für ein Schulprojekt von meiner Schule bestellt und natürlich funktioniert mein Sensor wieder nicht. Naja habe jetzt nochmal den Support angeschrieben mit dem Code und meinem Schaltplan...mal sehen ob sich da was ergibt.

Aber wenn jemand noch eine Idee hat, kann er sie gerne reinschreiben.