2x ESP8266 und I²C Probleme

Hallo,
seit Stunden versuche ich mit 2x ESP8266 eine I2C Verbindung aufzubauen.
Leider ohne Erfolg.
Ich habe die 2 SDA und die SCL verbunden, mit jeweils PullUp 4,7kOhm an 3,3V
GPIO4 auf GPIO4
GPIO5 auf GPIO5

  • GND zwischen den 2

Soweit so gut.

Folgendes Script auf dem Sender:

#include <Wire.h>


#define SDA_PIN 4
#define SCL_PIN 5
const int16_t I2C_MASTER = 0x42;
const int16_t I2C_SLAVE = 0x08;

void setup() {
  Serial.begin(9600); 
  Wire.begin(SDA_PIN, SCL_PIN, I2C_MASTER); // join i2c bus (address optional for master)
}

byte x = 0;

void loop() {

    Wire.beginTransmission(I2C_SLAVE); // transmit to device #8
    Wire.write("x is ");        // sends five bytes
    Wire.write(x);              // sends one byte
    Wire.endTransmission();    // stop transmitting
    delay(1000);
    Serial.println(x);
    x++;
 
    }

folgendes auf dem Receiver

#include <Wire.h>

#define SDA_PIN 4
#define SCL_PIN 5

const int16_t I2C_MASTER = 0x42;
const int16_t I2C_SLAVE = 0x08;

void setup() {
  Serial.begin(9600);           // start serial for output

  Wire.begin(SDA_PIN, SCL_PIN, I2C_SLAVE); // new syntax: join i2c bus (address required for slave)
  Wire.onReceive(receiveEvent); // register event
}

void loop() {
}

// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(size_t howMany) {

  (void) howMany;
  while (1 < Wire.available()) { // loop through all but the last
    char c = Wire.read(); // receive byte as a character
    Serial.print(c);         // print the character
  }
  int x = Wire.read();    // receive byte as an integer
  Serial.println(x);         // print the integer
}

Es will einfach nicht gehen, keine Kommunikation.
DIe 2 ESP8266 Node MCU habe ich schon getauscht.

Irgenwas ist faul, aber was ?
Gruss rainer

hast du GND verbunden?

ja...

kannst du den master ändern und nur schreiben

Wire.begin(SDA_PIN, SCL_PIN);

Also ➜ ESP8266 to ESP8266 i2c · Issue #3046 · esp8266/Arduino · GitHub

1 Like

Muss es unbedingt I2C sein?
Serial oder softwareserial sind viel einfacher zu handhaben.

Wie viele Daten müssen denn da mit welcher Geschwindigkeit hin und her geschickt werden?

Da es zwei ESP8266 sind ist evtl. auch ESP-NOW eine Alternative
oder wenn du die beiden sowieso mit einem Router verbindest dann könnte man auch per UDP Daten hin- und hersenden.

Was am ehesten geeignet ist hängt - wie immer - von den Gesamtumständen ab.
Also wenn dein Projekt nicht geheim ist dann beschreibe doch mal was du im ganzen machst.

vgs

In den Beispielen zu Wire ist ein gute "Erklärung", funktioniert bei mir problemlos. Du musst allerdings ein Gerät als Master definierten, und eins als Slave.

Warum hängst du die Erklärung nicht an deinen Beitrag ?
Dann wäre es für alle besser nachvollziehbar.
Ist der ESP8266 überhaupt als I2C-Slave geeignet ?
Noch vor einiger Zeit konnte der ESP8266 nicht als Slave genutzt werden. Daher basieren meine Verbindungen zwischen den ESP8266 auch alle auf UDP. Wurde ja auch schon angesprochen.
Sollte sich bezüglich Slave beim ESP8266 etwas geändert haben, bitte ich um Hinweis.

2 Likes

siehe Link in #4

Nur, wenn der Master auch ein ESP8266 ist. (sagt die issue-Liste)

Gruß Tommy

Sorry, den Link habe ich übersehen.

Und das noch nicht einmal stabil, wie ich da rauslese.

Ja, sonst aber überhaupt nicht.

Gruß Tommy

Was soll ich denn mit einem unstabilen I2C ?
Dann doch lieber eine andere Technik.

Somit unterstreiche ich noch mal die Vorschläge von #5.

Evtl. kann der TO ja noch mal schreiben, was es werden soll.

Wenn ich sowieso 2 MC am (W)LAN habe, nehme ich sowieso auch ein IP-Protokoll.
Ich wollte nur klar stellen, dass es nur mit 2 Mal ESP8266 an I2C funktionieren kann.

Gruß Tommy

Ok, Tommy.
Hatte dich auch so verstanden.

Ob da auch WLAN genutzt wird, hat der TO leider noch nicht verraten.

Wie immer, fehlende Infos.

Gruß Tommy

Hallo Jungs,
also erstmal Danke für die Tips.

I2C ist ein muss, keine andere Alternative, würde zu weit ausschweifen, aber...:

Der wichtigste Tip von allen...."geht Slave überhaupt auf 8266"

Gleich mal alles auf 2x ESP32 umgebaut und die esp32 I2C Slave Lib dazu gezogen.
Nun funktioniert alles tip top...

--> GitHub - gutierrezps/ESP32_I2C_Slave: I2C slave library for ESP32

Was zu sagen ist, mit meinen 2x ESP8266 und den Standard Wire Libs gings nicht.

Mit 2x ESP32 geht nun alles.

Super Hinweis mit dem Slave "Thema". Danke !

Schön das es jetzt funktioniert.
Allerdings Alternativen zu I2C gibt es immer. :wink:

:slight_smile: ja klar, nur hier passen sie nicht.
...aber das Slave beim 8266 nicht geht, auf das wäre ich niemals niemals gekommen.
Nicht mal gegoogelt hätte ich danach...
Hatte bis jetzt immer Slave Bausteine wie Fram,EEprom, Can etc. dran... deswegen war es für mich selbstverständlich, das das gehen muss..... Ich komme aus der STM 32 Coretx Welt, da gab es so Probleme noch nicht.

Hätte ich lieber gleich im Forum gefragt :slight_smile: , gäbe es 5 graue Haare weniger...

Auf die Gefahr hin, das ich mich jetzt blamiere, .... wie kann ich den Topic als gelöst markieren ?
Ich finde nichts zum gelöst markieren :wink:

Naja, die 5 kann man sich rauszupfen.....
Das ist das kleinere Problem,

Die Erklärung die ich meinte, ergaben sich aus den Beispielen. Ich hab hier einen ESP12 als Master write und einen Atmega32 als Slave read. Funktioniert problemlos. ESP12 <-> ESP12 hab ich Mangels Verwendungszweck nicht ausprobiert.