Conversion d'un float en char

Fermé
shuffle56 Messages postés 24 Date d'inscription mercredi 20 février 2013 Statut Membre Dernière intervention 29 mars 2013 - Modifié par shuffle56 le 20/02/2013 à 17:20
manumdk Messages postés 2 Date d'inscription samedi 22 février 2014 Statut Membre Dernière intervention 25 février 2014 - 25 févr. 2014 à 22:40
Bonjour,
je rencontre actuellement un problème j'ai télécharger une librairie xPL pour travailler sur Arduino et celui ci met en dur le message en char, maintenant je voudrais l'améliorer en remplacant la valeur en dur par la valeur d'un capteur enregistré en float comment faire modifier ma librairie ou faire une conversion ?


Code arduino

#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>

#include "xPL.h"

xPL xpl;

unsigned long timer = 0;
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,10);
IPAddress broadcast(255,255,255, 255);
EthernetUDP Udp;
const int temperaturePin = 0;

void SendUdPMessage(char *buffer)
{
Udp.beginPacket(broadcast, xpl.udp_port);
Udp.write(buffer);
Udp.endPacket();
}

void setup()
{
Serial.begin(115200);
Ethernet.begin(mac,ip);
Udp.begin(xpl.udp_port);

xpl.SendExternal = &SendUdPMessage;
xpl.SetSource_P(PSTR("xpl"), PSTR("arduino"), PSTR("test"));
}

float getVoltage(int pin)
{
return (analogRead(pin) * 0.004882814);
}

void loop()
{

float voltage, degreesC;
voltage = getVoltage(temperaturePin);
degreesC = (voltage - 0.5) * 100.0;
Serial.print("voltage: ");
Serial.print(voltage);
Serial.print(" deg C: ");
Serial.println(degreesC);
delay(1000);

xpl.Process();

if ((millis()-timer) >= 10000)
{
xPL_Message msg;

msg.hop = 1;
msg.type = XPL_TRIG;

msg.SetTarget_P(PSTR("*"));
msg.SetSchema_P(PSTR("sensor"), PSTR("basic"));

msg.AddCommand_P(PSTR("device"),PSTR("1"));
msg.AddCommand_P(PSTR("type"),PSTR("temp"));
msg.AddCommand_P(PSTR("current"),PSTR("valeur_float"));
// endroit ou je veux rentrer ma valeur

xpl.SendMessage(&msg);

timer = millis();
}
}

Code .cpp

bool xPL_Message::AddCommand_P(const PROGMEM char* _name, const PROGMEM char* _value)
{
if(!CreateCommand()) return false;

struct_command newcmd;
memcpy_P(newcmd.name, _name, 16);
memcpy_P(newcmd.value, _value, 128);
command[command_count-1] = newcmd;
return true;
}

Code .h



bool AddCommand_P(const PROGMEM char *,const PROGMEM char *);
A voir également:

5 réponses

shuffle56 Messages postés 24 Date d'inscription mercredi 20 février 2013 Statut Membre Dernière intervention 29 mars 2013 3
Modifié par shuffle56 le 21/02/2013 à 10:56
Merci pour votre réponse

J'ai déjà essayé cette possibilité mais au moment ou j'introduis ma variable sans les ""

xPL_Send_Arduino:81: error: initializer fails to determine size of '__c'

Cette erreur est retournée

Code avant:

msg.AddCommand_P(PSTR("current"),PSTR("22"));

Code après:

msg.AddCommand_P(PSTR("current"),PSTR(_value));

J'ai bien crée ma variable _value avant et je suis pas très expérimenté dans le sujet ...
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
21 févr. 2013 à 13:58
mets la commande qui assigne la valeur à _value.
0
mamiemando Messages postés 33622 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 7 avril 2025 7 839
21 févr. 2013 à 20:47
Ta variable value devrait être l'équivalent de ce que j'ai appelé buffer.
0
manumdk Messages postés 2 Date d'inscription samedi 22 février 2014 Statut Membre Dernière intervention 25 février 2014
22 févr. 2014 à 19:32
Bonjour à tous,
J'ai le même problème que Shuffle56, comment l'as tu résolu pour finir ?
Je suis aussi sur du XPL pour envoyer mes relevés de température.

A+
0
mamiemando Messages postés 33622 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 7 avril 2025 7 839
24 févr. 2014 à 21:15
0
manumdk Messages postés 2 Date d'inscription samedi 22 février 2014 Statut Membre Dernière intervention 25 février 2014
25 févr. 2014 à 22:40
Merci pour ta réponse,
J'ai utilisé la fonction itoa() et surtout utilisé la fonction msg.AddCommand(PSTR("current"),PSTR("22"));
au lieu de :
msg.AddCommand_P(PSTR("current"),PSTR("22"));

Les versions des fonctions avec le "_P" permettent de recevoir des chaines stockées en memoire flash (PSTR) ce qui permet de libérer de la ram, merci Olivier.

A ce jour, je bloque sur la réception.
Le parse décode bien la trame xPL mais je n'arrive pas à passer dans le If qui valide le schema-class et le schema-type.
J'ai laissé les valeurs par défauts control.basic, mais rien à faire et le debug avec serial.print est un peu light....


A+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mamiemando Messages postés 33622 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 7 avril 2025 7 839
20 févr. 2013 à 20:06
Si tu veux écrire une valeur float dans une chaîne de caractère (char * ou char[] et non char comme indiqué dans le titre du message) tu peux utiliser sprintf. Dans google ou dans un terminal linux :

man sprintf


Exemple :

#include <stdio.h>

int main() {
    float x = 5.678;
    char buffer[20];
    sprintf(buffer, "%f", x);
    printf("%s\n", buffer);
    return 0;
}


Bonne chance
-1