INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Float über I2C zwischen 2 Arduinos UNO
15.10.2015, 12:19
Beitrag #1
Float über I2C zwischen 2 Arduinos UNO
Hallo alle zusammen!

Ich habe vor einigen Wochen ein Programm geschrieben mit dem ich ein float-wert über I2C von einem Arduino zum anderen Sende und dort empfange und auf dem Serial Monitor ausgebe.

Leider funktioniert das nicht. Bitte Euch um Hilfe. Danke Euch! Smile
Code:
-----------------Master--------------------
#include<Wire.h>

void setup() {
// put your setup code here, to run once:
Wire.begin();
Serial.begin(9600);
Serial.println("Arduino I2C-Master");
}
float f_value = 123.45;
boolean f = 0;
int slave_adress = 42;
void loop() {
byte*b = float_to_bytearray(f_value);
Wire.beginTransmission(slave_adress);
Wire.write(b,4);
f = Wire.endTransmission();

if(f > 0){
Serial.println("Fehler! Slave anwortet nicht!");
}
delay(500);

}

// Funktion: float_to_bytearray
byte* float_to_bytearray(const float Zahlenwert) {
//static byte buffer[4];
static byte bigEndian[4];
byte* bytes = (byte*)&Zahlenwert;

bigEndian [0] = bytes[3];
bigEndian [1] = bytes[2];
bigEndian [2] = bytes[1];
bigEndian [3] = bytes[0];

return bigEndian;
}

-------------Slave----------------
#include<Wire.h>
int slave_adress = 42;
void setup() {

Wire.begin(slave_adress);
//Wire.onReceive(receiveEvent);
Serial.begin(9600);
Serial.println("Arduino I2C-Slave");


}

float f_value_byte;

void loop() {

int i = 0;
byte b_0 = 0;
byte b_1 = 0;
byte b_2 = 0;
byte b_3 = 0;
uint8_t bytes[4];


while(Wire.available() > 0)
{
bytes [i] = Wire.read();
Serial.println(bytes [i]);
i = i + 1;
}
f_value_byte = *((float*)&bytes);

Serial.println(f_value_byte);
delay(500);
}
Später möchte ich gerne Sensorwerte übertragen. Muss ich wirklich jedes mal den float in Bytes und wieder zurück wandeln? Ich sehe da keinen Vorteil gegenüber einer Seriellen Übertragung.

Vielen Dank für Eure Unterstützung!

Gruß
Marduino_UNO
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.10.2015, 20:48
Beitrag #2
RE: Float über I2C zwischen 2 Arduinos UNO
(15.10.2015 12:19)Marduino_UNO schrieb:  Hallo alle zusammen!
.
.
.
Muss ich wirklich jedes mal den float in Bytes und wieder zurück wandeln? Ich sehe da keinen Vorteil gegenüber einer Seriellen Übertragung.

Vielen Dank für Eure Unterstützung!

Gruß
Marduino_UNO

Hallo,

so wie es aussieht leider ja.
Die wire-Library kann wohl nur mit dem Datentyp 'byte' umgehen.
Man muss also int, long, float, .... zerlegen und wieder zusammensetzen.
In deinem Code sieht das etwas unübersichtlich aus. Deshalb habe ich mal was "gebastelt".

Code:
//-----------------Master--------------------
#include<Wire.h>

float   f_value = 123.45;
byte    slave_adress = 42;

void setup()
{
  Wire.begin();
  Serial.begin(9600);
  Serial.println("Arduino I2C-Master");
}

void loop()
{
  Wire.beginTransmission(slave_adress);
  put_4byte_to_i2c((byte*) &f_value);

  if(Wire.endTransmission() > 0)
   Serial.println("Fehler! Slave anwortet nicht!");
  
  delay(500);
}

void put_4byte_to_i2c(byte* wert)
{
  for (int i=0;i<4;i++)
    Wire.write(wert[i]);
}

Code:
//-------------Slave----------------
#include<Wire.h>

float   f_value = 0;
byte    slave_adress = 42;

void setup()
{
  Wire.begin(slave_adress);
  Serial.begin(9600);
  Serial.println("Arduino I2C-Slave");
}

void loop()
{
  if(Wire.available() > 0)  
   get_4byte_from_i2c ((byte*) &f_value);

  Serial.println(f_value);
  delay(500);
}

void get_4byte_from_i2c(byte* wert)
{
  for (int i=0;i<4;i++)
    wert[i] = Wire.read();
}

Das ist alles nicht ausprobiert, lässt sich aber ohne Fehlermeldung compilieren. Smile
Probiere das bitte mal aus und gib Rückmeldung.

Gruß
Arne

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.10.2015, 11:16 (Dieser Beitrag wurde zuletzt bearbeitet: 16.10.2015 12:59 von Marduino_UNO.)
Beitrag #3
RE: Float über I2C zwischen 2 Arduinos UNO
Hallo Arne,

vielen Dank für Deine Antwort! Smile

Leider kommt nur ein Wert von 0.00 am Slave an.

Liegt das nun an der Zerlegung von Float und der Zusammensetzung der Bytes oder an der Kommunikation?

Ich habe Float auch schon mal mit Hilfe aus den Foren mit UNION zerlegt. Aber weiß nicht so recht wie ich es wieder zusammensetzten kann.

// Float to 4Bytes
union speicherTeiler {
float fValue;
struct {
byte b1;
byte b2;
byte b3;
byte b4;
} geteilt;
};

union speicherTeiler unionValue;
unionValue.fValue = 1234.56;

