I2C Problem mit VL53L0X und TCS3472

OP #7498766
Lesenswert?

Hallo zusammen, vielleicht kann mir hier jemand einen Tipp geben. Und zwar möchte ich mit einem ESP und einigen Sensoren für meinen Lasergravierer ein Überwachungssystem bauen.

Für die Überwachung möchte ich 2 VL52L0X (Laserdistanzsensor) und einen TCS3472 Sensor (Lichtsensor) über die I2C Schnittstelle verwenden.

Aus dem Adafruit Beispiel habe ich mir das Beispiel für die 2 gleichzeitig verwendeten VL52L0X kopiert und für meine Zwecke angepasst. Nun möchte ich den TCS34725 noch einbinden, aber irgendwie wird der Sensor nicht erkannt. Ich hab irgendwie den Verdacht, dass es vielleicht ein Adresskonflikt gibt. Verschaltet habe ich es wie im angehängten Screenshot. Geht das so wie von mir ausgedacht? Besten Dank schon mal.

Gruss Benji

1
#include "Adafruit_VL53L0X.h"
2
#include "Adafruit_TCS34725.h"
3
#include <Wire.h>
4

5
// address we will assign if dual sensor is present
6
#define LOX1_ADDRESS 0x30
7
#define LOX2_ADDRESS 0x31
8

9
// set the pins to shutdown
10
#define SHT_LOX1 32
11
#define SHT_LOX2 33
12
#define commonAnode true //TCS Sensor
13
const int sensor1 = 34; // Flammensensor oben
14
const int sensor2 = 35; // Flammensensor unten
15
const int RELAYGreen = 12; // Relaispin für grüne LED
16
const int RELAYOrange = 14; // Relaispin für orange LED
17
const int RELAYRed = 27; // Relaispin für rote LED
18
const int RELAYBuzzer = 26; // Relaispin für Buzzer
19
const int RELAYPump = 25; // Relaispin für Pumpe
20
int output1 = 0;
21
int output2 = 0;
22
byte gammatable[256];//TCS Sensor
23

24
// objects for the vl53l0x
25
Adafruit_VL53L0X lox1 = Adafruit_VL53L0X();
26
Adafruit_VL53L0X lox2 = Adafruit_VL53L0X();
27
Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_4X);
28

29
// this holds the measurement
30
VL53L0X_RangingMeasurementData_t measure1;
31
VL53L0X_RangingMeasurementData_t measure2;
32

33

34
void setID() {
35
  // all reset
36
  digitalWrite(SHT_LOX1, LOW);    
37
  digitalWrite(SHT_LOX2, LOW);
38
  delay(10);
39
  // all unreset
40
  digitalWrite(SHT_LOX1, HIGH);
41
  digitalWrite(SHT_LOX2, HIGH);
42
  delay(10);
43

44
  // activating LOX1 and resetting LOX2
45
  digitalWrite(SHT_LOX1, HIGH);
46
  digitalWrite(SHT_LOX2, LOW);
47

48
  // initing LOX1
49
  if(!lox1.begin(LOX1_ADDRESS)) {
50
    Serial.println(F("Failed to boot first VL53L0X"));
51
    while(1);
52
  }
53
  delay(10);
54

55
  // activating LOX2
56
  digitalWrite(SHT_LOX2, HIGH);
57
  delay(10);
58

59
  //initing LOX2
60
  if(!lox2.begin(LOX2_ADDRESS)) {
61
    Serial.println(F("Failed to boot second VL53L0X"));
62
    while(1);
63
  }
64
}
65

66
void read_dual_sensors() {
67
  
68
  lox1.rangingTest(&measure1, false); // pass in 'true' to get debug data printout!
69
  lox2.rangingTest(&measure2, false); // pass in 'true' to get debug data printout!
70

71
  // print sensor one reading
72
  Serial.print(F("1: "));
73
  if(measure1.RangeStatus != 4) {     // if not out of range
74
    Serial.print(measure1.RangeMilliMeter);
75
  } else {
76
    Serial.print(F("Out of range"));
77
  }
78
  
79
  Serial.print(F(" "));
80

81
  // print sensor two reading
82
  Serial.print(F("2: "));
83
  if(measure2.RangeStatus != 4) {
84
    Serial.print(measure2.RangeMilliMeter);
85
  } else {
86
    Serial.print(F("Out of range"));
87
  }
88
  
89
  Serial.println();
90
}
91

