Mehrere Int-Werte über I2C übermitteln

Hallo zusammen,

nachdem ich viele Fragen hinsichtlich der Programmierung über die Suchfunktion beantworten konnte stoße ich hierbei an meine Grenzen.
Ich möchte nacheinander mehrere Integer (int) über den I2C-Bus von einem zum anderen Controller übermitteln. Mit einem Wert klappt das bisher auch ganz gut allerdings habe ich es bisher nicht hinbekommen mehrere (5 Int-Werte) nacheinander zu übermitteln. Könnt ich mir helfen?

Hallo,
einfach mit einer For-Schleife die fünf mal einen Wert überträgt.
Schleife
Gruß und Spaß
Andreas

Der Haken an der I2C Lib ist dass man im onRequest Event Handler nur ein einziges mal write() machen kann. Man kann aber ein Byte Array übertragen und mit Unions kann man Integer und Arrays gleich ansprechen, da sie den gleichen Speicher belegen.
Wenn man mehrere Variablen mit eigenen Namen benennen will, geht es am einfachsten mit einer Union aus einem anonymen struct und einem Byte Array. Ansonsten kann man auch ein int Array auf byte* casten um es als Byte Array anzusprechen

Man kann das auch damit kombinieren dass man für jeden Integer einen eigenen Request macht und entweder vom Master den Index jedesmal vorher schickt oder auf dem Slave automatisch den Index inkrementiert. In dem Fall würde mit die Daten als ein Array aus Unions organisieren. Wenn aber immer sowieso alle Werte übertragen will ist das unnötiger Aufwand.

Hallo,
das setzt aber auch voraus, das man (auch Frau) versteht, was Du geschrieben hast.
Du ballerst hier auch manchmal welche rein...
Einen schönen Tag noch.
Gruß und Spaß
Andreas

Wenn er es wirklich schon geschafft hat einen int zu übertragen ist er schon mal weiter als die meisten Anfänger. Die meisten Leute scheitern schon daran vollkommen. Da kann man voraussetzen dass tatsächlich etwas Wissen vorhanden ist.

Es kann natürlich aber auch sein dass er tatsächlich nur in Byte übertragt und nur denkt es sei ein int, weil er es nicht über den ganzen Wertebereich getestet hat. Wire.write() geht mit int, aber überträgt nur ein Byte

Option 1: Union mit einem anonymen struct damit man getrennt ansprechbare Variablen hat

Master:

#include <Wire.h> 

const int SLAVE_ADR = 2;

union data_u
{
  struct
  {
    int value1;
    int value2;
    int value3;
    int value4;
    int value5;
  };
  byte bytes[10];
};

data_u data;

void setup()
{
  Serial.begin(9600);
  Serial.println("Master");
  Wire.begin();

  getData();
}

void loop()
{
}

void getData()
{
  Wire.requestFrom(SLAVE_ADR, sizeof(data));
  for (unsigned int i = 0; i < sizeof(data); i++)
    data.bytes[i] = Wire.read();

  Serial.println(data.value1);
  Serial.println(data.value2);
  Serial.println(data.value3);
  Serial.println(data.value4);
  Serial.println(data.value5);
}

Slave:

#include <Wire.h> 

const int SLAVE_ADR = 2;

union data_u
{
 struct
 {
 int value1;
 int value2;
 int value3;
 int value4;
 int value5;
 };
 byte bytes[10];
};

data_u data;

void setup()
{
 data.value1 = 1;
 data.value2 = 4;
 data.value3 = 12;
 data.value4 = 30000;
 data.value5 = -10000;
 
 Wire.begin(SLAVE_ADR);
 Wire.onRequest(requestEvent);
}

void loop()
{
}

void requestEvent()
{
 Wire.write(data.bytes, sizeof(data));
}

Option 2: Ein int Array auf byte* gecastet

Master:

#include <Wire.h> 

const int SLAVE_ADR = 2;

int values[5];

void setup()
{
  Serial.begin(9600);
  Serial.println("Master");
  Wire.begin();

  getData();
}

void loop()
{
}

void getData()
{
  Wire.requestFrom(SLAVE_ADR, sizeof(values));
  byte* ptr = (byte*)values;

  for (unsigned int i = 0; i < sizeof(values); i++)
  {
    *ptr = Wire.read();
    ptr++;
  }

  Serial.println(values[0]);
  Serial.println(values[1]);
  Serial.println(values[2]);
  Serial.println(values[3]);
  Serial.println(values[4]);
}

Slave:

#include <Wire.h> 

const int SLAVE_ADR = 2;

int values[5];
void setup()
{
  values[0] = 10;
  values[1] = 40;
  values[2] = 120;
  values[3] = 32000;
  values[4] = -1000;
  
  Wire.begin(SLAVE_ADR);
  Wire.onRequest(requestEvent);
}

void loop()
{
}

void requestEvent()
{
  Wire.write((byte*)values, sizeof(values));
}

Eine andere einfache Möglichkeit wäre eine Union aus einem int Array und einem Byte Array :slight_smile:
Das geht wie im ersten Beispiel, aber halt statt dem struct ein int Array

Hallo,
man kann sagen was man will, DU- lieferst!
Danke für Deine Mühe.
Gruß und Spaß
Andreas

Vielen Dank! Habe es mit eurer Unterstützung zum laufen gebracht, 3 Werte werden bisher der Reihe nach über ein Array übertragen. Sobald mehr Messwerte zur Verfügung stehen werde ich dies erweitern.