Esp32 zwei i2c Schnittstellen nutzen

Hallo Leute,

ich habe derzeit ein Problem mit dem esp32.

ich bekomme es nicht hin, dass er über die i2c zwei verschiedene zahlen versendet.

#include <Wire.h>

#define SDA_1 21
#define SCL_1 22
#define SDA_2 17
#define SCL_2 16
#define I2C_FREQ 400000

TwoWire I2C_1 = TwoWire(0); 
TwoWire I2C_2 = TwoWire(1);

void setup() {
Serial.begin(115200);

  I2C_1.begin(SDA_1, SCL_1, I2C_FREQ);
I2C_2.begin(SDA_2, SCL_2, I2C_FREQ);
}

void loop() {
   Serial.println("2", '2');    //dachte mir, so spreche ich die channel an aber das geht nicht       
   Serial.println("1", '1');

}

Ich danke euch

Ihr Beitrag wurde an seinen aktuellen Speicherort verschoben, da er besser geeignet ist.

Wenn du von I2C nichts verstehst,
warum fängst du an dieser Stelle an,
etwas damit zu machen?

Meinst du nicht, zunächst

  • mit Geräten kommunizieren
  • als Gerät fungieren

zu beherrschen wäre ein besserer Anfang?

Nun ja, Du willst zwar etwas über die I2C-Schnittstellen senden, sendest es aber über die Serielle (UART) Schnittstelle. Wenn du ein Paket per UPS versendest, kannst du lange warten, bis beim empfänger ein DHL-Kurier das Paket liefert.

Hier findest Du eine Anleitung: Zwei I2C-Schnittstellen des ESP32 benutzen

Wohin?

Danke Ihnen

Weil ich es lernen will?

Danke für den Link.

An einen anderen esp32.

Werde es nun über Serial.println und Serial1.println machen und somit diese zwei verschiedenen Daten an den nächsten esp32 weiter senden

Dies wird Dich aber kaum was über den Umgang mit I2C lehren.

Auf dem denkbar unglücklichsten Weg?

Hast du Schwimmen auch bei der Kanalüberquerung gelernt?
Fahrradfahren auf der Tour de France?

Also entschuldige, dass ich auf meine Art und weise lerne und dies dann in einem Forum nachfrage, wenn ich auf meine Art nicht weiter komme.

Also ich habe nur etwas nachgefragt und würde gerne etwas lernen. Hab das Gefühl von dir kritisiert zu werden. Aber wie ich lerne ist doch meine Sache oder?

Vielleicht kommt es mir nur so vor, aber ich habe das Gefühl, angegriffen zu sein von dir.

Dane für deine Zeit und mühe.

Habe mir nun noch mehr darüber durchgelesen und es nun geschafft, zwei daten zu versenden aber der empfänger spuckt die ganze zeit alles aus, muss nun lernen wie er nur ausspuckt, wenn er etwas zu gesendet bekommt. Aber ich denke das geht mit available und while

Wenn du das alleine machst, kein Problem.

Wenn du es nicht magst, auf Holzwege hingewiesen zu werden, auch ok.

Viel Erfolg mit deiner neuartigen Lernmethode.

Natürlich!
Kritik, ist eins der Dinge, weswegen das Forum überhaupt existiert.
Wie soll man jemanden auf den "rechten Weg" bringen, ohne Kritik?
Das ist fast unvorstellbar.

Leider unterscheidet du offensichtlich nicht zwischen Kritik an der Person und Kritik an der Sache. Solange du jegliche(?) Kritik als persönlichen Angriff auffasst, wirst du es hier wirklich schwer haben.

Natürlich darfst du tun, was du möchtest.
Du darfst auch um Rat fragen.

Ich selber bin immer wieder verwundert, wie selbstbewusst Einsteiger bestimmen wollen, auf welche Art sie lernen wollen, was sie lernen wollen. Vereinfacht gesagt, je ahnungsloser, desto fordernder.

Wenn ich das bemerke, ziehe ich mich meist sofort zurück, oder antworte erst gar nicht. Es ist fast ein bisschen wie bei einem Heroinsüchtigen... Man muss warten, bis der Leidensdrück so groß ist, dass die Person sich ändern WILL. Vorher ist es fruchtlos.
Das, mit dem Leid, ist nicht schön, aber lernen geht eben auch über Fehler machen, irren, üben und Erkenntnisse sammeln. Also auch Kritik, zumindest dann wenn man Fragen stellt, um schneller vorwärts zu kommen.

Ich warte also, bis du deinen komfortablen Platz auf dem "Mount Stupid" verlassen hast und in das Jammertal eintauchst. Dann, beim nächsten Anstieg, kann es mit uns beiden vielleicht was werden.

Einen Rat kann ich dir trotzdem geben:
-> Stelle keine Fragen, auf die du die Antwort nicht hören möchtest.

Ich empfinde die als nicht gar so neuartig........
Ich schätze, dass ich ähnlich angefangen habe. Kann mich an so manches Jammertal, und an so einige derbe Erkenntnismomente erinnern.

1 Like

Da hast du natürlich recht, das war nicht gut überlegt von mir.

Genauer betrachtet, wäre auch "Glück" anstelle von "Erfolg" besser gewesen.

Bei I²C braucht es einen Master und einen Slave1). Soweit ich mich erinnere, funktioniert der ESP32 gut als Master, nicht aber ohne zusätzliche Bibliothek als Slave. Die Verwendung der UARTs erscheint mir daher sinnvoll.

Ja, da denkst Du richtig.

Serial Input Basics - updated

How to process incoming serial data without blocking


Anm.:

  1. Die Begrifflichkeiten sind so etabliert, das kann man mögen oder auch nicht.

