float in 2 bytes konvertieren

Hi,
ich möchte gerne aus einem float (gemessene Temperatur) ein Byte vom Wert vorm '.' und einen Byte vom Wert nachm '.' haben.
Ansätze habe ich schon, aber weiß nicht ob ich damit in die richtige Richtung gehe und ob ich vielleicht zu komplziert denke?

  1. float to String:
char buffer[5];
  float t = 12.12345678;
  dtostrf(t, 5, 2, buffer);

Der String müsste dann "12.12" ergeben

  1. String to byte:
    Hier hapert es noch. Vermütlich macht atoi sinn, aber wie kann ich mittels atoi aus 2 char ein byte erstellen, also aus buffer[0]=1 und buffer[1]=2 => byte temp1=12 bzw. aus buffer[3]=1 und buffer[4]=2 => byte temp2=12?

Vielen Dank und Gruß
Thorsten

Hast du mal probiert den Punkt in deinem Array durch ein NULL zu ersetzen ('\0')? Dann solltest du atoi() verwenden können, da die Funktion ein Null-terminiertes Array erwartet. Für den zweiten Teil musst du dabei allerdings erstmal das Array umkopieren, da atoi einen const Pointer erwartet und man anscheinend keine Teil-Arrays übergeben kann.

currymuetze:
ich möchte gerne aus einem float (gemessene Temperatur) ein Byte vom Wert vorm '.' und einen Byte vom Wert nachm '.' haben.
...
Der String müsste dann "12.12" ergeben

Also ein Byte soll aus dem Vorkommawert gebildet werden, und ein Byte aus dem auf zwei Stellen gerundeten Nachkommawert?

  float t = 12.12345678;
  byte b1=round(t*100)/100;
  byte b2=round(t*100)%100;

P.S.: Dass Du mit der "byte" Geschichte ein Problem bei Temperaturen unter 0 bekommst, ist Dir aber schon klar?

Hi Jurs,

danke, das sieht ja doch recht simple aus - auf die Idee muss man erst mal kommen :wink:

Dass Du mit der "byte" Geschichte ein Problem bei Temperaturen unter 0 bekommst, ist Dir aber schon klar?

Yip - aber da ich nur Temperaturen zwischen 20 und 30 grad messe bleibt der Fall unberücksichtigt. Ist die Wassertemperatur eines Aquariums und wenn die Richtung 0 Grad geht ist mir die Fehleranfälligkeit des Codes relativ schnubbe - dann kann ich das Becken eh direkt in die Kanalisation kippen :wink:

THX

Als früher der Speicherplatz noch knapp war, hatten wir einen float16 Datentyp.
Die Daten hatten feste Zero/Span parameter, und dieser Bereich wurde auf ein 15 bit integer gemappt.
(Das Vorzeichen war eine Fehlerkennung)

Die Genauigkeit (15 bit) war perfekt für Werte von einem Sensor, und konnte über den Span Parameter an unterschiedliche Vor-/Nachkommastellen angepasst werden.

Je nachdem wofür du deine "Akrobatik", bzw.mehr als die komprimierten Temperatur-Werte, brauchst, ist das evtl. auch interessant für deinen Fall. Planst du auch ein Zurückwandeln nach float ?

Aber 15 Bit Auflösung (zumal im Bereich 20°C + 10°C ) schafft eh kein Sensor,
da ist dein Ansatz, dich auf den Bereich 0x0000 .. 0xC763 für Werte zwischen 0.00 und 199.99 zu beschränken, auch sehr schön.

@jurs:
Ich bekomme immer ne fehlermeldung: invalid operands of types double and int to binary operator%

for (int i=0;i<ds18b20.count;i++) TempLED[i] = ds18b20.get_temp(i);
  temp[0] = round(TempLED[0]*100)/100;
  temp[1] = round(TempLED[0]*100)%100;
  temp[2] = round(TempLED[1]*100)/100;
  temp[3] = round(TempLED[1]*100)%100;

DAs komische ist, dass das in einem anderem sketch klappt:

TempWater = ds18b20.get_temp(0);
  temp[0] = round(TempWater*100)/100;
  temp[1] = round(TempWater*100)%100;

Vielen DAnk

currymuetze:
@jurs:
Ich bekomme immer ne fehlermeldung: invalid operands of types double and int to binary operator%

Stimmt, "round" liefert offenbar einen Wert vom Typ "double" zurück.
Die korrekterweise zu verwendende Rundungsfunktion müßte dann "lround" statt "round" sein.
Funktioniert es damit?

geht damit tatsächlich.
Erklären kann ich es mir aber nicht, da doch im gleichen Kontext die Funktion in einem anderem Sketch funktioniert?

currymuetze:
Erklären kann ich es mir aber nicht, da doch im gleichen Kontext die Funktion in einem anderem Sketch funktioniert?

Ich kann es Dir auch nicht erklären, weshalb der Compiler mal Ganzzahloperationen auf float-Variablen anstandslos frißt (und im laufenden Programm sogar richtig damit umgeht) und mal gibt es einen "type mismatch" Compilerfehler.

Syntaktisch korrekt zur Rundung mit Umwandlung in eine Ganzzahl ist jedenfalls "lround", selbst wenn "round" in manchen Quellcodes auch funktioniert.