Conversion d'un float en char

shuffle56 Messages postés 24 Date d'inscription   Statut Membre Dernière intervention   -  
manumdk Messages postés 2 Date d'inscription   Statut Membre Dernière intervention   -
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   Statut Membre Dernière intervention   3
 
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   Statut Contributeur Dernière intervention   1 299
 
mets la commande qui assigne la valeur à _value.
0
mamiemando Messages postés 33774 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
Ta variable value devrait être l'équivalent de ce que j'ai appelé buffer.
0
manumdk Messages postés 2 Date d'inscription   Statut Membre Dernière intervention  
 
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 33774 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
0
manumdk Messages postés 2 Date d'inscription   Statut Membre Dernière intervention  
 
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 33774 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
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