i2c arduino hängt sich auf?

Ich habe das Problem das an dem Punkt wo ich Wire.endTransmission() mache mein arduino programm sich aufhängt, was man an der aubleibend Seriellen naricht sieht, eine Serielle Nachricht vorm dem Wire teil funktioniert.
Ich habe es mal in einer Standalone Datei ausgetestet wo es funktioniert, aber irgendwo bei der einbindung scheint ein fehler zu sein?!

Hauptprogramm (zu lang fürs Forum=

Master:

Slave:

Meine Test Datei die funktioinert hat:

Master:

#include <Wire.h>
int cycle = 5;
char cycle_temp[5] = {1,2,3,4,5};
char cycle_time[5] = {55,66,77,33,33};
int repetition = 555;
int check = 0;
void setup()
{
  Wire.begin(55); 
  Serial.begin(19200);
  Wire.onRequest(send_data);
}

void loop()
{
Serial.println("Warte auf Signal");
delay(1000);
Wire.beginTransmission(52);
Wire.write('T');
Wire.endTransmission();
}
void send_data(int howMany){
  Serial.print(check);
    switch (check){
      case 0:
      Serial.print("Ich gehe rein");
        
        Wire.write(cycle);
          ++check;
        delay(100);
        Wire.flush();
        break;
      case 1:
        
        Wire.write(repetition);
          ++check;
        break;
      case 2:
        Wire.write(cycle_temp,cycle);
         ++check;
        delay(100);
        Wire.flush();
        break;
         
      case 3:
        Wire.write(cycle_time,cycle);
         ++check;
        break;
       
      default:
        Serial.println("Finished");
        check = 0;
    }
  

  }

Slave:

#include <Wire.h>
int cycle = 5;
int cycle_temp[5];
int cycle_time[5];
int repetition;
int i;
int check = 0;
void setup()
{
  
  Serial.begin(9600);
  Wire.begin(52); 
  Wire.onReceive(start_test);
 
 
}

void loop()
{
 
  }
void start_test(){
  char help;  
  help = Wire.read();
  Serial.print(help);
}
void tets(){
  
  int test = 0;

  delay(1000);
  Serial.print(check);
  
  switch (check){
     case 0:
        
        
        Wire.requestFrom(55,1);
        cycle = Wire.read();
        if(cycle != 0){
          ++check;
        }
        delay(100);
        Wire.flush();
        break;
     case 1:
     
        Wire.requestFrom(55,1);
        repetition = Wire.read();
        if (repetition != 0){
         ++check; 
         }
        
        
        break;
     case 2:
        Wire.requestFrom(55,cycle);
        while(Wire.available()){
        cycle_temp[i] = Wire.read(); 
        ++i;
      }
        if (cycle_temp[1] != 0){
         ++check; 
         }
         Wire.flush();
        break;
     case 3:
        Wire.requestFrom(55,cycle);
        while(Wire.available()){
        cycle_time[i] = Wire.read(); 
        ++i;
        }
        if (cycle_time[1] != 0){
         ++check; 
         }
        break;
     default:
        Serial.print("Finished");
        data();
  }
      
}
void data(){
   Serial.println("TEMP");
      for(int i = 0;i <5;++i){
        Serial.print(cycle_temp[i]);
        Serial.print(",");  
      }
      Serial.println("TIME");
      for(int i = 0;i <5;++i){
        Serial.print(cycle_time[i]);
        Serial.print(",");  
      }
      Serial.println("Zyklen:");
      Serial.print(cycle);
      Serial.println("Wiederholungen");
      Serial.print(repetition);
      delay(1000);
  
}

Ok ich habe das Problem gelöst.

Falls jemand mal hier drüberstolpert der das selbe Problem hat:

Ich habe in meinem empfänger Code eine while schleife die noch ein Überrest der Kommunikation mit Serial war.
Diese while schleife hat bis 10s gezählt, was wahrscheinlich dann einen fehler in der i2c kommunikation verursacht hat, da diese nicht beendet werden konnte

Losspost:
Ok ich habe das Problem gelöst.

Falls jemand mal hier drüberstolpert der das selbe Problem hat:

Ich habe in meinem empfänger Code eine while schleife die noch ein Überrest der Kommunikation mit Serial war.
Diese while schleife hat bis 10s gezählt, was wahrscheinlich dann einen fehler in der i2c kommunikation verursacht hat, da diese nicht beendet werden konnte

Du meinst sicher den Slave. Da sehe ich aber keine While-Schleife die mit Serial zusammen hängt.
Zeige uns doch al den "Übeltäter".

Also ja es ist der Slave(der von Pastebin)

void test_mode(int howMany) {
  int wait = now();
  String befehl;
 
 
 
 
  while (now() != wait + 4){
   
    befehl = Wire.read();
   
   
    if (befehl == 'H') {
      digitalWrite(aPin, LOW);
      digitalWrite(bPin, HIGH );
      analogWrite(pwmPin,100);
      Serial.println("Heat");
      delay(1000);
      befehl = 'X';
 
    } else if (befehl == 'C') {
      digitalWrite(aPin, HIGH);
      digitalWrite(bPin, LOW );
      analogWrite(pwmPin,100);
      Serial.println("cool");
      delay(1000);
      befehl = 'X';
    }
    if (befehl == 'F') {
      int wait_fan = now();
      int pwm_fan;
      while (now() != wait_fan + 2){
     
      pwm_fan = Wire.read();
      analogWrite(pwmFan, pwm_fan);
      Serial.println("Fan");
      }
      delay(1000);
    } else if (befehl == 'V') {
      int wait_pwm = now();
      int pwm_pin;
      while (now() != wait_pwm + 2){
      pwm_pin = Wire.read();  
      analogWrite(pwmPin, pwm_pin);
      Serial.println("Heat pwm");
      }
      delay(1000);
    }
    delay(1000);
  }
 
 
}

Ich hatte das Problem das er beim wo ich noch serial verwendet habe zwei Serial.print hintereinander falsch interpretiert hat.
Deswegen hatte ich es so gemacht das er mit dem ersten befehl in die funktion reingeht und dann einige sekunden wartet bis der zweite Serial Befehl reinkommt

while (now() != wait + 4){}

Dieser Code schnipsel meine ich. Er sorgte dafür das der Arduino 4s in der funktion bleibt.
Aber anscheinend hat dieser auch Den i2c kommunikation gestört. Ich vermute das I2C die Verbindung beenden wollte aber durch die schleife dies nicht wirklich konnte. Somit konnte er die Daten nicht richtig empfangen.
Ab dem moment wo ich die while schleifen entfernt habe ging es.

Nach dem Scheis habe ich nun 4 Tage gesucht >:(

Aber sowas merkt man sich dann (eine Weile :wink: ).

Gruß Tommy