Problema cambiando de float a *char? [SOLUCIONADO]

Hola que tal amigos del foro, ya se que hay que googlear y a pesar de que lo he hecho, no me sale esta cosa.

Resumen de cuentas:
Tengo un sensor de temperatura conectado a un ESP8366 que envia datos a internet, adicionalmente quiero que me mande un correo a gmail mediante IFTTT, hasta aqui todo bien , el problema?

La libreria IFTTT que estoy usando me pide para enviar el dato de temperatura que este vaya en formato *char.

Esta es la libreria.

Aqui es donde esta el "problema":

When you want to trigger the webhook, call the trigger method with zero to three char* to be passed as values:
(Cuando tu quieras pasar el gatillo de webhok, pasando de 0 a 3 valores *char.

webhook.trigger(); //esto envia solo el correo
webhook.trigger("value1"); //esto envia el correo con un value1, etc
webhook.trigger("value1", "value2");
webhook.trigger("value1", "value2", "value3");

cosas que ya hice:

1.- Intente mandar el float directamente (jejeje que no funciono)
2- Intente convertir a char el float y eviar solo el char (no funciono)
3.- Intente convertir enviar un *char, pero no se activa el gatillo.

COSAS QUE SE:
Se que es un float,
Entiendo que char es un tipo de datos
entiendo que char* es la direccion de un tipo de datos, del mismo tipo.

Con eso en mente me dispuse a hacer un pequeño programa para ver si podía entender esto:

float temperature_float = 23.15; 
char *direc_data=""; 
char data[8] = ""; 


void setup() {

 Serial.begin(9600); 
delay(1000); 

Serial.println("valores al incio de programa"); 
Serial.print("Float  "); Serial.println(temperature_float); 
Serial.print("Direc* "); Serial.println((unsigned int)( &direc_data));    
Serial.print("Char   "); Serial.println((unsigned int)(data));     

dtostrf(temperature_float, 6, 2, data); 

Serial.println("valores al final  de programa"); 
Serial.print("Float  "); Serial.println(temperature_float); 
Serial.print("Direc* "); Serial.println((unsigned int)( &direc_data));     
Serial.print("Char   "); Serial.println(data);     
Serial.print("Char*  "); Serial.println(*direc_data);     

//Serial.println("borra char"); 
/*
char* dtostrf(float number, int tamanyo, int decimales, char* buffer);
/*                    |         |             |               \_ buffer donde almacenaremos la cadena
                      |         |             \_ Precisión (nº decimales)
                      |         \_Tamaño del número en carácteres
                      \_ Número a convertir
*/


}

void loop() {
  // put your main code here, to run repeatedly:
}

El programa se compila, corre y todo, esta es la salida en el serial;

valores al incio de programa
Float  23.15
Direc* 512
Char   640
valores al final  de programa
Float  23.15
Direc* 512
Char    23.15
Char*

Ahora bien, hasta donde puedo decir, el programa si convierte el float en un char.
Podemos ver la dirección de este char en la memoria, pero por alguna razon no imprime
el contenido, o mas bien no graba en memoria el contenido.

Me he dado una vuelta por Esta web, muy clara por cierto y de ahi he sacado parte del codigo.

Pero aca si imprimen el *char asi;

Serial.print("El valor contenido en la direccion de memoria apuntada por el puntero_a: ");
  Serial.println(*puntero_a); //imprime el valor que hay en la dirección contenida en el puntero

Que parte de esto estoy haciendo mal?

Por su ayuda, desde ya, Gracias!.

-Alex. :confused:

Prueba esto compilado para ESP8266/ESP32

#include <ESP8266WiFi.h>
#include "IFTTTWebhook.h"

#define WIFI_SSID "your SSID here"
#define	WIFI_PASSWORD "your password here"

#define IFTTT_API_KEY "your key here"
#define IFTTT_EVENT_NAME "your event name here"
float temperature = 23.15; 
char str[6];

void setup() {
  Serial.begin(115200);
  Serial.println("RUNNING");
  
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);

  IFTTTWebhook wh(IFTTT_API_KEY, IFTTT_EVENT_NAME);
  wh.trigger();
  wh.trigger("1");
  wh.trigger("1", "2");
  wh.trigger("1", "2", "3");
  sprintf(str, "%f", temperature);
  wh.trigger(str);
}