92
void setup() {
93
  Serial.println(F("Starting..."));
94
  setID();
95
    if (tcs.begin()) {
96
    //Serial.println("Found sensor");
97
  } else {
98
    Serial.println("No TCS34725 found ... check your connections");
99
    while (1); // halt!
100
  }
101
  
102
  Serial.begin(9600);
103
  pinMode(sensor1,INPUT);  //
104
  pinMode(sensor2,INPUT);  //
105
  pinMode(RELAYRed,OUTPUT);
106

107
  // wait until serial port opens for native USB devices
108
  while (! Serial) { delay(1); }
109

110
  pinMode(SHT_LOX1, OUTPUT);
111
  pinMode(SHT_LOX2, OUTPUT);
112

113
  Serial.println(F("Shutdown pins inited..."));
114

115
  digitalWrite(SHT_LOX1, LOW);
116
  digitalWrite(SHT_LOX2, LOW);
117

118
  Serial.println(F("Both in reset mode...(pins are low)"));
119
  
120

121
  for (int i=0; i<256; i++) {
122
    float x = i;
123
    x /= 255;
124
    x = pow(x, 2.5);
125
    x *= 255;
126

127
    if (commonAnode) {
128
      gammatable[i] = 255 - x;
129
    } else {
130
      gammatable[i] = x;
131
    }
132
    //Serial.println(gammatable[i]);
133
  }
134
}
135

136
void loop() {
137
   
138
  read_dual_sensors();
139
  output1 = digitalRead(sensor1);
140
  output2 = digitalRead(sensor2); // Feuer?  
141
   if (output1==1 or output2==1) {          
142
    Serial.print("FIRE DETECTED!"); 
143
    Serial.print("Output1= ");
144
    Serial.print(output1); 
145
    Serial.print("; Output2= ");
146
    Serial.print(output2); 
147
    Serial.print(";");
148
    digitalWrite(RELAYRed,HIGH);}
149
    else {digitalWrite(RELAYRed,LOW);}
150
    
151
  delay(100);
152
 float red, green, blue;
153
  
154
  tcs.setInterrupt(false);  // turn on LED
155
  delay(60);  // takes 50ms to read
156
  tcs.getRGB(&red, &green, &blue);
157
  tcs.setInterrupt(true);  // turn off LED
158

159
  Serial.print("R:\t"); Serial.print(int(red)); 
160
  Serial.print("\tG:\t"); Serial.print(int(green)); 
161
  Serial.print("\tB:\t"); Serial.print(int(blue));
162

163
//  Serial.print("\t");
164
//  Serial.print((int)red, HEX); Serial.print((int)green, HEX); Serial.print((int)blue, HEX);
165
  Serial.print("\n");
166
}
Angehängte Dateien:
#7498778
Lesenswert?

Zeig bitte einen vernünftigen Schaltplan und halte dich an die Regel: "Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang"

Die Massen aller Baugruppen müssen verbunden werden. Vorher kannst du nicht erwarten, dass irgendetwas vernünftig funktioniert.

Die doppelten Zeilenvorschübe machen den Code nicht gerade lesbarer.

Wer soll sich denn durch den Kram durchfummeln?

Ein Link zu einem Datenblatt des VL52L0X könnte auch nichts schaden. Oder redest du von dem weit verbreiteten VL53L0X?

Wenn du Probleme mit den I2C-Adressen hast, spiel dir einen I2C-Adressscanner auf den µC und prüfe einzeln, ob und wo deine I2C-Slaves erkannt werden. Dann kannst du alle zusammen auf den Bus stecken und müsstest alle drei sehen.

Wie groß sind bei dir die Pull-Up Widerstände auf den beiden I2C-Leitungen? Hast du berücksichtigt, dass AMS und ST unter dem Begriff "I2C-Adresse" unterschiedliche Dinge verstehen?

Moderator (Firma: Titel) Persönliche Seite #7499006
Lesenswert?

Rainer W. schrieb:

Die doppelten Zeilenvorschübe machen den Code nicht gerade lesbarer.

Das ist ein Problem der Foren-SW: ab Zeile 100 wird die Zeilennummer umgebrochen, nicht der Quelltext. Deshalb: Quellcode als *.c oder *.ino Datei anhängen.

Benni V. schrieb:

Ich hab irgendwie den Verdacht, dass es vielleicht ein Adresskonflikt gibt.

Worauf gründet der Verdacht? Welche I2C Adressen habe die Bausteine? Was steht in deren Datenblatt?

Zur Inbetriebnahme serieller Busse gilt das, was ich im Beitrag "Re: MCP3021 ADC liefert nur Schrott" geschrieben habe:

  1. die Funktion der Hardware sicherstellen (per Oszilloskop), dann
  2. die Software schreiben (oder vom ChatBot schreiben lassen oder irgendwoher zusammenkopieren)

Verschaltet habe ich es wie im angehängten Screenshot.

Leider kann man an diesem Verdrahtungsplan auch bei gutem Willen nicht erkennen, welches Signal auf welcher Leitung ist. So hilft der dann auch nicht richtig weiter...

Mein Tipp: sieh dir gut lesbare Schaltpläne an und überleg, was du machen musst, dass deine genauso gut lesbar werden. Gehe davon aus, dass alle anderen nicht automatisch wissen, welches der bunten Kästchen da in deinem Plan welches Modul ist und wo du es gekauft hast. Du solltest dann also auch noch die zugehörigen Datenblätter verlinken.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren