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 -
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 *);
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:
- Arduino pstr
- Logiciel gratuit conversion calendrier républicain - Télécharger - Études & Formations
- Coco char - Accueil - Réseaux sociaux
- Conversion mb en mo ✓ - Forum Matériel & Système
- Conversion mb en go ✓ - Forum Mail
- Conversion bytes en mo - Forum Réseau
5 réponses
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 ...
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 ...
Char Snipeur
Messages postés
9813
Date d'inscription
Statut
Contributeur
Dernière intervention
1 299
mets la commande qui assigne la valeur à _value.
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+
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+
As-tu essayé sprintf comme indiqué ici ?
https://forums.commentcamarche.net/forum/affich-27183420-conversion-d-un-float-en-char#1
https://forums.commentcamarche.net/forum/affich-27183420-conversion-d-un-float-en-char#1
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+
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+
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 :
Exemple :
Bonne chance
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