Problème sprintf

Bonjour
J’essaie d’utiliser un capteur de température DHT11 et d’afficher les mesures sur un écran LCD. Je désire afficher une chaîne de 16 caractères dans laquelle je place la valeur de température sur le première ligne, et une seconde chaîne pour l’humidité.
J’ai cependant un problème lié au format d’écriture avec sprintf, car il n’affiche pas ce que je veux.
Donc, je teste avec un autre sketch plus simple qui écrit dans la console.
Mais le sprintf ne donne pas non plus ce que je veux.

Voici ce que j’obtiens :

Temperature ?C
Humidite    ?p
Humidity: 20.00 %	Temperature: 21.00 *C 69.80 *F	Heat index: 67.42 *F

Les valeurs de température et d’humidité sont affichées comme des “?” alors que leurs valeurs sont bonnes, comme le montre la 3è ligne.

Le code est attaché, mais voici les instructions d’affichage

char ligne1[16] = "";
char ligne2[16] = "";

...

  float h = dht.readHumidity();
  sprintf(ligne2,"Humidite    %fp",h);  <-- j'ai essayé aussi le format %3.1f mais c'est pareil
  float t = dht.readTemperature();
  sprintf(ligne1,"Temperature %fC",t);

...

  Serial.println(ligne1);
  Serial.println(ligne2);
  Serial.print("Humidity: "); 
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: "); 
  Serial.print(t);
  Serial.print(" *C ");
  Serial.print(f);
  Serial.print(" *F\t");
  Serial.print("Heat index: ");
  Serial.print(hi);
  Serial.println(" *F");

Alors, pourquoi j’obtiens des “?” …?

Précision, j’utilise un nano.

DHT11.ino (2.49 KB)

Bonsoir, sprintf pour des float ne fonctionne pas sous Arduino. Il faut utiliser dtostrf(). @+

Ce choix a été effectué parce que l'ajout du traitement des float gonflait fortement l'empreinte mémoire et que bien souvent en pratique c'est inutile. Par exemple dans votre cas, Votre capteur DHT11 est capable de mesurer des températures de 0 à +50°C avec une précision de +/- 2°C et des taux d'humidité relative de 20 à 80% avec une précision de +/- 5% (donc largement plus de 1% d'humidité relative d'erreur)

Vu la précision pourquoi vous embêtez vous avec des nombre après la virgule, vous n'êtes même pas sûr des unités.

+1 avec J_M_L En supplément les DHTXX ne traitent que des entiers, c'est les bibliothèques d'application qui effectent la division par 10 pour avoir la "vraie" valeur, les guillemets correspondent aux réserves exprimées par J_M_L. Tu peux très bien modifier la bibliothèque (library in englische) et commenter les deux lignes qui divisent la température et l'humidité par 10. Tu aura toujours la possibilité dans ton programme de faire cette division là où elle est réellement nécessaire.

PS : Pavlov a encore de beau jour devant lui : il y a belle lurette que le DHT22 est sorti et il est bien plus précis que la version DHT11, mais il y a encore des personnes pour le conseiller bêtement.

PS 2 : La valeur absolue donnée par un thermomètre n'est jamais juste, sauf à utiliser des instruments de laboratoire. Malgré cela les décimales sont utiles quand on veut comparer deux températures : si les thermomètre ne sont pas capables de donner une valeur absolue juste, ils sont capables de donner une différence de température juste et dans ce cas les décimales sont utiles.

Merci de vos réponses. Le DHT22 est en route, mais ça prend du temps donc je me fais la main avec ce que j'ai... J'étais conscient du peu de précision, c'est pour ça que je voulais faire un format float sans chiffre après la virgule, au début. Ne comprenant pas pourquoi ça ne marchait pas, j'ai simplifié pour tester.

Donc, je dois prendre la partie entière des mesures et l'afficher avec %d ?

Bonjour,

Oui, je te conseille aussi d'arrondir la valeur

 sprintf(ligne1,"Temperature %dC",(int)(t+0.5));

Cool, merci à tous. Je vais faire ça. Ensuite je passerai à la gestion des interruptions pour améliorer la fluidité. A+

Bonjour,

Ok, le "sprintf" ne gère pas les "float" sur Arduino AVR 8bits (je l'apprend). Cela fonctionne sur une DUE ARM 32bits (je le sais). Quelqu'un sait il si ça fonctionne sur les ESP8266 32bits (j'aimerai le savoir)?

Merci.

lesept: Cool, merci à tous. Je vais faire ça. Ensuite je passerai à la gestion des interruptions pour améliorer la fluidité. A+

des interruptions? allons bon...pour quoi faire??

Pour apprendre, pardi ...

Pour apprendre, oui, pour améliorer la fluidité non :slight_smile:

Motif respectable !

Par contre ce qui ne serait pas respectable c'est de mal utiliser les interruptions. Tout le monde te l'a déjà dit et je rajoute une couche : on fait le strict minimum dans une interruption car comme son nom l'indique elle interrompt le programme. Si elle dure trop longtemps tu peux perdre des informations venant d'autres capteurs par exemple.

Dans une interruption on se contente de modifier quelques variables, le moins possible. Donc apprendre a se servir des interruptions consistera essentiellement à apprendre à programmer avec des variables que pour cet usage, pour mieux se comprendre, on affuble du nom de drapeau (ou des flag en englische). Un drapeau n'est rien d'autre qu'une variable minimale, souvent un byte suffit, que l'on gère avec des conditions if, select ou while.

Pour apprendre, oui, pour améliorer la fluidité non :)

C'est un autre sujet, s'il ne fallait faire que du rationnel la vie ne serait pas drôle. On n'est pas sur un projet industriel. L'important et que lesept soit conscient des avantages et des inconvénients des deux solutions. Je pense qu'avec toutes tes mises en gardes de bon sens c'est le cas. AMHA s'il a la volonté d'apprendre autant commencer par un cas simple comme celui-ci. Et s'il est courageux il pourra développer les deux solutions, comparer et conclure que côté fluidité tu as raison mais entre temps il aura appris à se servir des interruptions et les limites de leur utilisation.