Arduino I2C -> KEINE KOMMUNIKATION (Slaves und Display)

Hallo. zusammen.

Ich möchten einen Arduino (Nano/Uno) als Master nutzen und damit 3 ATtiny als Slave ansprechen. Das ganze soll per I2C funktionieren.

Das klappt auch alles (Ausgabe auf Seriellen Monitor mit Serial.println) -
jedoch sobald ich ein Display mit einbinde (SSD1306 in 128x32), bricht die Kommunikation zusammen bzw. hängt sich alles auf oder es wird auf dem Display nur fehlerhaft eine Ausgabe gemacht und danach bricht alles zusammen.

Das 1306 Beispiel was bei der Bibliothek dabei ist funktioniert ABER NUR wenn ich die ATtiny's nicht mit am I2C angeschlossen habe. Wenn ich die 3 Kontroller mit anschließe (beim 1306 Animationsbeispiel), hängt sich das Display auf bzw. werden direkt alle Animationen fehlerhaft dargestellt (verzerrt). Als wenn das Display nicht mehr weiß, wo welcher Pixel gesetzt werden muss. Dann bricht die Kommunikation zusammen oder der ganze Kontroller hängt sich auf. Es passiert jedenfalls nichts mehr.

Ich habe auch an SDA und SCL je einen 4,7 kOhm PullUp Widerstand eingebaut. Habe es auch ohne getestet.

Das Display funktioniert mit Adresse 0x3C
Die ATtiny's mit 1, 2 und 3

Was mache ich falsch?

Hier sind das MASTER und SLAVE Sketch

MASTER:
Je nach dem kann man die serielle Ausgabe oder Displayausgabe auskommentieren

#include <Wire.h>

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels

#define OLED_RESET     -1 // Reset pin
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);


uint8_t y = 0;
 
      
void setup()
{
  Wire.begin();
//Serial.begin(9600);


display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Address 0x3C for 128x62


  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.println("Test");
  display.display(); 
  delay(500);
  display.clearDisplay();
  display.display(); 
  
}

void loop()
{

  for(int x = 1; x < 4; x++)
  {
    Wire.requestFrom(x,1); //request from slave device
                           //address x. expect 1 byte
    while(Wire.available())
    {
      y = Wire.read();

  
  display.clearDisplay();
  display.setCursor(0, 0); 
  display.println(y);
  display.display(); 
  
 // Serial.println(y);
    }

  delay(1000);
  }



}

Resetpin ist -1 da das Display keinen eigenen hat (Wird so vorgeschlagen)

SLAVE:
Wird nach dem Anfordern nur 11, 22 oder 33 zurückgegeben. Adresse ist passend zum ATtiny 1, 2 oder 3

#include <TinyWire.h>

#define I2C_SLAVE_ADDRESS 3   //1,2,3


void setup() {

 TinyWire.begin( I2C_SLAVE_ADDRESS );

 TinyWire.onRequest( onI2CRequest );
}

void loop() {
  
}

void onI2CRequest() {
 TinyWire.send(33);    //11 = 1, 22 = 2, 33 = 3
}

Es geht jetzt hier erstmal nur um die erfolgreiche Kommunikation und Ausgabe auf ein 1306 Display

Aktuell wäre meine nächste Idee ein Display per ISP anzusteuern (wenn es das kann) - sollte es mit I2C nicht klappen

Die niedrigen I2C Adressen (bis 16) haben spezielle Bedeutung, z.B. Broadcast. Nimm mal höhere Adressen, damit das Display nicht versucht, irgendwas in die fremden Adressen hineinzugeheimnissen.

Werde ich mal ausprobieren. Soll ich die Werte dann auch wie beim Display festlegen?
z.B: 0x39, 0x3A, 0x3B oder kann ich auch 50 81 oder 100 als Adresse schreiben?

Beim Display dürften die Adressen festgelegt sein - steht im Datenblatt. Wenn das Display überhaupt funktioniert, muß man dort nichts ändern.

Habe es jetzt mit den Werten 11, 12 und 13 als Adresse ausprobiert.

Mit PullUp stürzt die Kommunikation nach 6 gesendeten Werten ab. Ohne nach ca. 10 Sekunden.

Habe jetzt ein SPI Display getestet und es funktioniert so bis jetzt problemlos - also I2C für die Slaves und SPI für das Display