ESP32 per i2c verbinden

Am Ende möchte ich jeweils 2 Werte vom einem Arduino Mega an 6x ESP32 übermitteln.
I2C Mega zu Mega habe ich ohne Problem hinbekommen, aber bei ESP32 scheitere ich mit Ausdauer. Ein Levelshifter ist verbaut, Mega bzw. ESP3Ich versuche einen Arduino Mega (hat alle Sensoren) & 6 ESP32 WROOM-32 per I2C zu verbinden, am Ende möchte ich jeweils 2 Werte vom Mega an einen ESP32 übermitteln.
Zwischen 2 Arduino´s habe ich den Datenaustausch mit wire bzw. mit&ohne I2C_Anything.h ans laufen gekriegt, zu den ESP32 bzw. testweise auch nur 2 ESP32 untereinander will es nichts funktionieren.

Zum Testen sind jetzt 2 ESP32 an Gpio D21 & D22 verbunden, beide mit 4,7k Pullup an 3,3V.
Aber egal was ich versuche mit den ESP32 funktioniert es nicht. Sind die nicht zu Wire kompatibel ?

Hardware: Arduino Mega bzw. 6x ESP32-Wroom + Levelshifter
Software: Arduino IDE 2.1.0

Mein TestCode:

I2C-MASTER

#include <Wire.h>
#include <I2C_Anything.h>

#define SDA 21
#define SCL 22

float X=3;
float Y=1;  

void setup() 
{
  Wire.begin (SDA,SCL);
} 
 // end of setup
 
void loop() 
{

  Wire.beginTransmission (8);
  I2C_writeAnything (X);
  I2C_writeAnything (Y);
  Wire.endTransmission ();
  delay(1000);
}  

I2C-SLAVE

#include <Wire.h>
#include <I2C_Anything.h>
float chosenOne=0;
float wert=0; 

void setup() {
  Serial.begin (115200);
  // ---------------------------  ID festlegen
#define ID 8
#define SDA  21
#define SCL  22
 Wire.begin (SDA,SCL,ID);
 Wire.onReceive (receiveEvent);
}

void loop() {
Serial.println("Start Loop");
  delay(100);
}

void receiveEvent (int)
  {
  I2C_readAnything (chosenOne);
  I2C_readAnything (wert); 
  Serial.print("chosenOne : ");   Serial.println(chosenOne);
  Serial.print("wert      : ");   Serial.println(wert); 
} 

