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.
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.
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.
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.
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 , 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
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.