Lichtsteuerung mit i2c

Hi Leute,
Ich versuche im Moment ein LED-Licht für mein Zimmer aufzubauen. Das ganze soll wie folgt aussehen:
Ein Atmega (mit Uno bootloader und Arduino code) ist auf ner selbst geäzten Platine mit fünf Mosfets die jede einen "lichtkanal" treiben (Rot, Grün, Blau, Warmweiß, Kaltweiß) auf derselben Platine ist dann auch noch ein 4-Pin i2c ausgang (SDA SDC 5V GND).
Das ganze soll dann später so laufen, dass ich dann per i2c diese Platine "anschreibe" und die dann die gewünschte Farbe einstellt. (dazu werden 6 bytes übertragen, die ersten 5 sind die jeweilig gewünschten Farbwerte und das letzte gibt an in wie vielen Schritten dahin "gefadet" wird)

Die Platine habe ich soweit fertig und im Moment steuere ich diese direkt mit einem Arduino UNO an.

Aber irgendwie läuft die Übertragung garnicht so, wie ich mir das wünsche :frowning:
Hatte zuerst das Problem, das (vermutlich) zwar daten ankamen, diese aber nicht richtig gespeichert (/ oder interpretiert) wurden.
Jetzt allerdings bekomme ich immer Wire.endTransmission keine "0" zurückgegeben...
(habe an den UNO 2 LED's angeschlossen, eine Grün die andere Rot um zu checken, was Wire.endTransmission macht)

Hier ist mein Quellcode dazu:

Master

/* Lichtprogramm Version vom 26.11.2014
Master Version (connected via i2c)

 */
#include "Wire.h"

byte buf[6]={100,200,0,0,0,50};///Red Green Blue Coldwhite Warmwhite  steps
const byte MASTER_ADDRESS = 43;
const byte SLAVE_ADDRESS = 42;

void setup() //begins i2c communication and sets two Outputs as controll LED's
{
  Wire.begin();
  pinMode(12,OUTPUT); //Green
  pinMode(11,OUTPUT);  //Red
  }

void loop() {
  
  Wire.beginTransmission(SLAVE_ADDRESS);
  Wire.write(buf[0]);
  Wire.write(buf[1]);
  Wire.write(buf[2]);
  Wire.write(buf[3]);
  Wire.write(buf[4]);
  Wire.write(buf[5]);
  
  
  if(Wire.endTransmission()==0) //succsess
    {
           Serial.println("GREEN");
           digitalWrite(12,HIGH); //Green LED on
           digitalWrite(11,LOW);  //Red LED off
    }
   else { //no success ;(
          Serial.println("RED");
          digitalWrite(12,LOW);  //Green LED off
          digitalWrite(11,HIGH);  //Red LED on
    }
    
delay(100);
}

Slave:

/* Lichtprogramm Version vom 26.11.2014
Slave Version (directly connected to the mosfets)

 */
#include "Wire.h"
//Constants:
const byte DEL=100;
const byte MASTER_ADDRESS = 43;
const byte SLAVE_ADDRESS = 42;
// definitions:
float farbe[5]={0,0,0,0,100}; //Red Green Blue Coldwhite Warmwhite 
byte income[6]={0,0,0,0,0,100};     //Red Green Blue Coldwhite Warmwhite  steps
float steps[5]={0,0,0,0,0};      //stores the steps for each color

int timer=0; //used to avaoid "delay()"

//Pins: 
int red=9;
int green=10;
int blue=6;
int wwhite=5;
int cwhite=3;

void setup()
{
  pinMode(red,OUTPUT);
  pinMode(green,OUTPUT);
  pinMode(blue,OUTPUT);
  pinMode(wwhite,OUTPUT);
  pinMode(cwhite,OUTPUT);
  Wire.begin(SLAVE_ADDRESS);
  Wire.onReceive (receiveEvent);
  setLEDs();
}


void receiveEvent  (int howMany)
{
  //Receive and save the data:
  for (int i = 0; i <6; i++) //I am sending six bytes (red green blue warmwhite coldwhite delay)
    {
     income[i] = Wire.read ();
    
    }  // end of for loop
          
   //Derivation of Steps:
   float dR=income[0]-farbe[0]; //absolute deviation of income and the actual color set
   float dG=income[1]-farbe[1];
   float dB=income[2]-farbe[2];
   float dkW=income[3]-farbe[3]; 
   float dwW=income[4]-farbe[4]; 
   
   steps[0]=dR/income[5]; //absolute deviation divided by number of steps
   steps[1]=dG/income[5];
   steps[2]=dB/income[5];
   steps[3]=dwW/income[5];
   steps[4]=dkW/income[5];
      // end of receiveEvent
 }


void loop()
{  
   {
       
    if((abs((farbe[0]-income[0])) >1 )||((abs(farbe[1]-income[1])) >1 )||((abs(farbe[2]-income[2])) >1 )||((abs(farbe[3]-income[3])) >1 )||((abs(farbe[4]-income[4])) >1 ))//if the color we have is not the color we want
    {
      //Derivation of a new "Farbe" (color array)
      farbe[0]=farbe[0]+steps[0]; 
      farbe[1]=farbe[1]+steps[1];
      farbe[2]=farbe[2]+steps[2];
      farbe[3]=farbe[3]+steps[3];
      farbe[4]=farbe[4]+steps[4];
      
      setLEDs();  //set the new color
      delay(DEL); //NOT SURE IF I can use that
     }
  }
  //end of loop
}

void setLEDs() // Sets the led (using analog write) and checks for overflow
{    //Check scope of bytes:
   if(farbe[0]>255) {farbe[0]=255;}
   if(farbe[1]>255) {farbe[1]=255;}
   if(farbe[2]>255) {farbe[2]=255;}
   if(farbe[3]>255) {farbe[3]=255;}
   if(farbe[4]>255) {farbe[4]=255;}
   
   if(farbe[0]<0) farbe[0]=0;
   if(farbe[1]<0) farbe[1]=0;
   if(farbe[2]<0) farbe[2]=0;
   if(farbe[3]<0) farbe[3]=0;
   if(farbe[4]<0) farbe[4]=0;
    
    analogWrite(red,farbe[0]); 
    analogWrite(green,farbe[1]);
    analogWrite(blue,farbe[2]);
    analogWrite(cwhite,farbe[3]);
    analogWrite(wwhite,farbe[4]);
    //End of setLEDs() 
  }
  
  //Thats all

Falls es fragen gibt, zum Aufbau, Code oder was auch immer gibt geh ich natürlich auf jede Rückfrage ein. Hab im moment echt keine Ahnung woran das liegt und bin über jede Hilfe sehr froh!

Warum verwendest du übermässig viele Floats? Wie sieht der Aufbau über I2C aus? Kabellänge, Kabelabschirmung, Querschnitt, Störquellen? Serial wäre hier die bessere Möglichkeit gewesen.

Hi der Aufbau über i2c ist, dass ich A4 und A5 mit nem jumper auf ein steckbrett führe, darauf sind für jeden Kanal pullup widerstände auf 5v, sodass das signal klar durchkommt, danach gehts wieder mit nem jumper wire zum 2. gerät. (beide kabel 10cm lang) habe auch nicht "immer" das Problem mit dem nicht erfolgreichen übertragen, es verhält sich meiner ansicht nach recht wahllos.. :frowning:

Die floats habe ich genommen, damit das "faden" "weicher" wird, ja ich weiß er schreibt eh nur bytes bei analogWrite, ist aber wegen dem rechnen (so kann ich Steps <1 nehmen)

p.s.: habe gerade mal den Atmega im Uno getauscht.. jetzt scheint die übertragung zu klappen (Grüne LED leuchtet) aber die Farbe am Ausgang ändert sich leider immernoch nicht. :frowning:

Fingolin:
Hi der Aufbau über i2c ist, dass ich A4 und A5 mit nem jumper auf ein steckbrett führe, darauf sind für jeden Kanal pullup widerstände auf 5v, sodass das signal klar durchkommt, danach gehts wieder mit nem jumper wire zum 2. gerät. (beide kabel 10cm lang) habe auch nicht "immer" das Problem mit dem nicht erfolgreichen übertragen, es verhält sich meiner ansicht nach recht wahllos.. :frowning:

Wie groß hast Du die Pullup-Widerstände genommen?
Grüße Uwe