[solucionado] transformar función a libreria (buscar keyword y pasarlo a int)

Hola estimados, Estuve investigando por hay y si con ciertos códigos que uni y modifique para lograr lo que necesitaba. tomar la cadena que envía el navegador el famoso GET ("123.13.13.1?sensor1=001&sensor2=022&sensor3=303&sensor4=444&sensor5=005&sensor6=006") y que me leyera el valor del key sensorx y me lo devolviera como un int para poder usarlo como set de alguna variable. ahora quiero hacerlo una librería para incluirlo de manera mas fácil la función pero tengo error, al pasarlo a librería, les agradecería una orientación, los códigos son: funcion

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
}
//define largos de variable  "?sensor1=001&sensor2=022&sensor3=303&sensor4=444&sensor5=005&sensor6=006"
int lenVarName = 7; //largo del nombre de la variable, len name of variable ej: "sensor1" len = 7
int lenVarDig = 3; //largo de comando de la variable, len name of command ej: "000" len = 3
//tranforma el substring web a int
int webtoint(String incomingweb,String keyweb){
    int indexvar = incomingweb.indexOf(keyweb); //obtiene el inicio del nombre de la variable
    String comando = incomingweb.substring(indexvar+lenVarName+1,indexvar+lenVarName+lenVarDig+1);//crea el substring para meter a la tranformacion
//    String substring = comando;
    // Crear un array con el largo de la cadena mas un null
    char valueArray[comando.length() + 1];
    // copiar el sub string en el array
    comando.toCharArray(valueArray, sizeof(valueArray));
    // convertir el array en int
   int value = atoi(valueArray);
   //devuelve el valor transformado
   return value; 
}
void loop() {
  // put your main code here, to run repeatedly: 
    char *data ="123.13.13.1?sensor1=001&sensor2=022&sensor3=303&sensor4=444&sensor5=005&sensor6=006";
                                //14      8 10     8
String cadenaserver = data;  //copia informacion del servidor como cadena 
  int web1 = webtoint(cadenaserver , "sensor6");
  Serial.println(web1);
  delay(2000);
}

webtoint.ccp

#include "webtoint.h";
#include "Arduino.h";



//define largos de variable  "?sensor1=001&sensor2=022&sensor3=303&sensor4=444&sensor5=005&sensor6=006"



int lenVarName = 7;//largo del nombre del key a leer
int lenVarDig = 3;//numero de caracteres del numero a transformar


//tranforma el substring web a int


int webtoint(String incomingweb,String keyweb){
  
  
int indexvar = incomingweb.indexOf(keyweb); //obtiene el inicio del nombre de la variable

   
String comando = incomingweb.substring(indexvar+lenVarName+1,indexvar+lenVarName+lenVarDig+1);//crea el substring para meter a la tranformacion
//  
  
String substring = comando;
    // Crear un array con el largo de la cadena mas un null
    

char valueArray[comando.length() + 1];
    // copiar el sub string en el array
  
  
comando.toCharArray(valueArray, sizeof(valueArray));
    // convertir el array en int
  

int value = atoi(valueArray);
   //devuelve el valor transformado

  
return value; 
}

webtoint.h

#ifndef webtoint_h
#define webtoint_h
#include "Arduino.h";
class webtoint
{
    public:
         int webtoint(String incomingweb,String keyweb);
    int lenVarName;
    int lenVarDig;
     private:
           String comando;
           char valueArray;
           int value;
            int _lenVarName;
           int _lenVarDig;
};
#endif

saludos

Ayudaría si copiaras el error que te da, suele tener pistas para localizar el fallo.

No he mirado muy en profundidad tu código, pero creo que los variables como LenVarName y LenVarDiag deberías pasarlas como argumento y no declararlas con un valor fijo en el código de la función ya que la idea es crear una librería que acepete otro tamaños supongo.

Daklon:
Ayudaría si copiaras el error que te da, suele tener pistas para localizar el fallo.

