NodeMCU mit Mega2560 I2C klappt nicht.

Hallo, dass ist mein erster Post hier :wink:
Normalerweise beiße ich mich an einem Problem so lange fest und lese mich ein, bis ich die Lösung selber gefunden habe. Aber nun habe ich meinen Meister gefunden, er heißt I2C.

Ich habe hier eine NodeMCU die GPS Daten sammelt und dann per I2C an einem Mega 2560 (mit Display) senden soll. Nur beiße ich mir daran seit mehreren Tagen die Zähne aus. Nehme ich anstatt des MEGA 2560 einen Arduino Nano, läuft das Skript und die Werte werden sauber übertragen. Ersetzt ich aber den Nano gegen den Mega kommt keine Communication auf dem I2C zustande.

Verkabelt habe ich folgendes:

NodeMcu: Mega2560:
D1 SCL 21
D2 SDA 20
Ground Ground

Auch über einen LevelShifter habe ich es schon versucht, klappt aber auch nicht.

Wer hat die passende Idee, was ich falsch mache?

Gruß Marcus

Vermutlich in der Zeile 42.
Oder 4711.
Oder 0815.

auch braucht es Bilder von deinem Aufbau.
Und zwar so deutlich dass wir jedes einzelne Kabel identifizieren können.
Wie sollten wir dir sonst helfen können?

(deleted)

Sender:

#include <Wire.h>

const byte SLAVE_ADR = 10;
byte i;

union FloatData
{
  float f;
  byte b[sizeof(float)];
};

FloatData temp[8];


void setup()
{
  Serial.begin(9600);
  Wire.begin(SLAVE_ADR);
  Wire.onReceive(receiveEvent);
  Wire.onRequest(requestEvent);


  temp[0].f = 10.0;
  temp[1].f = 123.5;
  temp[2].f = -30.8;
  temp[3].f = 1024.0;
  temp[4].f = 1;
  temp[5].f = 99999.999;
  temp[6].f = 54.01999999;
  temp[7].f = 070.1010101;
}

void loop()
{
}

void receiveEvent(int numBytes)
{
  i = Wire.read();
  Serial.println("Wire.read");
}

void requestEvent()
{
  Wire.write(temp[i].b, sizeof(FloatData));
  Serial.println("Wire.write");
}

Reciver:

#include <Wire.h>

const byte SLAVE_ADR = 10;
union FloatData
{
  float f;
  byte b[sizeof(float)];
};
FloatData temp[8];  //Anzahl der Variablen über I2C
float Temp1;
float Temp2;
float Temp3;
float Temp4;
float Temp5;
float Temp6;
float Temp7;
float Temp8;

void setup()
{
  Serial.begin(9600);
  Wire.begin();
}

void loop()
{
  
  I2Cget();
  delay(5000);
}

void I2Cget() {
  
for (byte i = 0; i < sizeof(temp) / sizeof(temp[0]); i++)
  {
    getTemp(i);
    Temp1=(temp[0].f);
    Temp2=(temp[1].f);
    Temp3=(temp[2].f);
    Temp4=(temp[3].f);
    Temp5=(temp[4].f);
    Temp6=(temp[5].f);
    Temp7=(temp[6].f/100);
    Temp8=(temp[7].f/100);
    //Serial.println(temp[i].f);
    Serial.println(Temp1);
    Serial.println(Temp2);
    Serial.println(Temp3);
    Serial.println(Temp4);
    Serial.println(Temp5);
    Serial.println(Temp6);
    Serial.println(Temp7);
    Serial.println(Temp8);
    Serial.println();


  }  
}

void getTemp(byte index)
{
  Wire.beginTransmission(SLAVE_ADR);
  Wire.write(index);
  Wire.endTransmission();

  Wire.requestFrom(SLAVE_ADR, sizeof(FloatData));
  if (Wire.available())
  {
    for (byte i = 0; i < sizeof(FloatData); i++)
      temp[index].b[i] = Wire.read();
  }
}

Wie gesagt mit NodeMCU + Arduino Nano klappten die Skripte sauber.
Das Testen der I2C auf dem Mega mache ich gleich mal.

Peter-CAD-HST:
Moin bmp0007
Hast du noch Baugruppe mit einer I²C Schnittstelle, z.b. LCD Anzeige, in der Hardware Kiste?
WENN JA: Dann die I²C Schnittstelle am MEGA testen und gucken, ob der Fehler mitwandert :slight_smile:
Viel Erfolg
Gruß Peter
und gesund bleiben

Das scheint es gewesen zu sein.
Wenn ich den I2C Scanner laufen lasse, finde ich mit dem Mega keine Adressen mehr, egal was ich anschließe.
Anscheinend ist mein I2C Bus auf dem Mega defekt...
Aber warum ?

Wer ist I2C-master wer ist I2C-slave?!?
Wohin gehört welcher Sketch ?
Warum zeigst du kein Verkabelung?

Master ist der Mega.
Bilder wollte ich einfügen, klappte aber komischerweise nicht.

Google Photos
Google Photos
Google Photos

Da fehlen die pullup-Widerstände am I2C-Bus. Ausserdem arbeitet der Mega mit 5V und der ESP mit 3,3V. Da braucht's auch einen Level-Shifter.

Kommando zurück, ich hatte gerade ein defektes Kabel.

Der Mega findet mit dem Scanner die angeschlossenen Geräte.
Also Funktioniert der I2C Bus auf dem Mega und auf dem Nano.

Aber ich bekomme keine Communication dazwischen hin.

Master ist der Mega.