void loop() {
}

Hola que tal Surbyte, gracias por la ayuda.

Resulta que instale el codigo que me diste, y nada... me manda "%f" al correo.

Creo que tiene que ver con esta definicion, de sprintf:

"Es decir, arduino no es capaz de manejar a través de la función sprintf los números en coma flotante."

Este es el codigo que usaron aca para probar eso:

float i=0;

void setup() {
  Serial.begin(9600);  //Iniciamos la salida serie
  Serial.println("Iniciando ejemplo");
}

void loop() {
  char buffer[20]=" ";
  char* formato="Bucle %5,2f";
  sprintf(buffer, formato, i);
  i+=1.01;
  Serial.println(buffer);
  delay(1000);
}

y De la misma web es donde saque la idea de usar un sprintf y despues un dtfrost... Porque ? ni idea.

Pero sigue sin enviarme el dato.

Aqui dejo la pag, para que le den una ojeada.

En fin, esto sigue sin funcionar y me empiezo a desesperar.
hare un par de pruebas y regreso con los resultados.

Si tienes otra idea, de verdad que me ayudaras mucho, a mi se me estan acabando.

-Alex.

Bueno, si que me entro la cursidad he intente enviar por el trigguer lo siguiente:

float T = 23.15; 
  char str[8] = ""; 
char data[8] ="23.15"; 


IFTTTWebhook wh(IFTTT_API_KEY, IFTTT_EVENT_NAME);
   wh.trigger("2");
   delay(1000); 
   wh.trigger(data);

Mi salida x puerto serie es:
....................
WiFi connected
float =23.15
char =23.15

Por lo que pruebo tres cosas:
1.-la placa se conecta a internet
2.- el float es correcto
3.- la cadena char contiene el mismo dato

Recibo dos correos:

Al recibir los correos recibo uno que dice:

Temperatura Actual de: "2"°C etc etc // todo lo que esta entre comillas es lo que enviamos.

El segundo dice:

Temperatura Actual de: "data"°C.

Lo que me da idea, de por que manda un *char.
creo que al ponerlo entre comillas se trata como un texto, por lo que necesaria y explicitamente necesita uno enviar la dirección de memoria donde se contiene todo.

Por que no puedo imprimir esto en mi codigo?
-Ni idea.

Seguire intentando.

-Alex.

Bueno y nada que se deja esto....

Si pongo en mi codigo:

char data[8]="18.15";

//Y lo envio llamando el metodo: 

wh.trigger(data);

Me llega mi correo de lo mas feliz, sin problemas, Peeeeeeeero
si me ocurre querer enviar un dato convertido:

float T = 18.25; 
char buffn[9]="";           //Cadena donde almacenaremos el número convertido


void setup() {
  Serial.begin(115200);
  Serial.println("RUNNING");
  
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  
  while (WiFi.status() != WL_CONNECTED) //print on display 
        {
          delay(500);
          Serial.print(".");
        }
        
  Serial.println("");
  Serial.println("WiFi connected");
  
  
  dtostrf(T,6,2,buffn);       //Llamada a la función
  
 
  
  //Serial.println(buffn);
  delay(1000);

  
Serial.print("float ="); Serial.println(T);
Serial.print("char  ="); Serial.println(buffn); 

  IFTTTWebhook wh(IFTTT_API_KEY, IFTTT_EVENT_NAME);

   delay(1000); 
   wh.trigger(buffn);
  
   
  //wh.trigger("1", "", "3");
}

void loop() {
}

