Probleme mit Farbsensor-Modul GY-33 (TCS34725)

Hallo Arduino-Gemeinde,
Ich habe Probleme mit folgendem FarbSensor: GY-33
Ich habe ihn nach Anleitung für eine I2C-Verbindung angeschlossen:
GY-33 => Arduino

VCC => 5V
GND => GND
CT => A5(SCL)
DR => A4(SDA)
S1S0 => GND (für I2C-Mode)

Um den dort abgedruckten Sketch zum Laufen zu bringen, benötige ich eine „i2c.master.h“ -Library. Kurzes Googlen brachte gefühlt 100 Variationen von i2cmaster.h zum Vorschein. Da ich mich mit den Strukturen auf Aufbau von Bibliotheken nicht so gut auskenne, habe ich mal die erstbeste (dazu schon die erste Frage: gibt es eine „populäre“ i2cmaster.h oder tun die im Grund alle das Gleiche?) heruntergeladen. Und siehe da, es tut sich etwas.

Irgendwie erscheinen mir aber die gelesenen Farbwerte noch nicht richtig bzw unbrauchbar, um damit weiterarbeiten zu können. Z.b. habe ich mit den gelesenen RGB-Werten direkt eine RGB-LED „gefüttert“, sah aber nie so aus wie das, was ich vor den Sensor gehalten habe. Also sollte ich den Sensor wohl an verschiedenen Muster-Farben kalibrieren und die Ausgabe-Werte dementsprechend anpassen, damit sie eindeutiger werden. Dafür fand ich den Beispiel-Sketch aber (für mich) als zu kompliziert und habe mich nach weiteren Anleitungen und Tutorials umgeschaut.

Vielleicht geht das Ganze ja noch komfortabler? Ich habe es mit einer Library von Adafruit sowie einer Dokumentation zum TCS34725 von Waveshare probiert (diese Module sind zwar in der Bauweise anders als der von mir benutzte, verfügen aber beide über den genannten Sensor), scheitere aber nun daran, daß das Modul von beiden Beispiel-Sketchen nicht erkannt wird.

Irgendwas ist an der ersten (funktionierenden) I2C-Verbindung anders als bei denen von Adafruit oder Waveshare. Aber ich komme nicht dahinter, was.

Ist es eventuell eine andere I2C-Adresse als erwartet? Normalerweise ist diese ja mit 0x29 angegeben (feste I2C-Adresse im TCS34725)… ein I2C-scan allerdings ergab „I2C device found at address 0x5A !“ und im ersten funktionierenden Sketch finde ich auch nichts von 0x29.

Wie ändere ich also nun die Adafruit_TCS34725.h mit den Adresswerten aus dem funktionierenden Test-Sketch ab?

Ihr merkt schon, i2c ist nicht so mein Thema, wenn es nicht funktioniert wie in Tutorials erklärt.. :slight_smile:

Checke doch einfach erst mal die Adresse mit einem I2C-Scanner, z.B. diesen.

Gruß Tommy

spuckt (wie oben erwähnt) immer nur 0x5A aus.

Habe diesen Wert auch mal in der Adafruit-*.h gegen die vorgegebene 0x29 ausgetauscht... ohne Erfolg.

Waveshare hat bezüglich Adresse auch noch folgenden Hinweis: "Note: 0x29 is 7bit in fact, therefore, when you set the i2c-address, you should left-shift one bit, turn it to 0x52" .. ist das als Info nützlich?

(deleted)

Peter-CAD-HST:
probiere mal 0x2d aus

“No TCS34725 found … check your connections” … worauf begründet sich die vorgeschlagene Adresse? :wink:

Hier nochmal der funktionierende Sketch ohne Link:

#include <i2cmaster.h>

#define uint16_t unsigned int
typedef struct
{
    uint16_t Red;
    uint16_t Green;
    uint16_t Blue;
    uint16_t Clear;
} RGB;
unsigned char Re_buf;
unsigned char sign=0;
RGB rgb;
uint16_t CT=0,Lux=0;
byte color=0,rgb_data[3]={0};

void setup() {
       Serial.begin(115200);
       i2c_init();
        delay(1); 
}
void loop() {
  unsigned char data[9]={0};
 if(!sign)
 {
   iic_read(0x00,data,8);
   rgb.Red=(data[0]<<8)|data[1];
   rgb.Green=(data[2]<<8)|data[3];
   rgb.Blue=(data[4]<<8)|data[5];
   rgb.Clear=(data[6]<<8)|data[7];
    Serial.print("Red: ");
   Serial.print(rgb.Red);
   Serial.print(",Green: ");
   Serial.print( rgb.Green);
    Serial.print(",Blue");
    Serial.print( rgb.Blue);
     Serial.print(",Clear");
    Serial.println(rgb.Clear);
    iic_read(0x08,data,4);
     Lux=(data[0]<<8)|data[1];
     CT=(data[2]<<8)|data[3];
   
    Serial.print("CT:");
    Serial.print(CT);
    Serial.print(",Lux:");
    Serial.println( Lux);
     iic_read(0x0c,data,3);
    rgb_data[0]=data[0];
    rgb_data[1]=data[1];
    rgb_data[2]=data[2];
    Serial.print("r:");
    Serial.print( rgb_data[0]);
    Serial.print(",g:"); 
    Serial.print( rgb_data[1]);
    Serial.print(",b:"); 
    Serial.println( rgb_data[2]);
     iic_read(0x0f,data,1); 
     color=data[0];
     Serial.print(",color:"); 
    Serial.println( color,HEX);
 }
 if(sign==1)
 {
   iic_read(0x10,&data[8],1);
   i2c_start_wait(0xb4);
    i2c_write(0x10);
    i2c_write(0x31);
   // i2c_write((data[8]|0x01));
    i2c_stop();
    sign=3;
 }
   delay(200); 
}
void iic_read(unsigned char add,unsigned char *data,unsigned char len)
{
  i2c_start_wait(0xb4);
   i2c_write(add);
   i2c_start_wait(0xb5);
   while(len-1)
   {
    *data++=i2c_readAck();
    len--;
    }
    *data=i2c_readNak();
    i2c_stop();
}
void serialEvent() {
  while (Serial.available()) {   
    Re_buf=(unsigned char)Serial.read();
   if (Re_buf=='a')
       sign=0;
    if (Re_buf=='b')    
       sign=1; 
      Re_buf=0; 
  }
}

