binär zu dezimal umwandeln (rc-switch)

Hallo,
ich versuche (bisher erfolglos) einen binären (37bit langen) string mithilfe von

decimal = (b[18] * 512) + (b[19] * 256) + (b[20] * 128) + (b[21] * 64) + (b[22] * 32) + (b[23] * 16) +(b[24] * 8)+ (b[25]*4) +(b[26]*2)+ b[27];

in eine dezimal-Zahl umzuwandeln. (mich interessieren nur 10 der 37 zahlen, also die stellen 19-28)

Allerdings komme ich mit den Datentypen durcheinander (der binäre string wird mit "cons char*" übergeben).

Wenn ich versuch ihn umzuwandeln kommen negative zahlen, Buchstaben oder falsche zahlen raus.

(Falls es hilft: das ganze basiert auf dem "ReciveDemo_Advanced" sketch der rc-switch library)

RCSwitch gibt dir doch schon ein dezimales Ergebnis raus.
Warum nimmst du das nicht ?

In dem Ergebnis (z.B. 0000000101000000000100000101000010101) verbirgt sich der Temperatur-Wert eines Außensensors. Dieser Wert nimmt jedoch nur 10 bits ein.
Alle anderen bits sind für mich uninteressant.

gilex:
In dem Ergebnis (z.B. 0000000101000000000100000101000010101) verbirgt sich der Temperatur-Wert eines Außensensors. Dieser Wert nimmt jedoch nur 10 bits ein.
Alle anderen bits sind für mich uninteressant.

Und warum machst du das nicht mit VirtualWire ?

Gut, da muss man auch den richtigen und nutzbaren Wert abtrennen, aber da kannst du doch die einzelnen Bits zählen und nicht benötigte verwerfen.

gilex:
In dem Ergebnis (z.B. 0000000101000000000100000101000010101) verbirgt sich der Temperatur-Wert eines Außensensors. Dieser Wert nimmt jedoch nur 10 bits ein.
Alle anderen bits sind für mich uninteressant.

Den Vorlauf raus schieben und den Rest weg maskieren

Ich musste das Protokoll für den sensor selber zu rc-switch hinzufügen und habe keine Ahnung wie das bei radiohead/vwire geht.

Das Problem ist wie gesagt, das ich die übertragenen bits von rc-switch nicht einzel auslesen kann.
Also z.B.

int mydec = b[2]

gibt 48 aus und nicht 0.

...anders formuliert: wie kann ich die x-te stelle aus einem char* auslesen und wie eine zahl verwenden (also multiplizieren etc.)

48 ist das Zeichen '0' / 49 die '1'

also ist b[2]-'0' --> 0 oder 1, je nachdem, was drin steht ('0' oder '1').

Gruß Tommy

Tommy56:
48 ist das Zeichen '0' / 49 die '1'

Ich habe int mydec = atoi(b[2]); probiert aber bekomme jetzt überhaupt kein Zeichen mehr ausgegeben.

Wie kann ich den Ascii-Code sonst noch in einen int umwandeln?

b[2]-'0'

gilex:
Wie kann ich den Ascii-Code sonst noch in einen int umwandeln?

Indem Du richtig abschreibst.

Gruß Tommy

atoi() verlangt ein Null-terminiertes char Array. Kein einzelnes Zeichen

http://www.cplusplus.com/reference/cstdlib/atoi/

Habe es jetzt eher "unelegant" gelöst (aber es funktioniert :smiley: ):

float mydec = ((int(b[18])-48)*512) + ((int(b[19])-48)*256) + ((int(b[20])-48)*128) + ((int(b[21])-48)*64) + ((int(b[22])-48)*32) + ((int(b[23])-48)*16) + ((int(b[24])-48)*8) + ((int(b[25])-48)*4) + ((int(b[26])-48)*2) + (int(b[27])-48);
  mydec = mydec/10;
  Serial.println(mydec);

Danke an alle für die Hilfe!