Mi salida a serial , me dice que todo esta bien:

......
WiFi connected
float =18.25
char = 18.25

Pero no me llega ningún correo.

bueno, por le dia de hoy, no tengo mas ideas, espero que alguien con mas cabeza que yo me apunte en la dirección adecuada.

Gracias.

-Alex.

Mira si es posible moldear de float a char porque creo que habia un arbol de posibles moldeos, es decir, por ejemplo que no recuerdo si es así, puedes moldear un entero a un char pero no un float a entero o algo así. Prueba a hacer:

(char) temperature_float
char (temperature_float)

Me suena que la sintaxis es la primera pero hace tanto que lo vi que no recuerdo bien. Que sea correcta la solución o no, no lo sé es cosa de probar. Es que desde mi novatez no se me ocurre otra cosa.

Saludos.

A ver olvidé algo importante.
Yo no uso IDE porque justamente se quedó en el tiempo.
Uso Sublime Text + PlatformIO + Deviot.

Esta combinación permite en los ESP8266/32 usar directamente Serial.printf

Si quieres te ayudo a instalarlo pero busca en tutoriales Gepd DEVIOT o simplemente en google y encontrarás como hacerlo.

Hola Surbyte, crees que sea el compilador?

Eso explicaria x q envia un char, pero no un float to char?

Yo te respondo que con la combinación que uso eso que te pasé funciona porque yo lo uso asi.
Justamente hable con un Finlandes que daba una forma de modificar el IDE para justamente agregar la función printf a cualquier arduino cuando uno elige hacerlo ya que agrega mucho código firmware y no todos podrán con el.
Pero no me respondió. Intenté hacerlo funcionar pero no pude. Como cada vez uso menos Arduinos y casi todo es WIFI con ESP no me preocupo. Dejo las preocupaciones para las cosas que necesito.

Bien, pues intentare hacer eso, es muy probable que sea eso, por que el serial dice que funciona.

Gracias, regreso con respuestas a ver que tal nos va!!

Hola, que tal, no queria dejar este hilo pendiente de solucionar.

Primero que nada agradecer a @surbyte por su valiosa ayuda y colaboración.

La solución en concreto es esta:

#include <ESP8266WiFi.h>
#include "IFTTTWebhook.h"

#define WIFI_SSID "your SSID here"
#define WIFI_PASSWORD "your password here"

#define IFTTT_API_KEY "your key here"
#define IFTTT_EVENT_NAME "your event name here"
float temperature = 23.15; 
char str[6];

void setup() {
  Serial.begin(115200);
  Serial.println("RUNNING");
  
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);

  IFTTTWebhook wh(IFTTT_API_KEY, IFTTT_EVENT_NAME);
  wh.trigger();
  wh.trigger("1");
  wh.trigger("1", "2");
  wh.trigger("1", "2", "3");
  sprintf(str, "%f", temperature);
  wh.trigger(str);
}

void loop() {
}

Tal como describie Surbyte.

Algunos detalles que se deben de considerar;

1…- La solución de arriba no es compilable en el IDE de arduino directamente

Las razon; es que creemos que el IDE fue desarrollado con limitantes de memoria propia de los Arduinos,
siendo las generaciones de ESP, mas potentes y con mas recursos en memoria mas abundantes.

Por lo que para obetener estos nuevos “recursos” de c++. Que no es que sean nuevos, es que sencillamente se les removio para la IDE de Arduino.

Se requiere o al menos estamos usando;

Un Editor de texto; Sublime 3
Un adaptador de interfaz : Deviot (En github)
Un lista de placas; Plattaform IO.

La verdad que la instalación no es que sea algo del otro mundo, pero si tiene sus detalles, espero poder ponerme de acuerdo con Surbyte a ver si podemos hacer un video, por que resulta que es bastante mas sencillo.

Bueno, Gracias al foro, si alguien se topa con este problema, ya sabe que hacer.

Saludos.

-Alex.