// Zugriff auf die Bytes:
unionValue.geteilt.b1;
unionValue.geteilt.b2;
unionValue.geteilt.b3;
unionValue.geteilt.b4;

Ich habe noch nicht so richtig verstanden warum ich ein delay einbauen muss. Wenn ich später meine Sensorwerte auslese und diese an den anderen Arduino senden möchte ist das viel zu langsam.

Gruß
Marduino_UNO

Hier habe ich die optimale Lösung gefunden:

http://www.bajdi.com/i2c-communication-b...-arduinos/

Eine Bibliothek mit der man egal welchen Datentyp per I2c versenden kann und das ohne delay. Sehr hilfreich! (Y)

Gruß
Maduino_UNO
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.10.2015, 15:35
Beitrag #4
RE: Float über I2C zwischen 2 Arduinos UNO
Hallo Maduino_UNO,

klappte es denn mit der verlinkten Variante?

Ich muss gestehen diese Seite auch gesehen zu haben. Habe das dann aber wieder verworfen weil auf eine weitere Seite für die "I2C_Anything.h" verwiesen wurde.

Die "I2C_Anything.h" hat aber schon eine gewisse Ähnlichkeit mit meiner "put_4byte_to_i2c(byte* wert)" Funktion. Big GrinBig Grin

Gruß
Arne

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.10.2015, 20:10
Beitrag #5
RE: Float über I2C zwischen 2 Arduinos UNO
Hallo Arne,

entschuldige, dass ich jetzt erst antworte. Wink

Ja mit der Lib. "I2C_Anything_datatyp.h" funktioniert es:

Hier ein Beispiel-Code:
---------------Sender------------------
#include<Wire.h>
#include"I2C_Anything_datatyp.h"
const byte slave_adress = 42;

void setup() {
Wire.begin();
Serial.begin(19200);
Serial.println("Arduino I2C Sender");
}

float a = 1234.56;
int b = 654;
byte c = 255;
char d = 'd';

void loop() {

Wire.beginTransmission(slave_adress);
I2C_writeAnything (a);
I2C_writeAnything (b);
I2C_writeAnything ©;
I2C_writeAnything (d);

Wire.endTransmission();
}

----------------Empfänger--------------
#include<Wire.h>
#include"I2C_Anything_datatyp.h"

const byte my_adress = 42;

void setup() {
Wire.begin (my_adress);
Serial.begin(19200);
Serial.println("Arduino I2C Empfaenger");
Wire.onReceive(receiveEvent);
}

volatile boolean getData = false;
volatile float a;
volatile int b;
volatile byte c;
volatile char d;

void loop() {

if(getData)
{
Serial.print("float Value a = ");
Serial.println(a);
Serial.print("int Value b = ");
Serial.println(b);
Serial.print("byte Value c = ");
Serial.println©;
Serial.print("char Value d = ");
Serial.println(d);

getData = false;
}
}

void receiveEvent(int howMany)
{
if( howMany >= ( (sizeof a) + (sizeof b) + (sizeof c) + (sizeof d) ) )
{
I2C_readAnything (a);
I2C_readAnything (b);
I2C_readAnything ©;
I2C_readAnything (d);

getData = true;
}
}

Gruß Marduino_UNO
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.10.2015, 12:59 (Dieser Beitrag wurde zuletzt bearbeitet: 18.10.2015 13:00 von HaWe.)
Beitrag #6
RE: Float über I2C zwischen 2 Arduinos UNO
hallo,
hat wer einen Link zur "originalen" i2c_anything lib mit ein paar Erklärungen dazu?
Ich fand nur eine unter Mecanum - oder ist die das, um die es geht?

https://github.com/joshvillbrandt/mecanu...Anything.h

(ps, bitte code möglichst in code tags posten, das macht es deutlich lesbarer Wink )
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.10.2015, 13:10
Beitrag #7
RE: Float über I2C zwischen 2 Arduinos UNO
Hi HaWe,

das Original ist vermutlich von Nick Gammon (dem alten Fuchs Smile ) und kann hier als zip geladen werden.

Gruß
Arne

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.10.2015, 19:12
Beitrag #8
RE: Float über I2C zwischen 2 Arduinos UNO
jap, super, danke!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Servo über Temperatur steuern querkopf71 3 73 07.12.2016 19:21
Letzter Beitrag: hotsystems
  Kommunikation über das WiFi-Shield Flap 3 235 07.11.2016 20:20
Letzter Beitrag: hotsystems
  Menü über Bluetooth Eingabe abwarten anwo 4 504 18.10.2016 08:59
Letzter Beitrag: Lolliball
  Daten über USB verarbeiten Felix91 10 326 12.10.2016 13:00
Letzter Beitrag: Tommy56
  Code mit Verifikation über Keypad & LCD machnetz 5 215 10.10.2016 15:01
Letzter Beitrag: torsten_156
  Arduino Steuern über eigne Homepage b3ta 8 404 16.08.2016 11:07
Letzter Beitrag: Pit
  Rechnen mit float und unsigned long Rudi 3 306 03.06.2016 12:41
Letzter Beitrag: hotsystems
  DUE-MEGA über I2C Verbinden HTO 0 222 22.05.2016 10:16
Letzter Beitrag: HTO
  Serial Monitor Eingabe über Code Maxi290997 4 523 12.05.2016 18:57
Letzter Beitrag: SkobyMobil
  "WORT" über die serielle Schnittstelle auslesen hannes77 1 536 08.03.2016 12:13
Letzter Beitrag: Binatone

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste