[RESOLU] Faire reconnaitre un float par communication serial

Bonjour l'internet,

J'utilise un arduino nano pour contrôler une pompe en période et durée de fonctionnement. (du blink sans delay qui fonctionne très bien)

Le petit truc en plus: j'ai rajouté une commande en serial pour changer la période et la durée de fonctionnement; à base de serialEvent(), de reconnaissance de String, découpage, puis transformation de substring en Float. Plus explicitement:

void CommandeSerial() {
  float valeur = 0;  
  if (stringComplete) {
    Serial.println(inputString); // print the string when a newline arrives
    int separator;
    separator = inputString.indexOf("=");
    if ( separator > 0) { // recherche un signe egal dans la commande, si oui stocke la valeur
      String valeur_lue;
      valeur_lue = inputString.substring(separator + 1);
      valeur = valeur_lue.toFloat();
    }

   if (inputString.startsWith("dureePompe=")) {
      dureePompe = valeur;
      Serial.print(F("Ok, je vais pomper toutes les "));Serial.print(periodePompe); Serial.print(F("h, pendant ")); Serial.print(dureePompe); Serial.println(F(" s"));
    }
  if (inputString.startsWith("periodePompe=")) {
      periodePompe = valeur;
      Serial.print(F("Ok, je vais pomper toutes les "));Serial.print(periodePompe); Serial.print(F("h, pendant ")); Serial.print(dureePompe); Serial.println(F(" s"));
    }

    // clear the string:
    inputString = "";
    stringComplete = false;
  }/**/
}

void serialEvent() {
  while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read();
    // add it to the inputString:
    inputString += inChar;
    // if the incoming character is a newline, set a flag
    // so the main loop can do something about it:
    if (inChar == '\n') {
      stringComplete = true;
    }
  }
}

Voila comment ça marche: dans le moniteur série, j'écris par exemple periodePompe=5, le code va reconnaitre "periodePompe=", et récuperer en substring le "5" qui suit, le transformer en float, puis l'attribuer à periodePompe.

Et ça marche très bien avec 5, et avec tous les entiers d'ailleurs.

Mais ça ne marche pas avec des nombres décimaux!!!!! :cry: :cry: :cry: :cry: :cry: :cry:
Lorsque je rentre disons 5.2, la periodeCo2 devient 5. Et si je rentre 0.5 c'est l'enfer, periodeCo2=0 et la pompe s'arrête plus, mais ça c'est facile à régler avec une petite condition.

J'ai absolument tout déclaré en float, ce qui est un peu hardcore, long pourrait suffire je crois.

Un conseil, un avis pour m'éclairer? Où est-ce que ça coince?

Merci,

Bonjour,

Le programme semble correct (sous réserve de la déclaration des variables que l'on ne voit pas).

Est ce que l'affichage de la chaine reçue est correct?
Est ce que tu utilise bien un '.' comme séparateur décimal?
Est ce que l'affichage de le valeur décodée est correct?
Tu parles de periodeCo2, mais il n'apparait pas dans ton code.

whooop je me suis emballé, j'ai un autre programme, qui utilise la même fonctions commande serial pour piloter une electrovanne de CO2, avec periodeCO2

-affichage de la chaine reçue: je vérifie

  • "." en séparateur: OK
  • affichage décodé: NOK, les décimales ne passent pas

du coup le fait de parler de periodeCo2 m'a fait penser que dans mon autre programme j'ai inputString.reserve(300); dans void setup(); que je n'ai pas dans celui de la pompe.

Je teste pour voir si ça pourrait être ça!

revérifie que dureePompe et periodePompe sont bien des floats

:slight_smile:

toutes les variables étaient bien float, et le problème a été résolu en ajoutant le inputString.reserve(300); dans void setup().

Je ne sais plus tout à fait sa fonction, je crois que ça définit une taille de buffer, mais en tout cas il était présent dans mon programme avec periodeCo2 qui marche avec les décimales, et absent dans l'autre; depuis que je l'ai ajouté ça marche!!!!

C'est étrange car inputString.reserve() permet juste de préallouer la mémoire pour le String, ce qui optimise le traitement, mais ça ne devrait rien changer.
Enfin, l'essentiel est que ça fonctionne.