Hallo, ich würde gerne einen String per I2C an einem Host Arduino übertragen.
Der Inhalt der Variable ist abhängig vom Sensor und hat Integer Werte zwischen 0 - max. 25000. Da ich bei der Übertragung gemerkt habe, dass es mit einem Integer Wert nicht funktioniert, wollte ich einen String-Wert übergeben.
Wenn ich einen Integer Variable genommen hätte, habe ich am Host-Arduino nur Werte bis 245 erhalten, obwohl der übertragene Wert deutlich höher war. Daher bin ich zu einem String rüber gegangn.
Code für Sender Arduino
....
void Setup(){
Wire.begin();
}
void Loop(){
Wert=LeseSensor(); // Gibt einen String Wert zurück
Wire.beginTransmission(4);
Wire.write(Wert.c_str());
Wire.endTransmission();
delay(50);
}
Man braucht doch nur den Integer-Wert in 2 Bytes zerlegen und dann senden.
Das low-Byte = Wert&255 (meistens gehts auch ohne &255)-
Das high-Byte = Wert>>8, die oberen 8 Bit werden nach unten geschoben und dann übergeben.
Habe deinen Code mal bisserl abgeändert, musst deine Routine “LeseSensor()” wieder auf integer ändern:
//Code für Sender Arduino
....
void Setup(){
Wire.begin();
}
void Loop(){
int Wert=LeseSensor(); // Gibt einen Integer Wert zurück
Wire.beginTransmission(4);
Wire.write(Wert&255);
Wire.write(Wert>>8);
Wire.endTransmission();
delay(50);
}
Der Empänger muss die 2 Bytes dann wieder zu einem Integer zusammenstöpseln:
//Code für Empfänger:
int Ausgabe;
void Setup(){
Wire.onReceive(receiveEvent);
Wire.begin(4);
}
void receiveEvent(int howMany){
Ausgabe=Wire.read() | Wire.Read()<<8;
}
Falls du verschiedene Arten von Daten senden willst empfehle ich diese mit Steuercodes als erstes Byte zu versehen.
Z. B. beim Empfänger mit
switch(wire.read());
case 1:
…
break;
case 2:
…
break;
Der Sender sendet diese dann einfach vor den eigentlichen Daten.