No he mirado muy en profundidad tu código, pero creo que los variables como LenVarName y LenVarDiag deberías pasarlas como argumento y no declararlas con un valor fijo en el código de la función ya que la idea es crear una librería que acepete otro tamaños supongo.

Tal cual los dices Daklon, esos dos parámetros quiero que se pueda definir dentro del Sketch que se use la librería, ya que puede ser distinto para cada usuario.
El error que me devuelve es el siguiente, y el sketch usado es este:

#include<webtoint.h>
int lenVarName = 7; 
int lenVarDig = 3; 
void setup() {


}

void loop() {
  // put your main code here, to run repeatedly:
  // put your main code here, to run repeatedly:
  char* incomingweb = "?sensor1=001&sensor2=022&sensor3=303&sensor4=444&sensor5=005&sensor6=006";
 String cadenaweb = incomingweb; 
int web1 = webtoint (incomingweb,"sensor1");
Serial.println(web1);
delay(2000);
}
sketch_jun13a.ino: In function 'void loop()':
sketch_jun13a:14: error: cannot convert 'webtoint' to 'int' in initialization

vale, el error que te está dando viene a decir algo como que no pude convertir lo que te devuelve webtoint en int al inicializar la variable(aunque no tendría que convertir nada porque esa función devuelve un int... pero bueno, prueba como te digo a ver si sale otro error mas explicativo o simplemente funciona), prueba a declararla primero y luego igualarla al resultado de webtoint.

en cuanto a lo que te decía de las variables, si quieres crear una librería tienes que hacerlo de tal forma que alguien pueda usarla sin tenr que tocar el cpp ni el .h , solo el sketch, las variables las declaras bien en el sketch, pero en el cpp tambien las pones de forma "manual" le pones que uan vale 7 y otra vale 3 pero ¿y si yo quiero usar tu librería con otros valores? para estos casos lo mejor es que le pases esos valores con el constructor como argumentos al cpp para que no haya que estar modificandolo si cambian, no se si me explico

Hola. Creo que estás un poco perdido en este momento con lo que es una clase (va mucho más allá de una función). Bueno; para ir directamente al grano te diré que el constructor de una clase (la función que se llama igual que la propia clase) se declara sin "prefijo" y no te puede devolver un int. Sencillamente se encarga de las tareas a realizar al construir un objeto de esa clase y devolverá un objeto de dicha clase. Por ello dice que no puede convertir un objeto webtoint a int. Saludos.

Estimados,

Muchas gracias por su orientación, la verdad que no se programación, recién estoy aprendiendo un, porque es un tema interesante, leo información de varias paginas, en este caso seguí el tutorial de arduino.cc sobre pasar de una f(x) a librería, pero no entiendo mucho los códigos así que trate de ir adaptándolos pero no me funciono muy bien, de hecho para poder pasar el string obtenido del server a un int para poder setear me llevo bastante :drooling_face:, pero estaba ve no comprendo bien el error leeré sobre las class y veré que podrá ser, de ante mano muchas gracias por su soporte.

saludos.

Las clases tienen que ver con la programación orientada a objetos, noter tiene razón ese fallo se me pasó porque no me gusta programar a objetos y la falta de costumbre juega esas malas pasadas jajajajaja

El caso es que tu programas una clase, esa clase tiene sus variables y sus respectivos métodos, algo así como una especie de struct pero algo más complejo. una vez que tienes la clase creas un objeto de esa clase, una instancia(o todos los que quieras) cada objeto (con los mismos métodos y variables) puede tener valores almacenados en sus variables totalmente diferentes. para crearlos necesitas un constructor, el constructor es un método (podría decirse que metodo equivale a función) con el mismo nombre que la clase que inicializa el objeto, le pone un determinado valor a las variables etc. El constructor no debe devolver ningún valor, si quieres obtener algún del objeto deberás crear un método que lo haga (algo muy parecido a lo que tenías en el constructor)

