[Résolue]Convertion float en char

Bonjour,
je viens vers vous car j'ai un problème tout simple :

j'utilise un capteur dth22, je récupère sa valeur avec

float temp = dht.readTemperature();

Je souhaites ensuite l'afficher sur un serveur web (enc28j60 + lib ethercard).

 BufferFiller bfill = ether.tcpOffset();
    bfill.emit_p(PSTR("HTTP/1.0 200 OK\r\n"
      "Content-Type: text/html\r\nPragma: no-cache\r\n\r\n"
      "<html><head><title>WebLed</title></head>"
      "<body>LED Status: $S "
      "<a href=\"/?status=$S\"><input type=\"button\" value=\"$S\"></a>"
      "
temp1 : $S"
      "</body></html>"      
      ), statusLabel, buttonLabel, buttonLabel, temp1);
    ether.httpServerReply(bfill.position());

La se pose le problème du type.

Si je le laisse en float, rien ne s'affiche.
J'ai essayé avec un sprintf, mais j'obtient un "?"

Avec-vous une astuce ?

Merci
(je débute)

char buffer[10];
 sprintf(temp1,"%f",temp);

oupsss erreur au-dessus

char temp1[10];
 sprintf(temp1,"%f",temp);

fdufnews:

char buffer[10];

sprintf(temp1,"%f",temp);

char buffer[10];
 sprintf(buffer,"%f",temp);

Plutôt nan ? :slight_smile:

Merci de l'aide,
la varibale reste vide...

Voici le code complet (j'ai recup un code et modifié)

#include <EtherCard.h>
#include "DHT.h"

static byte mymac[] = {0xDD,0xDD,0xDD,0x00,0x00,0x01};
static byte myip[] = {192,168,0,40};
byte Ethernet::buffer[700];

const int ledPin = 2;
boolean ledStatus;

char* on = "ON";
char* off = "OFF";
char* statusLabel;
char* buttonLabel;
char* temp1;

// DHT
#define DHTPIN 30 
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);



void setup () {
 
  Serial.begin(57600);
  Serial.println("WebLed Demo");
 
  if (!ether.begin(sizeof Ethernet::buffer, mymac, 53))
    Serial.println( "Failed to access Ethernet controller");
 else
   Serial.println("Ethernet controller initialized");
 
  if (!ether.staticSetup(myip))
    Serial.println("Failed to set IP address");

  Serial.println();
  
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  ledStatus = false;
  
  dht.begin();
}
  
void loop() {
 
  word len = ether.packetReceive();
  word pos = ether.packetLoop(len);
  
  if(pos) {
    
    if(strstr((char *)Ethernet::buffer + pos, "GET /?status=ON") != 0) {
      Serial.println("Received ON command");
      ledStatus = true;
    }

    if(strstr((char *)Ethernet::buffer + pos, "GET /?status=OFF") != 0) {
      Serial.println("Received OFF command");
      ledStatus = false;
    }
    
    if(ledStatus) {
      digitalWrite(ledPin, HIGH);
      statusLabel = on;
      buttonLabel = off;
    } else {
      digitalWrite(ledPin, LOW);
      statusLabel = off;
      buttonLabel = on;
    }
    
   float temp = dht.readTemperature();
   
   Serial.print("float :");
   Serial.println(temp);

   Serial.println("------");
   char buffer[10];
   sprintf(temp1,"%f",temp); 
   

  Serial.println(temp1);
    
    BufferFiller bfill = ether.tcpOffset();
    bfill.emit_p(PSTR("HTTP/1.0 200 OK\r\n"
      "Content-Type: text/html\r\nPragma: no-cache\r\n\r\n"
      "<html><head><title>WebLed</title></head>"
      "<body>LED Status: $S "
      "<a href=\"/?status=$S\"><input type=\"button\" value=\"$S\"></a>"
      "
temp1 : $S"
      "</body></html>"      
      ), statusLabel, buttonLabel, buttonLabel, temp1);
    ether.httpServerReply(bfill.position());
  }
}

sur le moniteur, j'obtiens ça :

Received ON command
float :20.30

Received OFF command

Je devrais avoir ma variable temp1 sous les "--------"

Au niveau de sprintf, je l'utilisais mal, je faisais

char temp1[10];
sprintf(temp1,"%f",temp);

A quoi sert le char buffer[10] ?

Que ce soit sur l'I-Web ou sur le moniteur serie, la variable temp1 reste vide :

B@tto:

fdufnews:

char buffer[10];

sprintf(temp1,"%f",temp);

char buffer[10];

sprintf(buffer,"%f",temp);




Plutôt nan ? :)

J'ai testé comme ça, au lieu d'avoir une variable vide, j'ai un "?" (sur moniteur ou page web)

Buffer ne sert à rien puisque tu places ta chaîne dans temp1. J'ai fait une erreur dans mon post précédent
Par contre il faut déclarer une taille pour que la mémoire soit réservée.
char *temp1 ne fait aucune réservation en mémoire ormis la place du pointeur. Pour que du stockage soit créé il faut déclarer char temp1[10] (ou une autre taille suffisante pour placer la valeur)

Ok, j'ai pu voir qur le forum que sans taille definis, il y a un risque de planter le programe...

Bon j'en suis là :

Serial.println(temp);
Serial.println("------");
char temp1[10];
sprintf(temp1,"%f",temp);
Serial.println(temp1);

Avec en résultat de temp1 : ?

Solution trouvée !

char temp1[10];
dtostrf(temp,1,2,temp1);

A priorie, la fonction de conversion de float avec sprintf n'est pas implémenté dans le code arduino.

Bonjour,

Lapetoire:
A priorie, la fonction de conversion de float avec sprintf n'est pas implémenté dans le code arduino.

C'est pas spécifique à Arduino, c'est comme ça de base dans la avr-libc :wink:
http://www.nongnu.org/avr-libc/user-manual/group__avr__stdio.html#gaa3b98c0d17b35642c0f3e4649092b9f1
-> Voir la remarque qui précise d'utiliser l'option -lprintf_flt pour avoir le support des flottant dans printf() et ses dérivés // non recommandé car ça bouffe beaucoup de ressource.