2016-04-11 15 views
-3

Ich erstelle einen Temperaturknoten (Celsius) für meinen Arduino. Ich sende Byte-Daten von meinem Knoten an den Master-Knoten (auch Arduino läuft) durch billige RF-Links, so dass ich eine Temperatur (float) in ein Byte konvertieren muss, dass Im über die Luft sendet.Wie kann ich ein int in ein Byte umwandeln?

Ich weiß, dass mit einem einfachen Byte bin ich durch 255 Werte eines Bytes begrenzt, aber wenn ich die Genauigkeit auf 0,5 einstellen, wird das mehr als gut genug für das Wetter, das wir haben. Also habe ich den Bereich auf [-30, 97]

Wenn das gesetzt 0 Grad Celsius = Byte-Wert 60.

float ConvertFromByte(byte b) 
{ 
    // todo 
} 

byte ConvertFromFloat(float f) 
{ 
    // todo 
} 

Im ConvertFromFloat werde ich zur nächsten Runde müssen bis 0,5 und wenden Sie dann die Konvertierungsmethode an. ConvertFromByte muss nur bis zum letzten Bit, aber umgekehrt.

Wie kann ich das erreichen?

+0

Klingt, als ob Sie ein grundlegendes Übertragungsprotokoll benötigen. Größe, Daten, Prüfsumme. – Lundin

Antwort

1

In Ordnung, ich werde beißen, wenn nur weil immer gefragt wird, wie man zu bestimmten v runden und wie man Cast schreibt.

Angenommen, Sie beginnen mit dem Bytewert 0, der gleich dem Temperaturwert -30 ist, und dem Bytewert 255 entspricht dem Temperaturwert 97 Grad, und Sie möchten, dass jeder Bytewert den Temperaturwert um 0,5 Grad Celsius erhöht tatsächlich bei CurrentTemp = LowestTemp + (ByteVal * IncrementTemp) = -30 + (255 * 0,5) = 97,5 Grad und dies wird Ihre Gleichung sein. Deshalb:

const int LowestTemp  -30 
const float MaxTemp  97.5 
const float IncrementTemp 0.5 
bool retry_flag; 


float ConvertFromByte(byte b) 
{ 
    /*returns CurrentTemp*/ 

    return ((float)(LowestTemp + (b*IncrementTemp))); 
} 

byte ConvertFromFloat(float f) 
{ 
    /*returns ByteVal*/ 
    float CurrentTemp = (int)(f/IncrementTemp); 
    CurrentTemp *= IncrementTemp; 
    if((CurrentTemp<LowestTemp)||(CurrentTemp>MaxTemp)) retry_flag = 1; 
    return ((byte)((CurrentTemp - LowestTemp)/IncrementTemp)); 
} 

Verfahren nach Rundung kann here finden und macht Gebrauch von dem Verfahren der ersten der Anzahl durch das Inkrement Dividieren Abrunden auf eine ganze Zahl und dann durch das Inkrement multipliziert wieder.

Verfahren nach Typumwandlung lediglich x sagen Wert Abguss eines Typs zu sein, durch Schreiben (CAST) x wie oben. Hier verwende ich die Tatsache, dass int keine Brüche enthält, um CurrentTemp schnell auf die nächste ganze Zahl zu runden.

Beachten Sie auch, dass Ihr Code überprüfen muss, ob das Wiederholungs-Flag gesetzt ist, bevor der Wert für die Weiterleitung über RF verwendet wird. Es wird keine Fehler geben, der übergebene Wert ist jedoch völlig falsch.

1

Sie haben bereits den gewünschten Temperaturbereich ermittelt. Sie müssen also nur die Werte 0..255 auf diesen Bereich skalieren.

Um in Halbgradschritten von float [-30..97] auf ganzzahlig [0..255] zu kommen, müssen Sie 30 zur Zahl addieren, sie mit zwei multiplizieren, den Bruch abschneiden und beide begrenzen Seiten (negative Zahlen zu Null; Zahlen über 255 255 werden)

float temp; 
float x = temp+30; 
if (x < 0) return 0; // Apply lower limit 
x *= 2; 
return x > 255 ? 255 : (byte)x; // Apply upper limit and truncate 

um von Integral zu erhalten [0..255] [-30..97] zu schweben, durch 2, um den Wert zu float, divide wandeln und subtrahieren 30:

Verwandte Themen