Hallo zusammen,
vom Prinzip her ein einfaches Ding, aber mir fehlen die Details. Die meisten Beispiele mit I2C-Kommunikation betreffen einen einzigen Slave, das habe ich auch schon häufiger ohne Probleme benutzt. Bei zwei Slaves müssen sie eine unterschiedliche Adresse haben, das ist mir auch klar. Nun habe ich einen Sensor und ein Oled-Display mit unterschiedlichen Adressen. Wie verknüpfe ich Adresse und Gerät? Muss ich dann 2x Wire.begin(Adresse) definieren, gefolgt von einem Wire.end()? Und dann jedesmal, wenn etwas über den Bus geschickt werden soll, das erneut aufrufen? Oder kann ich in der Präambel bei der Definition des Geräts schon dessen Adresse beifügen, so etwa:
VL53L0X sensor(0x29);
Adafruit_SSD1306 display(0x3C); // plus natürlich Screen width etc.
Dann wäre die Zuordnung da. Beim naiven Ausprobieren hat das natürlich nicht geklappt. Müssen noch Parameter dazu gegeben werden oder ist die ganze Idee schon Quatsch?
Eigentlich musst du nur die Beispiele der Libraries in einem Sketch zusammen setzen.
Du musst darauf auchten, dass kein Variablename doppelt erscheint.
Anhand der Adresse findet der Sketch auch seine Teile.
Wenn Du Programmbibliotheken nutzt, dann teilst Du der Bibliothek mit, unter welcher I²C-Adresse die Hardware zu finden ist. Manche Bibliotheken nutzen auch Standardeinstellungen. Wie das geht, findest Du in den Bibliotheksbeispielen.
Die Programmbibliotheken stören sich nicht gegenseitig.
Aha. Danke. Ich hatte die Adafruit-Beispiele nicht untersucht, da ich die Polulu-Bibliothek installiert hatte. Das Adafruit-Beispiel vl53l0x_oled tut schon genau das, was es soll, aber ganz verstehe ich das noch nicht. Die Zeile
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
leuchtet mir ein, hier wird die Adresse des Displays übergeben. Aber wo erfährt der Sketch von der Adresse des Sensors? Oder braucht's das nicht, weil das das einzige noch "übergebliebene" I2C-Device ist und von daher keine Verwechslung mehr möglich ist?
Nirgendwo her.
Das ist die einzige Stelle wo die Adresse, für dich, von Bedeutung ist.
Denn die Instanz der Klasse merkt sich die Adresse.
Würdest du auch selber sehen, wenn du die Methode begin() mal untersuchst.
Ich vermute, hier verstehst Du die Frage falsch, denn Display ist SSD1306 und Sensor ist VL53L0X. Bei der Adafruit-Bibliothek gibt man die Adresse an, bei der von Pololu nicht, außer man benutzt die Methode void setAddress(uint8_t new_addr);, was bei nur einem Sensor aber nicht notwendig ist.
Mag sein....
Display Adresse zeigen und nach Sensor fragen...
Verwirrt mich schon mal.
Klar gibts viele Libs, wo die (default) Adresse im Code verankert ist.
Aber auch das würde man spätestens in der Lib selber sehen.
Mein Rat: Ruhig mal rein schauen, beißt nicht.
// The Arduino two-wire interface uses a 7-bit number for the address,
// and sets the last bit correctly based on reads and writes
#define ADDRESS_DEFAULT 0b0101001
Die Adresse läßt sich ändern, was hier aber nicht benötigt wird.
OK, danke für die Klarstellung. Dass die Adressen in der Library
verankert sind, erklärt die ganze Sache, leuchtet ein. Mittlerweile
hat der Sensor den Löffel abgegeben, nachdem er 6 Stunden
ununterbrochen eingeschaltet war. Es war der Beispielsketch
vl53l0x_oled (Adafruit) in einen Nano-Klon hochgeladen worden.
Gruß,
-richard