Hola de nuevo, EduRoman.
Ten en cuenta que una librería no tiene por qué implementar una clase. En tu caso, y dado que lo único que quieres es incluir una función, lo único que tendrías que incluir en la librería, entre los bloques #ifndef #endif, es el prototipo de la función en el archivo.h y la definición de la función en el archivo.cpp.
Lo único que vas a tener es el problema de transferir tus variables lenVarName y lenVarDig para poder utilizarlas en tu sketch. Una opción es, como te han dicho ya, poder enviárselas como parámetros al llamar a la propia función. Puedes, incluso, definir valores por defecto si no le envías dichos parámetros:
int webtoint( String incomingweb, String keyweb, int lenVarName=7, int lenVarDir=3)
Así que si llamas
int web1 = webtoint(cadenaserver , “sensor6”);
lenVarName tomará 7 y lenVarDir 6. Pero si llamas
int web1 = webtoint(cadenaserver , “sensor6”, 8, 5 );
lenVarName valdrá 8 y lenVarDir 5.

Así quedaría la librería sin usar clases:

webtoint.h:

#ifndef web_h
#define web_h
#include <Arduino.h>
int webtoint( String incomingweb, String keyweb, int lenVarName=7, int lenVarDig=3);
#endif

webtoint.cpp:

#include "webtoint.h"

int webtoint( String incomingweb, String keyweb, int lenVarName, int lenVarDig){
      int indexvar = incomingweb.indexOf(keyweb); //obtiene el inicio del nombre de la variable
      String comando = incomingweb.substring(indexvar+lenVarName+1,indexvar+lenVarName+lenVarDig+1);//crea el substring para meter a la tranformacion
      //    String substring = comando;
      // Crear un array con el largo de la cadena mas un null
      char valueArray[comando.length() + 1];
      // copiar el sub string en el array
      comando.toCharArray(valueArray, sizeof(valueArray));
      // convertir el array en int
      int value = atoi(valueArray);
      //devuelve el valor transformado
      return value; 
}

Noter & Daklon, Muchas gracias por su orientación y buena amabilidad antes que nada. buscare mas info acerca sobre class y objetos para entender un poco el tema. con respecto a la formulación de noter, me parece una manera mas sencilla de conseguir externalizar la función, probare a lo que llegue a casa y comento como me fue con esta modificación.

de ante mano muchas gracias.

saludos.

creo que esto de las librerías no es lo mio =(
error de nuevo :frowning:

error

_1webtoint.cpp.o: In function `loop':
Z:\Arduino\arduino-1.5.2/_1webtoint.ino:11: undefined reference to `webtoint(String, String, int, int)'

sketch

#include <webtoint.h>

void setup() {
Serial.begin(9600);
}

void loop() {  
    char *data ="123.13.13.1?sensor1=001&sensor2=022&sensor3=303&sensor4=444&sensor5=005&sensor6=006";
                                //14      8 10     8
String cadenaserver = data;  //copia informacion del servidor como cadena 
    int web1 = webtoint(cadenaserver,"sensor6");
  Serial.println(web1);
  delay(2000);
}

la única modificación a la librería, para ver si era por eso el error fue este, pero en ambos casos daba el mismo error

#ifndef web_h webtoint_h
#define web_h webtoint_h
#include <Arduino.h>
int webtoint( String incomingweb, String keyweb, int lenVarName=7, int lenVarDig=3);
#endif

alguna idea que puede ser. Uso el Arduino 1.5.2 como editor

¿Has puesto la librería en su ruta?
Tiene que estar exactamente en Arduino\libraries\webtoint\webtoint.h
Y junto a él webtoint.cpp.
A mí sí me compiló correctamente.

:blush: cometí un error al nombrar los archivos, le coloque .ccp en ves de cpp =(.
disculpa las molestias, por fin corre sin ni un problema
les agradezco su ayuda y paciencia.

muchas gracias. XD

Encantado de haberte ayudado. Puedes modificar el asunto del hilo y agregar [solucionado] para que pueda servir de ayuda a otros. Saludos

Acá les dejo la librería y adentro de de ella un ejemplo de lo que buscaba y para lo que la quiera.
era buscar un keyword y poder sacar su valor de manera mas automática y fácil
saludos
a todos

webtoint.zip (2.12 KB)