Komunikation zweier Arduino "Nanno und UNO" mittels I²C

Hallo Zusammen

nachdem ich nun die Sonnen -Aufgangs Untergangs Berechnung erfolgreich implementiert habe möchte ich noch meine Daten auf einer Sd-Karte abspeichern und diese mittels eines Ethernetmoduls ins Netzwerk übertragen. Doch leider ist der Speicher mittlerweile zu klein. Desshalb habe ich mir überlegt die Daten mittels I²C auf einen UNO zu übertragen und dort die Speicherung und Übertragung ins Netz zu erledigen. Hierfür habe ich folgende Bibliothek gefunden: http://www.billporter.info/2011/05/30/easytransfer-arduino-library/ Doch leider kapiere ich nicht wie ich jetzt die Daten aus meinem Sketch über I²C übertrage. Es währe glaube ich sinnfoll die Werte in ein Array zu verpacken und diese dann auf dem Empfänger weiter zuverarbeiten. Nur ist mir nicht ganz klar wie ich die ganzen verschiedene Daten auf dem Sender in ein Array verpacke.

Hier mal die meisten Variablen.

float tempK;                      //Duch Mittelwertbildung beruigter Meßwert
int tempk_ueber_110C_und_keine_Pumpe_in_Betrieb;
float tempKMittelwert;              //Hilfsvariable zur Mittelwertbildung
int zaehlerIstK;                  //Anzahl derDurchlaeufe
int ZaehlerSoll;              //Anzahl der Durchlaeufe Fuer die Mittelwertbildung
  //Variablen Speichertemperaturen
float tempS1;
float tempS1Mittelwert;              //Hilfsvariable zur Mittelwertbildung
int zaehlerIstS1;                  //Anzahl derDurchlaeufe
float tempS2;
float tempS2Mittelwert;              //Hilfsvariable zur Mittelwertbildung
int zaehlerIstS2;                  //Anzahl derDurchlaeufe

int tempPin1 = 1;                 //Hier ist der analoge Eingang der Temperaturproportionalen Spannung (0-5V)
int SpeichertempPin1 = A3;        //Temperaturdaten der Speichersensoren werden an Analogpin3 angeschlossen

int tempVorh;                     //wenn der Temperaturwert ungenau ist oder die Meßwertberichtigung nicht richtig funktioniert dann muss float statt int gesetzt werden
int tempVorhRohwert;              //wenn der Temperaturwert ungenau ist oder die Meßwertberichtigung nicht richtig funktioniert dann muss float statt int gesetzt werden

int Pumpe1 = 3;
int Pumpe2 = 2;
boolean LadeanforderungS1;                   //Hilfsvariable zum Laden Speicher1 für das Vorladen Speicher1 über Speicher2
boolean LadeanforderungS2;                   //Hilfsvariable zum Laden Speicher1 für das Vorladen Speicher1 über Speicher2
DelayTimer TimerVorladenWeiterschaltung;   //Timer-Variable Fuer die Stufenberechnung
boolean vorladen;

int TasterSP1Ein = 7;                     //Schalter Anwahl SP1 
int TasterSP2Ein = 9;                     //Schalter Anwahl SP2

int SP1Ein = digitalRead(TasterSP1Ein);   //Die Variabe SP1Ein wird aus dem Eingang TasterSP1Ein gebildet
int SP2Ein = digitalRead(TasterSP2Ein);   //Die Variabe SP2Ein wird aus dem Eingang TasterSP2Ein gebildet

float DifferenztemperaturS1 = 0;      //Hier nichts eingeben
float DifferenztemperaturS2 = 0;      //Hier nichts eingeben
int SpeicherTempMax = 85;           //Hier die Maxtemperatur des Speichers, bei der die Pumpe ausgeschaltet wird und eine Fehlermeldung ausgegebeb wird ( muss quittiert werden ) eingeben
int KolektorTempMax = 130;          //Hier die Maxtemperatur des Kolektors, bei der die Pumpe ausgeschaltet wird  und eine Fehlermeldung ausgegebeb wird ( muss quittiert werden ) eingeben
int KolektorTempMaxHysterese = 2;   //Hier die Hysterese der Ausschaltemperatur des Kolektors, bei der die Pumpe wieder eingeschaltet wird, eingeben
int SpeicherTempUnplausibel = 8 ;   //Unter 8°C ist Meßwert im Speicher unplausibel

int Stufe;                          //Fuer die Stufenweiterverarbeitung
int StufeSpeicher1;                 //Fuer die Stufenweiterverarbeitung
int SicherheitSpeicher1iO;          //Fuer die Stufenweiterverarbeitung
int StufeSpeicher2;                 //Fuer die Stufenweiterverarbeitung
int SicherheitSpeicher2iO;          //Fuer die Stufenweiterverarbeitung
DelayTimer TimerStufenberechnung;   //Timer-Variable Fuer die Stufenberechnung

int FehlereldungSpeicher1MaxVariable = 0; //zum speichern des Fehlers auch wenn die Fehlerursache wieder verschwindet
int FehlereldungSpeicher2MaxVariable = 0; //zum speichern des Fehlers auch wenn die Fehlerursache wieder verschwindet
int FehlereldungSpeicher1UnplausibelVariable = 0; //zum speichern des Fehlers auch wenn die Fehlerursache wieder verschwindet
int FehlereldungSpeicher2UnplausibelVariable = 0; //zum speichern des Fehlers auch wenn die Fehlerursache wieder verschwindet


//Variablen fuer die Leistungsberechnung des Kollektors
DelayTimer TimerKollektorLeistungsberechnung;//Timer-Variable Fuer die Leistungsberechnung des Kollektors
float TempLeistBerechnungKollektor1;       //Fuer die Leistungsberechnung des Kollektors 
float TempLeistBerechnungKollektor2;              //Fuer die Leistungsberechnung des Kollektors
float DeltaTempLeistBerechnungKollektor;          //Fuer die Leistungsberechnung des Kollektors
int   DurchgangLeistBerechnungKollektor;      //zur Zaehlung der Durchgaenge 0 oder 1
int LeistungKollektor = 1 ;                    //die Leistung des Kollektors sie wird bis zur ersten Berechnung auf mittel gesetzt

boolean Sonneaufgegangen;

Könnt Ihr mit dabei helfen?

Schon im vorraus Vielen Dank Rudi

Willst Du nicht einen einzigen MEGA 260 nehmen? Grüße Uwe

Hi Uwe

danke für die Antwort. Leider habe ich schon eine Platine mit eineen Nano gefertigt und schon ca 1Jahr in Betreib. Die Sache mit den Arrays bin ich gerade in den Griff zu bekommen.

Grüße Rudi

Array ist der falsche Weg, da du völlig unterschiedliche Datentypen hast. Packe die ganzen Daten in ein struct. Die Adresse des structs kannst du dann einen Zeiger auf Byte oder char casten. Und schon hast du etwas das man wie ein Array ansprechen kann:

struct Data
{
   int test1;
   float test2;
   unsigned long test3;
} data_t;

....write((byte*)&data_t, sizeof(data_t));

Anders herum geht es genauso. Man muss nur das Array mit den Daten auf einen Zeiger auf das struct casten und den Zeiger dann dereferenzieren.

I2C ist dafür aber nicht so gut, da die Puffer recht klein sind. Da blockiert irgendwann der Code wenn die Puffer voll sind. Es geht wahrscheinlich, aber seriell wäre besser.