Forum: Mikrocontroller und Digitale Elektronik Arduino_byte array in int, float oder bool konvertieren


von Max M. (Firma: Herr) (maxtox)


Lesenswert?

Hallo Kollegen,

habe eine neue Herausfordureng...

muss aus einem byte array float int oder bool "machen" und kriege es 
nicht hin :-(

siehe beispielcode hier:
1
#include <SPI.h>
2
#include <Ethernet.h>
3
#include <PubSubClient.h>
4
#include <Wire.h>
5
#include <LCD.h>
6
#include <LiquidCrystal_I2C.h>
7
8
9
// Update these with values suitable for your network.
10
byte mac[]    = {  0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
11
byte server[] = { 192, 168, 111, 97 };
12
byte ip[]     = { 192, 168, 111, 99 };
13
14
15
// Temperature (DS18B20) connected to pin 7
16
//OneWire ds(7);
17
18
19
// MQTT message buffer
20
char message_buff[30];
21
22
// MQTT callback
23
void callback(char* topic, byte* payload, unsigned int length);
24
25
// MQTT PubSub client
26
EthernetClient ethClient;
27
PubSubClient client(server, 1883, callback, ethClient);
28
29
// MQTT callback function
30
void callback(char* topic, byte* payload, unsigned int length) {
31
 
32
!!!!!!hier ist mein problem!!!!!
33
34
int i;
35
  for(i=0; i<length; i++) {
36
    message_buff[i] = payload[i];
37
  }
38
  message_buff[i] = '\0';
39
  if (message_buff[i]==3.2){Serial.println("float");Serial.println(message_buff);}
40
  if (message_buff[i]==true){Serial.println("bool");Serial.println(message_buff);}
41
  String msg = String(message_buff);
42
  Serial.println(message_buff);
43
44
}
45
// Setup
46
void setup() {
47
  // Start the node at the IP address  
48
  Serial.begin(115200);
49
  Ethernet.begin(mac, ip);
50
51
  // Start MQTT client, 
52
  // let the home know the office is up
53
54
  if (client.connect("office")) {
55
    client.publish("/home/status/","office up");
56
57
  }
58
}
59
60
61
// Loop
62
void loop() {
63
  // Start MQTT client
64
  client.loop();
65
  // Read current temperature and 
66
  // publish it to /home/office/temperature/
67
  
68
}
69
70
71
// Temperature reading from DS18B20 module
72
// Code is from OneWire library example

von Max M. (Firma: Herr) (maxtox)


Lesenswert?

habe mal "gehört" es würde mit union gehen... aber nie benutzt :-(

von Daniel A. (daniel-a)


Lesenswert?

Zunächst einmal, ich kenne mich mit dieser Library noch nicht besonders 
gut aus. Zunächst wäre interessant, woher die Daten kommen, die von der 
Funktion "callback" verarbeitet werden. Dann ist es noch nötig zu 
wissen, was für Daten ankommen, ob es Binär oder Text oder irgendein 
bekanntes Protokoll ist.

Mit folgendem Code müsste man schonmal nachsehen können, was Ankommt, 
falls es Textdaten sind:
1
void callback(char* topic, byte* payload, unsigned int length) {
2
  Serial.print("Message arrived [");
3
  Serial.print(topic);
4
  Serial.print("] ");
5
  for (int i = 0; i < length; i++) {
6
    Serial.print((char)payload[i]);
7
  }
8
  Serial.println();
9
}

Und damit, was ankommt, falls es Binärdaten sind:
1
 // ungetestet
2
void callback(char* topic, byte* payload, unsigned int length) {
3
  Serial.print("Message arrived [");
4
  Serial.print(topic);
5
  Serial.print("] ");
6
  static const char hex = "0123456789ABCDEF";
7
  for (int i = 0; i < length; i++) {
8
    Serial.print( hex[ payload[i] >> 4   ]);
9
    Serial.print( hex[ payload[i] &  0xF ]);
10
  }
11
  Serial.println();
12
}

von Max M. (Firma: Herr) (maxtox)


Lesenswert?

ERST EIN mal DANKE!!!!!! und alles gute in diesem Jahr!!!

hier die Ausgabe vim ersten auslese script:
1
Message arrived [system/adapter/node-red/0/memHeapUsed] 12.06
2
Message arrived [system/adapter/node-red/0/uptime] 6971
3
Message arrived [system/adapter/mqtt/0/memHeapUsed] 24.34
4
Message arrived [system/adapter/mqtt/0/uptime] 6891
5
Message arrived [mqtt/0/DOino<>MQTT/0/13/1/0/3] 10
6
Message arrived [system/host/raspIObroker/load] 0.5
7
Message arrived [system/host/raspIObroker/memHeapUsed] 18.6
8
Message arrived [system/host/raspIObroker/uptime] 31422
9
Message arrived [system/adapter/admin/0/memHeapUsed] 19.88
10
Message arrived [system/adapter/admin/0/uptime] 31419
11
Message arrived [mqtt/0/DOino<>MQTT/0/13/1/0/3] 100
12
Message arrived [system/adapter/node-red/0/memHeapUsed] 12.09
13
Message arrived [system/adapter/node-red/0/uptime] 6986
14
Message arrived [system/adapter/mqtt/0/memHeapUsed] 25.19
15
Message arrived [system/adapter/mqtt/0/uptime] 6906
16
Message arrived [system/host/raspIObroker/load] 0.39
17
Message arrived [system/host/raspIObroker/memHeapUsed] 19.74
18
Message arrived [system/host/raspIObroker/uptime] 31437
19
Message arrived [mqtt/0/DOino<>MQTT/0/13/1/0/3] 10
20
Message arrived [system/adapter/admin/0/memHeapUsed] 21.15
21
Message arrived [system/adapter/admin/0/uptime] 31434
22
Message arrived [system/adapter/node-red/0/memHeapUsed] 12.13
23
Message arrived [system/adapter/node-red/0/uptime] 7001
24
Message arrived [system/adapter/mqtt/0/memHeapUsed] 26.01
25
Message arrived [system/adapter/mqtt/0/uptime] 6921
26
Message arrived [mqtt/0/DOino<>MQTT/0/13/1/0/3] 100

von Max M. (Firma: Herr) (maxtox)


Lesenswert?

beim 2ten bringt er Fehlermeldung beim kompilieren:

invalid conversion from 'const char*' to 'char' [-fpermissive]

von Max M. (Firma: Herr) (maxtox)


Lesenswert?

vom server kommen nur zahlen (+ /- , float und int (bool)...

mehr eigentlich auch nicht...

von Max M. (Firma: Herr) (maxtox)


Lesenswert?

ok...

damit

static const char hex[] = "0123456789ABCDEF";

kommt folgendes:
1
Message arrived [system/adapter/node-red/0/uptime] 37333331
2
Message arrived [system/adapter/mqtt/0/memHeapUsed] 32352E3337
3
Message arrived [system/adapter/mqtt/0/uptime] 37323531
4
Message arrived [mqtt/0/DOino<>MQTT/0/13/1/0/3] 3130
5
Message arrived [system/host/raspIObroker/load] 302E3139
6
Message arrived [system/host/raspIObroker/memHeapUsed] 31372E3933
7
Message arrived [system/host/raspIObroker/uptime] 3331373832
8
Message arrived [system/adapter/admin/0/memHeapUsed] 31382E3239
9
Message arrived [system/adapter/admin/0/uptime] 3331373739
10
Message arrived [mqtt/0/DOino<>MQTT/0/13/1/0/3] 313030
11
Message arrived [system/adapter/node-red/0/memHeapUsed] 392E3233
12
Message arrived [system/adapter/node-red/0/uptime] 37333436
13
Message arrived [system/adapter/mqtt/0/memHeapUsed] 32362E3233
14
Message arrived [system/adapter/mqtt/0/uptime] 37323636
15
Message arrived [system/host/raspIObroker/load] 302E3135
16
Message arrived [system/host/raspIObroker/memHeapUsed] 31392E3036
17
Message arrived [system/host/raspIObroker/uptime] 3331373937
18
Message arrived [mqtt/0/DOino<>MQTT/0/13/1/0/3] 3130
19
Message arrived [system/adapter/admin/0/memHeapUsed] 31392E3537
20
Message arrived [system/adapter/admin/0/uptime] 3331373934

von Max M. (Firma: Herr) (maxtox)


Lesenswert?

1ste Augabe:

Message arrived [mqtt/0/DOino<>MQTT/0/13/1/0/3] 100

Binärdaten dazu:

Message arrived [mqtt/0/DOino<>MQTT/0/13/1/0/3] 313030

oder hier negativ (-20.20) als payload

Message arrived [mqtt/0/DOino<>MQTT/0/13/1/0/3] 2D32302E32

: Bearbeitet durch User
von Dieter S. (Gast)


Lesenswert?

Warum schreibst du nicht, dass die Info von hier kommt:

http://forum.arduino.cc/index.php?topic=369152.0

Crossposting wird nicht geduldet, also lass es.

von Max M. (Firma: Herr) (maxtox)


Lesenswert?

hier wurde mitr schon mal geholfen... und dort ist nicht... deswegen 
habe ich hier gepostet... ist doch nicht im gleichen forum...

von Max M. (Firma: Herr) (maxtox)


Lesenswert?

sooo...
erste erfolge :-)
1
void callback(char* topic, byte* payload, unsigned int length) {
2
.
3
.
4
. 
5
int i;
6
  for(i=0; i<length; i++) {
7
    message_buff[i] = payload[i];
8
  }
9
  message_buff[i] = '\0';
10
//in den buffer schreiben
11
  char *test=message_buff;
12
//Pointer setzen Anfangsadresse
13
  double temp = strtod(test,NULL);
14
//"strtod" converts the string "temp" into a double precision number
15
  int tempo = atoi(test);
16
// Array to int
17
  float ftemp = atof(test);
18
// Array to float
19
  Serial.println("BUFF");Serial.println(message_buff);
20
Serial.println("FTEMP");Serial.println(ftemp);
21
Serial.println("sieg3:=");Serial.println(tempo);
22
  
23
 }

ist so ok???

oder geht es auch LEGANTER?

von Max M. (Firma: Herr) (maxtox)


Lesenswert?

Kann jemand zu meinem Problem was sagen? Hat jemand einen Tipp??

von Brain 2.0 (Gast)


Lesenswert?

Max M. schrieb:
> Kann jemand zu meinem Problem was sagen? Hat jemand einen Tipp??

Wie, du hast ein Problem?
Frage doch mal im anderen Forum.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.