ESP01 et comportement étrange

Bonjour à tous,

J’utilise depuis peu deux esp 01, le but était de transférer une température en wifi et jusqu’à présent aucun souci.

Mais après quelques test je me suis rendu compte de certain comportement étrange.

par exemple les additions et soustraction donne des résultat étonnant.

j’ai donc pensé à faire une simple soustraction dans un programme minimaliste et ma surprise est grande.

quand je fait 100-5 j’obtiens 595. :o

avec des Int ou float c’est pareil, voici un exemple simple que l’ESP01 me calcule de travers:

float test;
float test2;

int test3;
int test4;

void setup() {
Serial.begin(115200);
delay(10000);
  // put your setup code here, to run once:
test=100.00;
Serial.print("Test retTemp");Serial.println(test);
test2=test-5.00;
Serial.print("Test2 retTemp-5");Serial.println(test2);

test3=100;
Serial.print("Test retTemp");Serial.println(test3);
test4=test-5;
Serial.print("Test2 retTemp-5");Serial.println(test4);
}

J’ai également des comportement ingérable avec les opérateurs <> et !=

Auriez vous une idée du problème, faut il flasher quelque chose avant de programmer un esp01 avec la console arduino?

Merci par avance pour votre aide

pas de soucis sur un Wemos R2 avec l’IDE en 1.8.10

Bonjour,

Tu mets un espace après le texte

 Serial.print("Test2 retTemp-5 "); Serial.println(test2);

et tu verras que ça te donne 95.00 et non 595 du à la concaténation du 5 du texte.

Appelle un exorciste !

kamill: Bonjour,

Tu mets un espace après le texte

 Serial.print("Test2 retTemp-5 "); Serial.println(test2);

et tu verras que ça te donne 95.00 et non 595 du à la concaténation du 5 du texte.

LOL :)

(j'avais rajouté un = dans mon test donc pas percuté)

Wow je suis un bon gros boulet, comment j’ai fait pour ne pas le voir… Mille merci, j’espère que c’est une boulette du même genre qui empêche les opérateurs <>et!= de fonctionner :smiley:

Postez le code

firezeus: Wow je suis un bon gros boulet, comment j'ai fait pour ne pas le voir...

Quand on est focalisé sur une idée, quelquefois on ne voit pas l'évidence.

La démarche était bonne: essayer de reproduire le problème avec un programme plus simple pour l’analyser.

Merci pour le soutien.

Alors me revoilà pour la suite et j’espère que c’est aussi bête, car encore une fois je ne vois pas ce qui bloque.

voila la partie qui me déconcerte:

Serial.print("Retour de Temperature avant filtrage: ");Serial.println(retTemp);
Serial.print("Temperature avant filtrage: ");Serial.println(t);

if(essai>=10){Serial.println("connection impossible,mise en veille 30sec");
ESP.deepSleep( 30 * 1000000, WAKE_RF_DISABLED );}
else if(echecCo>=50){Serial.println("Serveur indisponible,mise en veille 60sec");
ESP.deepSleep( 60 * 1000000, WAKE_RF_DISABLED );} 
else if(retTemp != t){Serial.println("valeur transmise fausse,mise en veille 30sec");
ESP.deepSleep( 30 * 1000000, WAKE_RF_DISABLED );}

normalement sur le deuxième else if, si le retour de température(retTemp) est différent de la température(t) envoyé par wifi, je met mon esp en veille.
Mais malheureusement cette ligne s’exécute même quand la température est identique.

un exemple de retour console:

Retour de Temperature avant filtrage: 24.31
Temperature avant filtrage: 24.31
valeur transmise fausse,mise en veille 30sec

Les deux valeurs sont bien à 24.31 et pourtant il me le met en veille.

Merci par avance pour toute votre aide.

Tu compares deux floats, qui peuvent avoir plus de deux chiffres après la virgule, mais que tu affiches avec seulement deux chiffres. Si le premier vaut 24.31001 et le second 24.30999 ils sont différents bien que la console t'affiche qu'ils sont égaux...

Augmente le nombre de chiffres significatifs dans tes print Serial.println(retTemp, 6); Et tu verras peut-être des valeurs différentes

Ensuite dans ton test, compare la valeur absolue de leur différence à un seuil de précision.

1000 Merci c’est exactement ça.Je n’avais pas connaissance de tout ceci.

j’ai trouver comme solution de multiplier par 100 les valeurs et de les passer sur un int.

Il semble que ça marche, même si je ne sais pas si c’est la bonne méthode.

Dans tout les cas merci encore.

hmmmm en fait ça ne vas pas, je pensais qu'un arrondi se ferai automatiquement mais ce n'est pas le cas et la comparaison reste fausse.

Pas aussi systématiquement mais c'est faux 1 fois sur 4.

je cherche une autre solution.

Essaye ceci

float absDiff = abs (t - retTemp) ;
if (absDiff < 0.01) {
... 
}

Merci tu m’a en faite déjà mis sur la voie, j’avais fait ceci:
(retTemp-t>0.01||retTemp-t<-0.01)

Mais je ne connaissait pas abs, merci pour l’info

Ta méthode me plait plus

Si vous faites x100 et mettez le résultat dans un int, il faut que ça rentre. Sur un uno un int c’est 2 octets donc Max 32767 donc en x100 faut pas que la valeur soit >= 328 sinon vous débordez.

Cependant sur un ESP un int c’est 4 octets donc ça monte à plus de 2 milliards (2,147,483,647) - ça laisse de la marge :)

Donc votre approche - si la valeur avant multiplication est inférieure à 21474836, devrait fonctionner

Merci, en fait j'avais eu la présence d’esprit de vérifier pour les int, m'étant déjà fait avoir sur les floats. Ce pendant le x100 ne résout pas tout car il n'y a pas d'arrondi au moment du x100, ce qui crée finalement des erreur, a moins de comparer comme pour le float. Du coup je vais adopter soit ma méthode qui est compact, soit la méthode de Lesept qui est plus élégante et facile a lire.

Et oui ça passai plutôt bien car j'avais juste des températures à transmettre avec deux chiffre après la virgule.

Malgré tout merci car c'est enrichissant de pouvoir obtenir toutes ces informations.

+karma pour tout le monde :)

Si tu veux arrondir il suffit d'ajouter 0.5 avant la conversion en int

int testInt=100*test+0.5

kamill: Si tu veux arrondir il suffit d'ajouter 0.5 avant la conversion en int

int testInt=100*test+0.5

Ha pas bête,merci pour ton astuce.

Notez que ça arrondit à la valeur supérieure au plus proche. Vous pourriez aussi vous contenter d’arrondir à la valeur inférieure...Je ne sais pas trop ce que ça change pour vous en pratique

Non, ça arrondi au plus près.