derGeppi:
S1 => GND (für I2C-Mode)

Das sollte aber nach der von Dir verlinkten Doku S0 sein.

Hast Du noch was anderes am I2C-Bus?

Gruß Tommy

Tommy56:
Das sollte aber nach der von Dir verlinkten Doku S0 sein.

Da hast du Recht! Hab es richtig angeschlossen und falsch geschrieben... ist korrigiert!
Nope.. nichts anderes am Bus angeschlossen oder gefunden..

Gut - wenn der Scanner 0x5A meldet, sollte es mit der 2D gehen.
Ich würde statt i2cmaster aber Wire verwenden - wie es auch in den Adafruit-Beispielen gemacht wird.

Begründung für die lustige Adressverwirrung hast Du schon bei Waveshare gefunden:

Note: 0x29 is 7bit in fact, therefore, when you set the i2c-address, you should left-shift one bit, turn it to 0x52"

Die Adresse - wenn sie denn über die I2C-Leitung getickert wird - besteht aus 8 Bit. Davon identifizieren die oberen 7 das Gerät, das angesprochen werden soll und das unterste Bit gibt an, ob es sich um eine Lese- oder Schreiboperation handelt. Damit hast Du aber nix zu tun, das macht die I2C-Library für Dich.
Deshalb ist es Geschmackssache, ob ein Bibliotheksautor lieber das 8-Bit-Format (0x5A) oder nur die 7 Bit (0x5A geteilt durch 2 = 0x2D) sehen will.

Wire wünscht sich bei beginTransmission() die 7 Bit Adresse.

In der Adafruit-Library änderst Du nur eine einzige Zeile (44) in Adafruit_TCS34725.h:

#define TCS34725_ADDRESS (0x29)     /**< I2C address **/

wird ersetzt durch

#define TCS34725_ADDRESS (0x2D)     /**< I2C address **/

Klappt leider auch mit diesem Wert nicht.. :frowning:

Aber ich finde auch nichts in dem funktionierenden Sketch (s.o.), was irgendwie auf die "richtige" Adresse schließen lässt?

Irgendwie glaube ich, das Modul ist nur von der Beschreibung her baugleich mit dem von Adafruit. Habe bei der Suche nach mehr Details noch ein Datenblatt zum TCS3472 gefunden und festgestellt, daß es dort noch mehr Sensoren dieser Familie gibt(34721, ..23, 25 & ..27). Evtl. sind für jemanden die Infos dort nützlich, um diese Nuss zu knacken?

Meine Suche nach weiteren Informationen führte mich nun bis nach Thailand , wo ich eine weitere Anschluss-Möglichkeit vorgeschlagen bekommen habe, die sogar mit der Adafruit-Bibliothek arbeitet.
Hier wird das Modul an die auch so beschrifteten SDA-/SCL-Pins angeschlossen anstatt an die im ersten Beispiel vorgeschlagenen. Erfolglos...
Auch ein I2C-Scan mit diesem Anschluss brachte kein Ergebnis.. (Scan-Vorgang "eingefroren")

Jetzt geb ich es auf mit diesem Modul!

Alles in meiner Macht stehende probiert:

  • Anschluss an SDA/SCL des Sensors mit und ohne Level-Converter (anscheinend funktioniert der Sensor selbst laut Datenblatt mit 3V-Logic)
  • Jumper S0 und S1 in allen möglichen Kombinationen probiert

Der einzige, der es schafft mit dem Sensor zu kommunizieren ist der auf dem Board verbaute Microcontroller, den es auf anderen TCS34725-Breakouts nicht gibt, allerdings mit diesem zu arbeiten ist für mich mangels verfügbarer Dokumentation zu undurchsichtig.
Allein mit einer Adressänderung in der Adafruit-Bibliothek scheint es daher nicht so ohne weiteres zu klappen. Schade..

Werde nun auf ein anderes Modul ausweichen, was bestimmt frustfreier funktioniert.

Sollte ich (oder irgendjemand) irgendwelche Fortschritte mit dem GY-33 machen, werde ich hier nochmal ein Update posten.