String zerlegen und ich Zahlen umwandeln

Warum wird meine Variable "text" verändert? (von Start zum ende)

strtok() terminiert die Teil-Strings. Also ersetzt den Delimiter durch NULL

Wie kann ich den Inhalt der Variable in eine Zahl mit Nachkommastellen wandeln?

atoi()/atol() ist wie der Name sagt für Integer. Für Floats gibt es atof(). Wieso erwartest du dass das mit Floats geht?

5 Werte konvertieren geht ganz einfach. Man kann strtok() + atof() in eine Zeile schreiben:

char str[] = "10.0;20.5;30.2;50.1;60.8";

void setup()
{
 Serial.begin(9600);

 float value1 = atof(strtok(str, ";"));
 float value2 = atof(strtok(NULL, ";"));
 float value3 = atof(strtok(NULL, ";"));
 float value4 = atof(strtok(NULL, ";"));
 float value5 = atof(strtok(NULL, ";"));

 Serial.println(value1);
 Serial.println(value2);
 Serial.println(value3);
 Serial.println(value4);
 Serial.println(value5);
}

void loop()
{
}

Man kann das auch in einer for-Schleife machen und die Zahlen in einem Array speichern:

char str[] = "10.0;20.5;30.2;50.1;60.8";
float values[5];

void setup()
{
  Serial.begin(9600);

  char* ptr = strtok(str, ";");

  for (byte i = 0; i < sizeof(values) / sizeof(values[0]); i++)
  {
    values[i] = atof(ptr);
    ptr = strtok(NULL, ";");
  }

  for (byte i = 0; i < sizeof(values) / sizeof(values[0]); i++)
    Serial.println(values[i]);
}

void loop()
{
}

Alternativ eine while-Schleife nehmen und abbrechen wenn strtok() NULL zurück gibt. Dann muss man aber noch abfragen dass man nicht über das Array schreibt! Die obige Version passt sowohl wenn der String kürzer (dann steht einfach 0.0 in den übrigen Werten) als auch länger als das Array ist