u8g2 Display auf anderen I2C Kanal legen

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo,

    bezüglich meines Projektes RE: Sensoreinheit für Lux und UV-Index mit ESP8266 mit dem Problem, dass ich 2 I2C Kanäle benötige, stelle ich gerade auf den ESP32 um.

    Ein Problem dabei, wo ich nun eure Hilfe benötige ist, wie konfiguriere ich das Display auf den Kanal 2 um?

    Den VEML 7700 konnte ich so umkonfigurieren:

    if (!veml.begin(&I2Ctwo)) { durch das hinzüfügen von &I2Ctwo.

    Verwendet wird ein SSD1306 Weiss 128x64 0,96 Zoll OLED. Funktionierte zuvor auch schon bevor die 2 I2C Kanäle ins Spiel kamen.

    Kompletter Code (der mal noch strukturiert werden muss, aber bei C ist aktuell alles ein Erfolg ;) )

  • CEin Problem dabei, wo ich nun eure Hilfe benötige ist, wie konfiguriere ich das Display auf den Kanal 2 um?

    Muss ich wirklich aus Wie frage ich nach Hilfe? zitieren? :lol:

    Zitat

    Was hast du bisher unternommen, um das Problem zu lösen?

    Im Ernst, die Lösung ist eine Google-Suche entfernt. Suche nach "u8g2lib i2c address", erstes Ergebnis https://github.com/olikraus/u8g2/issues/434, verlinkt zu https://github.com/olikraus/u8g2/…e#seti2caddress.

    Zitat
    Code
    void U8G2::setI2CAddress(uint8_t adr)
    • Description: By default, U8g2 assumes the lowest possible I2C address of the display. This procedure will assign the I2C address to u8g2, if the display is configured to a different address. Call this procedure before begin().
    • Arguments:
      • adr: I2C address multiplied with 2 (the lowest bit must be zero)
    • Returns: -
    • See also: begin
    • Note: This procedure is available with U8g2 v2.6.x

    aber bei C ist aktuell alles ein Erfolg

    Das ist übrigens C++ - was schon lange nicht mehr "C mit Klassen" ist.

  • U8G2_SSD1306_128X64_NONAME_1_2ND_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

    Das Display bleibt leider schwarz.

    Wird aber im Scan erkannt. (Das 3C ist es)


    EDIT:

    Dann willst Du statt i2c1 z.B. i2c3 verwenden ?


    i2c3 und höher funktionieren aber nur am Pi4.

    Hardware ist ein ESP32.

    Die 2 Kanäle sind notwendig, da 2 Sensoren die selbe Busadresse besitzen

  • Der Konstruktor benutzt eine hart kodierte Wire1 Instanz des I2C Objektes. Ggf musst/solltest du deinen Code darauf umstellen, Wire0 und Wire1 zu benutzen, statt deine eigenen Objekte.

  • Kein Problem RTFM

    Kann ich gerne machen @__deets__ das ist im Code nur deswegen so, weil ich diese Anleitung fand zum verwenden beider I2C Kanäle:

    https://www.az-delivery.de/blogs/azdelive…ellen-verwenden

    Wie muss das dann aussehen das Wire0 Wire1 zum Einsatz kommt

  • Na du musst vor allem einfach das nicht selbst anlegen. Sondern eben Wire1 und Wire2 benutzen. Das sollten Im Arduino-Layer vordefinierte Variablen sein.

  • Wire und Wire1 meinst du oder?

    Er findet es nach Abänderung in der Tat, wobei mir nicht klar ist wie, wenn ich ihm die Pins nicht nenne. :conf:Wird schon höhere Magie dahinter stecken.

    Ausgabe:

    Jedoch keine Anzeige im Display


    EDIT:

    Zugegeben, habe ich jetzt ein bischen die Geduld damit verloren und tauschte einfach das Display auf Kanal 1 um und es funktioniert :thumbup:Immerhin funktionieren die 2 Sensoren mit der identischen Busadresse. Ob das Display auf Kanal 1 oder 2 läuft kann mir solange egal sein, bis es dort auch mal Überschneidungen gibt.

    Die Lösung wär dennoch interessant.

  • Ich müsste da jetzt selber spielen. Die Alternative ist dann auch noch ein eigener HAL für das Display. Für SPI Variante, die ich nutze, habe ich das. Damit definiert die u8g2 einfach nur bestimmte Operationen, die sie durchführen will, und man selbst setzt die über den Bus ab. Das klappt für mich mit PI & ESP. Das repo das ich dir gestern geschickt habe, sollte da auch was haben. Ist wie gesagt SPI, macht aber das Prinzip klar.

    Bezüglich der Magie: wahrscheinlich kannst du auf Wire1 ein init aufrufen.

  • Hallo

    Möglicherweise hilft Dir dieser Auszug weiter.

    Für zwei SPI Displays und ein I2C Display an einem Wemos D1 Mini Lite

    Der VU-Meter-4 Sketch benutzt zwei SPI OLED Displays für den Linken und Rechten Stereo Kanal, auf dem dritten I2C Display

    wird ein Menü zur Signal Quellen Auswahl angezeigt.

    Zusätzlich wird auf dem dritten Display das RTC/NTP Datum, Uhrzeit und die Temperatur eines BMP180 angezeigt.

    Mit einem ESP32 können auch zwei I2C Displays mit diesem Prinzip angesteuert werden. Ein ESP8266 bzw. Wemos D1 Mini besitzt nur einen I2C Port.

    Code
    // Der erste I2C Kanal mit Pin 22 SCL und Pin 21 SDA das ist OK
    U8G2_SSD1306_128X64_NONAME_F_SW_I2C display1(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE);
    // Der zweite I2C Kanal mit Pin 16 SCL und Pin 17 SDA das ist OK
    U8G2_SSD1306_128X64_NONAME_F_HW_I2C display2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ 16, /* data=*/ 17);          
    // Damit keine Display Anzeige möglich.
    // U8G2_SSD1306_128X64_NONAME_F_HW_I2C display1(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ 22, /* data=*/ 21); 
  • U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ SCL2, /* data=*/ SDA2);

    Das zielt dann aber auf den Kanal 1 vom I2C Bus ab, und bei Kanal 2 lassen sich clock und data nicht mit übergeben:

    U8G2_SSD1306_128X64_NONAME_1_2ND_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); Das hier ist der notwendige Konstruktor für Kanal 2 und da geht dann das Display wieder nicht

  • Das zielt dann aber auf den Kanal 1 vom I2C Bus ab, und bei Kanal 2 lassen sich clock und data nicht mit übergeben:

    U8G2_SSD1306_128X64_NONAME_1_2ND_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); Das hier ist der notwendige Konstruktor für Kanal 2 und da geht dann das Display wieder nicht

    Keine Ahnung ob Absicht oder Versehen mit den unterschiedlichen Parametern, aber du könntest versuchen dir deinen eigenen Konstruktor zu basteln.

    Quellcode für die beiden genannten:

    Du bräuchtest dann ungefähr:

    C++
    class DenkDirEinenGutenNamenAusU8G2 : public U8G2 {
      public: U8G2_SSD1306_128X64_NONAME_1_2ND_HW_I2C(const u8g2_cb_t *rotation, uint8_t reset = U8X8_PIN_NONE, uint8_t clock = U8X8_PIN_NONE, uint8_t data = U8X8_PIN_NONE) : U8G2() {
        u8g2_Setup_ssd1306_i2c_128x64_noname_1(&u8g2, rotation, u8x8_byte_arduino_2nd_hw_i2c, u8x8_gpio_and_delay_arduino);
        u8x8_SetPin_HW_I2C(getU8x8(), reset, clock, data);
      }
    };

    Auf das u8x8_byte_arduino_2nd_hw_i2c wird es ankommen. Einen Versuch ist es wert.

  • Moin!

    Es ist zwar ein ESP8266, aber hier geht es.

    Display und BME280.

    Allesdings auf einem I2C-Port.

    Ich hole mir die Daten vom Sensor, verarbeite sie und schicke sie an ein 2zeiliges Display.

    Die Adressen der beiden Geräte sind in den Headerdateien gesetzt.

    Nachfolgend ein Auszug. Er beschreibt die Initialisierung.

    73 de Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!