Aber Vorsicht, so lang du nicht sicher bist, es auch korrekt empfangen zu haben, weißt du auch nicht, dass es richtig gesendet wurde !

Vielleicht ist es ja von allgemeinen Interesse, der Umgang mit 2 I2C Kanälen......
1/2 aus dem Beispiel und 1/2 aus meiner Wühlkiste

#include <Streaming.h> // die Lib findest du selber ;-)
Stream &cout = Serial; // cout Emulation für "Arme"
#include <Wire.h>

constexpr byte SDA_1 = 21;
constexpr byte SCL_1 = 22;
constexpr byte SDA_2 = 17;
constexpr byte SCL_2 = 16;
constexpr byte SDA_3 = 4;
constexpr byte SCL_3 = 3;
//constexpr unsigned long I2C_FREQ = 400000UL; // 5V fast
constexpr unsigned long I2C_FREQ = 100000UL; // 3.3V z.B. AT24C32

#if defined(ARDUINO_AVR_UNO)
  #include <SoftWire.h> // https://github.com/stevemarple/SoftWire
  TwoWire &wire0 = Wire;
  SoftWire wire1 {SDA_3, SCL_3};
#elif defined(ARDUINO_SAM_DUE)
  TwoWire &wire0 = Wire;
  TwoWire &wire1 = Wire1;
#elif defined(ARDUINO_ARCH_ESP32)
  TwoWire wire0 {0};
  TwoWire wire1 {1};
#else
 #error "Board unbekannt"  
#endif


template<class WireType >void scan(WireType &wire, Print &print)
{
  print << F("Scanning I2C Addresses") << endl;
  uint8_t cnt = 0;
  for(uint8_t i = 0; i < 128; i++)
  {
    wire.beginTransmission(i);
    uint8_t result = wire.endTransmission(true);
    // print << endl << result << endl;
    if(result) 
    {
      print << F("..");
    }
    else 
    {
      if(i < 16)  print << '0';
      print << _HEX(i) ;
      cnt++;
    }
    print << F(" ");
    if ((i & 0x0f) == 0x0f) print << endl;
  }
  print << F("Scan Completed, ") << cnt << F(" I2C Devices found.") << endl;
}

void setup()
{
  Serial.begin(9600);
#if defined(ARDUINO_AVR_UNO)
  Wire.begin();
  Wire.setClock(I2C_FREQ);
  wire1.setTimeout_ms(200);
  wire1.begin();
#elif defined(ARDUINO_SAM_DUE)
  Wire.begin();
  Wire.setClock(I2C_FREQ);
  Wire1.begin();
  Wire1.setClock(I2C_FREQ);
#elif defined(ARDUINO_ARCH_ESP32) 
  wire0.begin(SDA_1, SCL_1, I2C_FREQ);
  wire1.begin(SDA_2, SCL_2, I2C_FREQ);
#else
 #error "Board unbekannt"  
#endif
}

void loop()
{
    cout << endl << F(" -> scan wire0 ") << endl << endl;
    scan(wire0,Serial);
  
    cout << F(" -> scan wire1 ") << endl;
    scan(wire1,Serial);
  
  delay(2000);
}
1 Like

hab es geschafft, er sendet richtig schön und schnell das war hammer ehrlich ich danke euch allen... habt mich zum lernen angeregt. Das war coolio... Vielen herzlichen dank für eure zeit und mühe.

Also das hast du sehr ausführlich beantwortet.
Selbst bin ich Lehrer und weiß, wie man jemandem etwas beibringen kann und mir sarkasmus und Beispielen, die nicht direkt damit etwas zu tun haben, ist nicht viel geholen außer den Menschen herunter zu schrauben.

Wenn ich lernen will, wie man etwas versendet über eine gewisse Art und von jemandem dann ein Beispiel bekomme, in dem er mir den vergleich von ups und dhl erklärt aber nciht sagt, wie ich dann eben nur mit ups oder nur dhl sende und empfange um in dem beispiel zu bleiben, dann hat dies wenig mit guter hilfe sondern viel mehr mit abladen seiner schlechten Laune oder Erfahrung zu tun.

Und danach kam von diesem menschen das wird dich kaum etwas über den Umgang lehren...

Und wieder nicht kam von ihm, wie ich dann eben diesen Umgang lerne sondern nur, dass es dies nicht tut.

Oder das Beispiel mit dem Fahrrad fahren der Tour de france
Oder schwimmen per Kanalüberquerung

Also das sind wirkliche Kritiken die vielleicht besser nicht an dieser Stelle angebracht sind.

Du selbst redest von "deinem konfortablen Platz auf dem "Mount Stupid"" und bezeichnest mich so indirekt als dumm und im gleichen atemzug hast du zu diesem Thema direkt noch nichts gesagt und nur gemeint, beim nächsten Anstieg kann es was werden?

Da ich nur nachgefragt habe also in meinen Augen, wie das funktioniert und ich es lernen will und bin so denke ich niemandem wissentlich auf den schlipps getreten oder habe jemanden beleidigt.
Und du machst so ein Fass hier auf?

Es ist einfach schade.

Das Problem habe ich gelöst und verstehe nun alle Seiten.
Aus deinem Kommentar nehme ich ein paar Dinge mit unter anderem, dass die Menschen hier das ganze nicht so böse meinen und einfach nur nicht nachdenken, wie es bei einem anderen ankommt. Ich es mir einfach nicht zu herzen nehmen sollte.

Ich danke auch dir für deine Zeit, auch wenn ich dadurch dinge lernte die nichts mit diesem thema zu tun haben aber ich lernte.
Also danke

Danke für deine Zeit :slight_smile: