MQTT String nach Integer wandeln

Hallo,

ich empfange Wetterdaten mittels MQTT-Subscribe. Den empfangenen String möchte ich nach Integer wandeln um die Zahl mit einer 7-Segmentanzeige anzuzeigen. Ich lese die ankommenden Zeichen in ein char Array (msg). Danach möchte ich die einzelnen Werte des Arrays in ein Integer wandeln, aber leider sthet in meiner Integervariable nicht die Zahl sondern der zugehörige Ascii-Wert. Hier die Funktion und die zugehörige Ausgabe:

void callback(char* topic, byte* payload, unsigned int length) {
  char wind[] = "home/aussen/wind";
  char temperature[]= "home/funkbude/temperature";
  char pressure[] = "home/funkbude/pressure";
  char humidity[] = "home/funkbude/humidity";

  char msg[10];

  char s = '0'; 
  
  int gleich = 0;
  int empfangeneZahl = 0;
  int toInteger = 0;

  Serial.println(" ");
  Serial.println(" ");
  
  Serial.print("Nachricht angekommen [");
  Serial.print(topic);
  Serial.println("] ");
  Serial.print("Die Länge der Nachricht ist: ");
  Serial.println(length);
  Serial.println("----------------");

  
  // auf !gleich prüfen weil bei Gleichheit 0 zurückgeliefert wird
  if(!(strcmp(topic, wind)))
  { 
    Serial.println("Wind empfangen!");
  }
  else if (!(strcmp(topic, temperature)))
  {
    Serial.println("Temperatur empfangen!");
    for (int i = 0; i < length; i++)
    {
      msg[i] = payload[i];
    }
    msg[length] = '\0';
    Serial.println(msg);
    //Test fuer einzelne Digits
    for (int i = 0; i < length; i++)
    {
      Serial.print("msg[");
      Serial.print(i);
      Serial.print("] ");
      Serial.println(msg[i]);
      
    }
    Serial.print("Einer: ");
    [b]s = msg[1];[/b]
    [b]empfangeneZahl = int(s);[/b]
    
    Serial.print(empfangeneZahl);
  } 
  else if (!(strcmp(topic, humidity)))
  {
    Serial.println("Luftfeuchtigkeit empfangen!");
  } 
  else if (!(strcmp(topic, pressure)))
  {
    Serial.println("Luftdruck empfangen!");
  } 
  else
  {
    Serial.println("Was anderes empfangen!");
  }
  
/*
  for (int i = 0; i < length; i++) {
    Serial.println((char)payload[i]);  
  }
*/
  for (int i = 0; i < length; i++)
  {
    msg[i] = payload[i];
  }
  msg[length] = '\0';
  
  
  //int laenge = strlen(msg);
  //msg[length+1] = "\0";
  Serial.println("");
  Serial.println("Die Empfangene Message lautet: ");
  Serial.println(msg);
  

  // Switch on the LED if an 1 was received as first character
  if ((char)payload[0] == '1') {
    digitalWrite(BUILTIN_LED, LOW);   // Turn the LED on (Note that LOW is the voltage level
    // but actually the LED is on; this is because
    // it is active low on the ESP-01)
  } else {
    digitalWrite(BUILTIN_LED, HIGH);  // Turn the LED off by making the voltage HIGH
  }

}

Hier die Ausgabe:

16:02:33.034 -> Nachricht angekommen [home/funkbude/temperature]
16:02:33.034 -> Die Länge der Nachricht ist: 5
16:02:33.034 -> ----------------
16:02:33.034 -> Temperatur empfangen!
16:02:33.034 -> 25.93
16:02:33.034 -> msg[0] 2
16:02:33.034 -> msg[1] 5
16:02:33.034 -> msg[2] .
16:02:33.034 -> msg[3] 9
16:02:33.034 -> msg[4] 3
16:02:33.034 -> Einer: 53
16:02:33.034 -> Die Empfangene Message lautet:
16:02:33.034 -> 25.93
16:02:33.034 ->
16:02:33.034 ->
16:02:33.034 -> Nachricht angekommen [home/funkbude/humidity]
16:02:33.034 -> Die Länge der Nachricht ist: 5
16:02:33.034 -> ----------------
16:02:33.034 -> Luftfeuchtigkeit empfangen!
16:02:33.067 ->
16:02:33.067 -> Die Empfangene Message lautet:
16:02:33.067 -> 33.61

Wie man oben sieht zeigt er mir anstatt der '5' (Einer) von den 25.3 °C den Ascii Code von 5 (53) an. Gibt es eine Funktion die mir das direkt umwandelt oder muß ich mir das mit einer 'case' selbst schreiben?

Ich bin für jede Hilfe die mich weiter bringt dankbar!

Vielen Dank schon mal.

Gruß
Roger

Flapsch:
Ich bin für jede Hilfe die mich weiter bringt dankbar!

Siehe atoi().

Gruß

Gregor

Weil es sich um Fließkommazahlen handelt, könnte atof() sinnvoll sein. Allerdings ist das nicht überall verfügbar.

bin zu langsam, habs grad ausprobiert
Uno geht:

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  char msg[10];
  float myfloat=0;
  //simu Datenübernahme
  strcpy(msg, "12.34");
  //Testausgabe
  Serial.println(msg);
  // konvertieren
  myfloat = atof(msg);
  //Testausgabe
  Serial.println(myfloat, 1);  // nur zum Beweis dass das jetzt ein float ist...
}

void loop() {
  // put your main code here, to run repeatedly:

}

17:11:48.510 -> 12.34
17:11:48.510 -> 12.3

Das \0 brauchst Du bei Stringliteralen nicht mit anzugeben:

// Dein Code
strcpy(msg, "12.34\0");
// es genügt
strcpy(msg, "12.34");

Gruß Tommy

Auch wenn es sich nur um marginale Unterschiede handelt, ich habe es auch probiert:

char msg[] = {"25.93"};

void setup()
{
  Serial.begin(115200);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  Serial.println("\nStart");
  Serial.println(msg);
  float s = atof(msg);
  Serial.println(s);
}

void loop() {}
[sup]Start
25.93
25.93
[/sup]

Vielen Dank für eure Beiträge 8)
Ich hatte mich verhaspelt weil ich versucht hatte jeden einzelnen Wert in dem Array umzuwandeln. Also wenn in msg[0] z.B. 2 stand und in msg[1] z.B. 4, hatte ich versucht die 2 nach integer zu wandeln und dann die 4 nach Integer. Das geht so aber nicht. Mit atof habe ich dann den kompletten String umwandeln und so zerpflücken können, dass es jetzt wunderbar funktioniert dank eurer Hilfe (siehe Bild) :grin:

Flapsch:
Vielen Dank für eure Beiträge 8)
Ich hatte mich verhaspelt weil ich versucht hatte jeden einzelnen Wert in dem Array umzuwandeln.

Das geht auch, wenn man '0' vom Zeichen abzieht:

char msg[] = {"25.93"};

void setup()
{
  Serial.begin(115200);
  Serial.println("\nStart");
  Serial.println(msg);
  float s = atof(msg);
  Serial.println(s);
  Serial.println(stringtofloat(msg));
}

float stringtofloat(char * z) {
  float f = 0;
  int s = -1;
  for (byte j = 0; j < 255; j++) {
    if (z[j] == '\0') {
      break;
    } else if (z[j] == '.') {
      s = 0;
    } else {
      f = f * 10 + (z[j] - '0');
      if (s >= 0) s++;
    }
  }
  for (byte j = 0; j < s; j++) {
    f /= 10;
  }
  return f;
}

void loop() {}