```2 sind mit 4,k Pullup zu 5V bzw. 3.3V versehen
 
Hardware: Arduino Mega  bzw. 6x ESP32-Wroom + Levelshifter
Arduino IDE 2.1.0

Am Ende habe ich jetzt versucht 2 ESP32 zzuz verbinden

tippe oder füge den Code hier ein

Kennst Du diese Doku von Espressif? Stichwort: slaveWrite

Gruß Tommy

Bist du dir sicher, dass bei deinem ESP auch wirklich GPIO22 dem Pin D22 entspricht?

Tommy, meinst du evtl. Wire Slave ?
Dazu gibt es hier ein paar Informationen.

Ja , da bin ich sicher
Aus Verzweifelung habe ich schon mit digitalWrite(21, HIGH) bzw, digitalWrite(22, HIGH) die 3,3 Volt gemessen

Nö, ich habe aus der verlinkten Doku " slaveWrite" zitiert. Einfach mal rein schauen.

Anderseits warum braucht der TO 6 ESP32 als Slave an einem MEGA? Das wäre schon interessant zu wissen. Evtl. geht er von falschen Voraussetzungen aus.
Das ist ja wie 6 Porsche an einem Polo :wink:
Ich würde eher die 6 ESP per WLAN verbinden und wenn nötig den MEGA als Slave an einen davon ran hängen.

Gruß Tommy

1 Like

Ja, das stimmt schon. Nur als "Oberbegriff" war mir da halt Wire Slave geläufig.
Ok, passt ja auch.

Evtl. schreibt er ja noch mal seinen Grund.

Ok, dann nochmal direkt:
Hallo @hatto_stone
Warum möchtest du mehrere ESP32 per I2C verbinden ?
Das geht auch einfach per WLan (UDP oder ESP Now).

Im Thema ESP32 & Arduino Mega 2560 R3 verbinden? findest Du ein von mir erprobtes Beispiel.

Was macht das bei Dir?

@HotSystems
Weil der Arduino kein Wlan bzw. Bluetooth hat.
Und den Arduino weil er das Controlduino Modul hat.
@agmue
ESP32 Master sieht normal aus.

20:25:13.292 -> Start
20:25:13.292 -> BYTEZAHL Byte für int: 4
20:25:14.317 -> 	tx.Wert_1: 219	tx.Wert_2: 338
20:25:15.325 -> 	tx.Wert_1: 248	tx.Wert_2: 101

Beim ESP32 Slave kommt nichts auf der Konsole

Grade nochmal probiert:

Mega2560:

21:11:12.381 -> 	tx.Wert_1: 196	tx.Wert_2: 885
21:11:13.384 -> 	tx.Wert_1: 223	tx.Wert_2: 420
21:11:14.384 -> 	tx.Wert_1: 194	tx.Wert_2: 968
21:11:15.405 -> 	tx.Wert_1: 235	tx.Wert_2: 915

ESP32:

21:11:12.381 -> C4 0 75 3 	rxWert_1: 196	rxWert_2: 885
21:11:13.384 -> DF 0 A4 1 	rxWert_1: 223	rxWert_2: 420
21:11:14.384 -> C2 0 C8 3 	rxWert_1: 194	rxWert_2: 968
21:11:15.405 -> EB 0 93 3 	rxWert_1: 235	rxWert_2: 915


Da mein ESP32 5 V verträgt, nutze ich keinen Levelshifter.

Glückwunsch,
Ich hab grade die beiden ESP32 nochmal direkt verbunden ohne Pullup, mein Ergebnis bleibt identisch.

Das ist keine Antwort auf meine Frage.
Warum 6 St. ESP32 ?
Warum die Verbindung mit I2C ?

Welche Version des ESP32-Core verwendest Du?
Warum brauchst Du 6 ESP32?

Welches? Link bitte.

Gruß Tommy

Wieso bist du dir da so sicher ?

1 Like

Na ja ich war vor einer Zeit auch so sicher, Endeffekt nach 10Std 4 Pins defekt.

@Tommy56
Modul: https://controlduino.com/
Und weil ich damit 6 einzelne runde Displays ansteuere für Ladedruck usw.

Wie groß sind die Entfernungen zwischen dem MEGA und den ESP32?
Das klingt nach KFZ, also elektrisch verseuchte Umgebung.
Warum kann das nicht ein ESP32 erledigen bzw. gleich der MEGA mit?

Gruß Tommy

Bitte auch diese Frage beantworten.

Und welches Modul davon ?

Wie hast du das gelöst?

Ja danke, nach vielen Fehlversuchen muß man sich auch mal auf die Schulter klopfen - lassen :stuck_out_tongue_closed_eyes:

Auch mit Levelshifter werden bei mir Daten übertragen :slightly_smiling_face:

Mega2560:

12:05:33.092 -> 	tx.Wert_1: 166	tx.Wert_2: 443
12:05:34.096 -> 	tx.Wert_1: 188	tx.Wert_2: 4
12:05:35.099 -> 	tx.Wert_1: 267	tx.Wert_2: 757
12:05:36.102 -> 	tx.Wert_1: 172	tx.Wert_2: 46

ESP32:

12:05:33.092 -> A6 0 BB 1 	rxWert_1: 166	rxWert_2: 443
12:05:34.096 -> BC 0 4 0 	rxWert_1: 188	rxWert_2: 4
12:05:35.099 -> B 1 F5 2 	rxWert_1: 267	rxWert_2: 757
12:05:36.102 -> AC 0 2E 0 	rxWert_1: 172	rxWert_2: 46

Keine gute Idee, PullUp müssen sein. Bei mir siehst Du keine, weil der originale Mega2560 je 10 kΩ auf dem Board hat.

Ist Deine Hardware irgendwie anders?


Als ich meine ESP32 vor ein paar Jahren kaufte, hat ein freundlicher Herr von Espressif dies so gesagt. Daher nutze ich zum Testen, also für kurze Zeit, keine Levelshifter. Ich tue dies als erwachsener Mensch in eigener Verantwortung. Da die Aussage von Espressif aber nicht in den Datenblättern zu finden ist, empfehle ich, sich an die Datenblätter zu halten und Levelshifter zu verwenden.