Hallo, ich habe ein Heltec ESP32 Projekt am Start, bei dem ich aktuell festhänge.
An dem verwendeten Heltec ESP32 (V3) soll ein weiteres I2C Display angehangen werden. Klingt erst einmal simpel, stellt MICH jedoch vor Probleme. Meine Intention war, für das I2C Display die entsprechenden SDA und SCL GPIOs auf dem Board zu nutzen, die auch das onBoard Display mit Daten versorgen. Nun sind diese jedoch nicht rausgeführt. (Schematisches Diagramm) Vermutlich muss man über Wire SDA und SCL auf vorhandene GPIOS umlenken.
Mein Lösungsansatz wäre Verwendung Wire.h und definieren der "neuen GPIOs) #define I2C_SDA 42 #define I2C_SCL 45
I tried a sensor on the default I2C pins, 22 (SCL) & 21 (SDA), and it worked. However, after initializing the OLED display, communication with the sensor on pins 22 & 21 stopped working.
I discovered here that when the OLED is initialized, it tells the Arduino Wire library to start using pins 15 (SCL) and 4 (SDA) for I2C communications.
If I use pins 15, 4 for both the OLED I2C and the sensor I2C, everything works--as long as I initialize the sensor after the OLED display (or, alternatively, initialize the Wire library to use 15, 4 right from the get-go).
So basically, using the OLED library has the side-effect of re-assigning the global I2C pins for the esp32 for any Arduino libraries. The simplest solution is to just go with the flow and use the same pins as the OLED for all I2C communications (assuming your I2C sensor device addresses don't collide with the OLED's).
Das war bei der Heltec Wifi Kit (Version 2) auch recht einfach zu realisieren, da die OLED Anschlüsse SDA, SCL und RST herstellerseitig als GPIOs rausgezogen wurden. Dem ist bei der neuen Version 3 nun nicht mehr so, so dass hier die Anschlüsse "umgelenkt" werden müssen.
Der ESP32 hat eigentlich 2 I2C Bus. Du könntest also den nicht herausgeführten auf einem Bus und auf zwei anderen Pins, einen anderen I2C Bus verwenden.
Du musst halt eine Display Library verwenden, die nicht hardcoded auf den ersten I2C Bus geht sondern der du ein anderes "TwoWire" Interface übergeben kannst.
Falls Du am Display die I2C Adresse ändern kannst, kannst Du das zweite Display auch am bereits benutzten Bus anschließen. Der Bus kann mehrere Geräte ansteuern, diese müssen nur verschiedene Adressen haben. Eventuell sind die Pullupwiderstände anzugleichen