Der Mega kann Master und Slave
Der ESP kann nur Master

Bei der Verbindung muss als der ESP zwingend der Master sein. und der Mega der Slave.

Hatte ich mit Level Shifter schon ausprobiert, klappt auch nicht.
Auch mit Pullups klappt es nicht.
Und die NodeMCU ist 5V fest, was ich bislang gelesen habe.

MicroBahner:
Da fehlen die pullup-Widerstände am I2C-Bus. Ausserdem arbeitet der Mega mit 5V und der ESP mit 3,3V. Da braucht's auch einen Level-Shifter.

combie:
Der Mega kann Master und Slave
Der ESP kann nur Master

Bei der Verbindung muss als der ESP zwingend der Master sein. und der Mega der Slave.

Ich kapiere es zwar noch nicht, aber du hast recht. Tausche ich die Sketche um, läuft es !
Ich danke dir dafür, nun kann ich weiter Basteln.

aber du hast recht.

Ich weiß!
:smiling_imp: :smiling_imp: :smiling_imp: :smiling_imp:

Weiter:

Hatte ich mit Level Shifter schon ausprobiert, klappt auch nicht.

Und das macht ihn dann überflüssig?

Auch mit Pullups klappt es nicht.

Und ohne Pullup tuts I2C auch nicht!

Und die NodeMCU ist 5V fest, was ich bislang gelesen habe.

Die Erde ist eine Scheibe
Politiker trinken Kinderblut
Bill Gates will dich chipen

Merksatz:

Wenn der Hahn, kräht auf dem Mist,
dann ändert sich das Wetter,
oder es bleibt wie es ist.

bmp0007:
nun kann ich weiter Basteln.

Und das wird dir leichter fallen, wenn du dir vorher mal die Datenblätter durchliest.

Jungs, bitte zerreißt mich nicht.
Ich habe wirklich zwei Tage gesucht und geschaut, auch in Datenblättern und mir das I2C wirklich intensiv angeschaut.
Einen Hinweiss, dass die NodeMCU kein Slave sein kann, habe ich nirgends gefunden.

Mit der NodeMCU als Master klappt es jetzt auch ohne LevelShift und PullUps.
Helft mir lieber, warum sollte ich bei der NodeMCU ein Levelshift und die Pullups benutzten ?

In der Endausbaustufe werde ich die natürlich einbauen, da dann kein NodeMCU sondern ein ESP8266 eingebaut wird.

bmp0007:
In der Endausbaustufe werde ich die natürlich einbauen, da dann kein NodeMCU sondern ein ESP8266 eingebaut wird.

Ein NodeMCU ist ein ESP8266 (mit etwas Hühnerfutter drumrum).

Gruß Tommy

da dann kein NodeMCU sondern ein ESP8266 eingebaut wird.

Auf dem NodeMCU ist also kein ESP8266?
Aha!

Helft mir lieber, warum sollte ich bei der NodeMCU ein Levelshift und die Pullups benutzten ?

Lesestoff

Einen Hinweiss, dass die NodeMCU kein Slave sein kann, habe ich nirgends gefunden.

Dann hast du nicht die ESP Wire Doku gelesen.

I2C (Wire library)
Wire library currently supports master mode .....

Eigentlich ist das doch das erste, was man lesen sollte, wenn man I2C Probleme mit einem ESP hat.

bmp0007:
Jungs, bitte zerreißt mich nicht.
Ich habe wirklich zwei Tage gesucht und geschaut, auch in Datenblättern und mir das I2C wirklich intensiv angeschaut.
Einen Hinweiss, dass die NodeMCU kein Slave sein kann, habe ich nirgends gefunden.

Mit der NodeMCU als Master klappt es jetzt auch ohne LevelShift und PullUps.
Helft mir lieber, warum sollte ich bei der NodeMCU ein Levelshift und die Pullups benutzten ?

Das ist je genau der Punkt, weshalb man Datenblätter lesen soll.
Das hat nix mit zerreißen zu tun. War nur ein höflich gemeinter Ratschlag, um schneller Probleme zu lösen.
Natürlich sagt da "mehrere Tage" nichts drüber aus.

Und I2C benötigt Pullups, damit es sauber funktioniert.
Levelshifter sind wichtig, wenn du 5V-Systeme mit 3,3V-Systemen verbinden willst.
Andernfalls killst du die Pins des 3,3V-System.

Genaueres findest du in combies Beitrag. Lesen hilft immer. :wink:

Ich habe euch auch alle Lieb :wink:

Ist echt frustrierend, jetzt wenn man es weiß, KANN man nach dem dritten Lesen rausfinden, das der ESP nur Master sein kann. Anscheinend ist mein Englisch da zu schlecht für, um die zusammenhänge zu verstehen und das beim ersten Lesen auch zu verstehen.

Und der NodeMCU braucht nun mal keinen LevelShifter, warum soll ich Ihn dann da einbauen, um mir mehr Fehler einzubauen ? Der ESP3266 BRAUCHT LevelShift um nicht gegrillt zu werden, der NodeMCU eben nicht.

Ist schon ein wenig frustrierend gleich so auseinander genommen zu werden.

Helft mir lieber, warum sollte ich bei der NodeMCU ein Levelshift

weil der NodeMCU mit 3.3 und der Mega mit 5V arbeitet.

und die Pullups benutzten ?

weil I2C Pullups braucht. Wenn du nicht andere I2C Devices am Bus hast die evtl. mit Pullups kommen (viele LCD Backpacks haben z.B. Pullups), und du nur Devices ohne Pullup verbindest, dann musst du die Pullups selber setzen.