Autor |
Arduino Daten wandeln Suche nach: arduino (708) |
|
|
|
|
BID = 1092355
Murray Inventar
Beiträge: 4887
|
|
Hallo
Ich schreibe mir gerade was für den ESP32 mit der Arduino-Software um einen Wärmemengenzähler auszulesen.
Gerade hänge ich fest beim Wandeln von HEX in DEC.
Und zwar will ich die HEX-Zahlen-Abbildung als DEC-Zahlen weiterverwenden.
Also aus HEX 58 soll DEC 58 werden.
Gibt dafür bestimmt irgend ein Befehl ...
Genau genommen hab ich ein CHAR-Array wo ich die Daten drin habe.
Meinetwegen
58, 09, 88, 16 (als HEX in buf[27] bis buf[30])
Das brauche ich als Dezimalzahl 16880958 (sind Liter) |
|
BID = 1092357
Murray Inventar
Beiträge: 4887
|
|
Jetzt habe ich es so hinbekommen.
Ist aber noch ein Fehler drin.
Als String werden führende Nullen der Hex-Zahlen abgeschnitten.
Wie kann man das formatieren auf 2 Stellen?
Code : |
String temp1 = String(b[27], HEX);
String temp2 = String(b[28], HEX);
String temp3 = String(b[29], HEX);
String temp4 = String(b[30], HEX);
String myString=temp4+temp3+temp2+temp1;
float Volumen = myString.toFloat(); |
|
|
|
BID = 1092362
roger34 Neu hier
Beiträge: 40
|
beim float hast du nur 23 Bit mantisse. deswegen wird dir die Zahl mal abgeschnitten.
ich würde folgendes machen
Code : |
value=0;
for(i=30;i>=27;i--){
value*=100;
value= ((buf[i]>>4) & 0x0f)*10 + (buf[i] & 0x0f);
}
|
|
[ Diese Nachricht wurde geändert von: roger34 am 6 Jan 2022 15:04 ]
[ Diese Nachricht wurde geändert von: roger34 am 6 Jan 2022 15:07 ]
|
BID = 1092363
Murray Inventar
Beiträge: 4887
|
Was passiert bei dem
value*=100;
?
Denn irgendwas stimmt noch nicht.
Bis jetzt gibt es so nicht die Gesamtzahl aus.
|
BID = 1092364
roger34 Neu hier
Beiträge: 40
|
Zitat :
Murray hat am 6 Jan 2022 15:37 geschrieben :
|
Was passiert bei dem
value*=100;
?
Denn irgendwas stimmt noch nicht.
Bis jetzt gibt es so nicht die Gesamtzahl aus.
|
ist das gleiche wie value = value*100;
|
BID = 1092366
roger34 Neu hier
Beiträge: 40
|
Natürlich muss man hier value = vlaue + ...... schreiben
Zitat :
|
Code : |
value=0;
for(i=30;i>=27;i--){
value*=100;
value= value + ((buf[i]>>4) & 0x0f)*10 + (buf[i] & 0x0f);
}
|
|
|
|
BID = 1092367
Murray Inventar
Beiträge: 4887
|
Guter Ansatz
Habe es hinbekommen
Code : |
float value=0;
int i;
unsigned long z=1000000;
unsigned long Volumen;
Volumen = 0;
for(i=30;i>=27;i--)
{
value= ((b[i]>>4) & 0x0f)*10 + (b[i] & 0x0f);
Volumen =value *z + Volumen;
z = z /100;
}
Serial.println (Volumen);
|
|
[ Diese Nachricht wurde geändert von: Murray am 6 Jan 2022 15:58 ]
|
BID = 1092368
Murray Inventar
Beiträge: 4887
|
Zitat :
roger34 hat am 6 Jan 2022 15:54 geschrieben :
|
Natürlich muss man hier value = vlaue + ...... schreiben
|
Funktioniert jetzt auch und ist natürlich besser
|
BID = 1092369
BlackLight Inventar
Beiträge: 5334
|
Bin leider jetzt erst zum Antworten gekommen.
Zitat : Murray hat am 6 Jan 2022 12:42 geschrieben :
| Also aus HEX 58 soll DEC 58 werden. |
0x58 -> 88 (10), richtig?
Zitat :
| Genau genommen hab ich ein CHAR-Array wo ich die Daten drin habe.
Meinetwegen
58, 09, 88, 16 (als HEX in buf[27] bis buf[30]) |
Sind das 16-bit chars? Oder sind das einfach nur 16-bit Variablen? Wie das interpretiert wird ist ja das Problem von Nutzer/Compiler und nicht vom µC.
Kannte bisher nur char mit 8 bit.
|
BID = 1092384
Murray Inventar
Beiträge: 4887
|
Zitat :
BlackLight hat am 6 Jan 2022 16:08 geschrieben :
|
Bin leider jetzt erst zum Antworten gekommen.
Zitat : Murray hat am 6 Jan 2022 12:42 geschrieben :
| Also aus HEX 58 soll DEC 58 werden. | 0x58 -> 88(10), richtig?
|
Nein.
Der Dezimalausdruck soll gleich dem Hex-Wert sein.
Also aus HEX 58 ein HEX 3A (58) machen.
Funktioniert aber mit dem von roger34 sehr gut.
Habe das jetzt auch für den Rest der Werte angewand.
Ein paar waren auch Dezimal.
Hatte auch keine Beschreibung zu dem Datenaufbau, alles so nach und nach rausbekommen.
Als nächstes jetzt die Werte in die Datenbank.
Lange nicht mehr programmiert, macht Spass wenn es dann funktioniert. Da vergeht die Zeit wie im Flug.
|
BID = 1092387
BlackLight Inventar
Beiträge: 5334
|
Zitat : Murray hat am 6 Jan 2022 21:26 geschrieben :
| Der Dezimalausdruck soll gleich dem Hex-Wert sein.
Also aus HEX 58 ein HEX 3A (58) machen. |
Ok, also doch sowas wie BCD-Code. Interessant, dass das heute immer noch zum Einsatz kommt. Danke für die Antwort!
|
BID = 1092391
Murray Inventar
Beiträge: 4887
|
Das Gerät (WMZ Sensus PolluCom E über M-Bus) ist nicht neu, mindestens 10 Jahre alt. Heute funktioniert doch sowas über Funk etc.
Hätte noch ein Problem mit dem Initialisieren der Hardware-Schnittstelle. Also normal Serial2.
Im Ruhezustand ist die Sendeleitung normal auf High.
Mit dem Einschalten natürlich auf Low, mit dem 1. gesendeten Datenpaket geht die kurz auf High, danach schon das Startbit Low.
Dieser Low-High-Low-Wechsel wird wohl schon als 1. Bit erkannt und somit wird das verfälscht und vom Gerät nie erkannt. Ab dem 2. Paket funktioniert es dann.
Ist natürlich nur ein Schönheitsfehler, schicke ich halt das 1. Paket 2 Mal bzw. als 1. irgendwas.
Nur bekommt man die Leitung vorher schon auf High um dann mit Pause erst das 1. Paket zu senden.
Delay etc. hat darauf keinen Einfluss.
|
BID = 1092392
Jornbyte Moderator
Beiträge: 7190
|
Zitat :
| Mit dem Einschalten natürlich auf Low, mit dem 1. gesendeten Datenpaket geht die kurz auf High, danach schon das Startbit Low.
Dieser Low-High-Low-Wechsel wird wohl schon als 1. Bit erkannt und somit wird das verfälscht und vom Gerät nie erkannt. Ab dem 2. Paket funktioniert es dann. |
Das ist normal und kenne ich seit Jahren. Das erste Paket einfach wegwerfen.
_________________
mfg Jornbyte
Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.
|
BID = 1092395
Jornbyte Moderator
Beiträge: 7190
|
Zitat :
| Also aus HEX 58 ein HEX 3A (58) machen. |
Ist das nun HEX 58 oder HEX 3A?
Oder soll das DEC 58 und HEX 3A sein?
Wer soll das Verstehen....
_________________
mfg Jornbyte
Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.
|
BID = 1092399
Murray Inventar
Beiträge: 4887
|
Also es ist eine HEX 58 am Gerät, er zeigt im Display auch 58 an.
Warum es da so gemacht ist weis ich nicht.
Ah jetzt weis ich was BlackLight meint ....
Vielleicht war da wirklich mal ein Display mit BCD zu 7-Segment-Anzeige dran.
Aber es ist halt nicht nur 58 was ich weitergeben will als Zahl sondern 16880958 (HEX 101953E).
Also das Abbild der 4 HEX-Zahlen bildlich zusammen gesetzt.
[ Diese Nachricht wurde geändert von: Murray am 7 Jan 2022 8:43 ]
|