[SOLUCIONADO] Convertir una String a array

Wenas

Lo que necesito es convertir una cadena de texto y que lo vea como un array.

tengo un array con temperaturas

float Temp_2802f4eb0400008a[]={tempMaxInterior,tempMinInterior};

despues quiero acceder a este array desde una funcion que va componiendo el nombre del array dependiendo del sensor.

Entonces tengo la variable:

String temperaturaMax = "Temp_" + direccionMac + "[0]";

Esto me imprime : Temp_2802f4eb0400008a[0]

Pero si hago por ejemplo un

Serial.print(temperaturaMax);

No me da el valor de array, tan solo imprime el valor

 Temp_2802f4eb0400008a[0]

Un saludo

No entiendo por que usar un String ,si cuando lo estas componiendo ya sabes la posicion que vas a leer ,porque no usarla directamente?

// Si quieres leer la posicion 0 
Serial.println(Temp_2802f4eb0400008a[0]);

o si la posicion depende de la funcion que mencionas :

int posTemp {
  // El codigo con el que calcules que temperatura quieres leer
  int posicion = 0 ;  //Por ejemplo si es la primera posicion
  return posicion ;
}
float Temp_2802f4eb0400008a[]={22.52,24.05};

void setup(){
  Serial.begin(9600);
}
void loop() {
  Serial.print(Temp_2802f4eb0400008a[posTemp()]);
}

Ademas convertir el String a un array de caracteres no te va a servir,vas a obtener el mismo resultado

En realidad confunde el uso de un array da datos con un array a posiciones de memoria que es lo que quiere hacer. En ese caso no puede definirlo como dato float, sino como referencia de memoria.
(Aclaro que no se si lo estoy diciendo correctamente).

Me da la impresión que la idea es tener un array con las posiciones de memoria de las variables que contienen uno u otro dato.

El pretende tener dos variables, o mas.

tempMaxInterior y tempMinInterior. Ubicadas donde el compilador lo determine.

Luego cuando le direcciona el indice[0] y lo envia por el serial espera que referencie a tempMaxInterior que tiene contenido el valor en cadena indicado, sea lo que realmente a enviado.

Veamos si eso es lo que busca o yo he imaginado un escenario que no es?

Ja, ja, ja, Ricardo :grinning: :grinning: :grinning:

Veo que has conseguido el puesto de experto en telepatía del foro. Ahora necesitamos un criptólogo para descifrar el mensaje del telépata. :o :o :o :o :o :o

Igual va a ser mejor que davisss nos dé más pistas de lo que está intentando hacer, porque podemos acabar todos locos :grin: :grin: :grin:

Pero como he dicho en al menos 3 de los ultimos post.. necesitamos 6 a 10 post para poder enterarnos de lo que quiere hacer el autor del hilo, si o no?

Escribí al menos 15 renglones mas pero alguie se iba a ofender asi que los borré.

Tu que dices? Estoy o no en lo cierto?

Claro que estás en lo cierto. Por eso precisamente lo pongo; porque somos incorregibles. A pesar de todo en cuanto vemos una pregunta que parece que tiene jugo (aunque sea ininteligible), ponemos más interés en contestar, intentando hacer de criptógrafos, traductores o telépatas que el que pone el propio interesado en aclarar la pregunta.
En este caso, dado que davisss parece tener cierto rodaje en el foro, confío en que cuando pueda se dejará ver de nuevo por aquí y sabrá aclararnos lo que intenta hacer; porque en esta ocasión no es que él esté dando respuestas vagas (somos nosotros los que estamos alargando el hilo), simplemente aún no ha contestado.
Así que paciencia y a esperar :wink:

Gracias por ayudarme!

Tal vez lo estoy complicando demasiado, pero lo que quiero es :

Tengo varias sondas DS18B20 conectadas y necesito que actúen en dos ocasiones:

A - temperatura maxima
B- temperatura minima

Identifico a las sondas por su direccion fisica :

DeviceAddress sensor01 = {0x28, 0x02, 0xF4, 0xEB, 0x04, 0x00, 0x00, 0x8A};  //Sensor Interior 
DeviceAddress sensor02 = {0x28, 0xDD, 0x17, 0xEC, 0x04, 0x00, 0x00, 0x78};  //Sensor Exterior

No utilizo el comando setLowAlarmTemp() porque solo trabaja con valores enteros y necesito valores float (30.5).

La idea es crear una función que compruebe los valores de alarma. Que sirva para todas las sondas.

Ahora como lo he querido solucionar :slight_smile:

He creado dos Array, uno por cada sonda, con el nombre de la sonda y "Temp_" delante.

float Temp_2802f4eb0400008a[]={tempMaxInterior,tempMinInterior};
float Temp_28dd17ec04000078[]={tempMaxExterior,tempMinExterior};

Después llamo a la función pasando le una de las sondas.

checkAlarmaTemp(sensor01);

Después creo una función que recoge la dirección física y compone el nombre del array y la posición que tiene la temperatura Max o Min según la alarma.

 void checkAlarmaTemp(DeviceAddress sonda){
  
 
  
  String direccionMac="Temp_"; // Guardamos la direccion mac del sensor
  float temperaturaActual = leerTemperatura(sonda); // Temperatura de la sonda Actual
 
  for (byte i = 0; i < 8; i++){
    
    if (sonda[i] < 16){
      //Serial.print("0");
      direccionMac.concat(String(0,HEX));
    }
    
    direccionMac.concat(String(sonda[i],HEX));
    //Serial.print(sonda[i], HEX);
  }
    
  
  // Comprobamos si la temperatura esta en los niveles establecidos
  
 String temperaturaMax = direccionMac+"[0]";
 String temperaturaMin =  direccionMac+"[1]";
 
 

 //Serial.println(Temp_2802f4eb0400008a[0]);
 Serial.println(sensorActual);
 
 }

Lo que no consigo por mucho que he buscado la opción de la variable String con el nombre del array que creo ("Temp_2802f4eb0400008a[0]"), sea interpretado como un array, dándome el valor de la temperatura max que tengo en la posición [0] del array, Temp_2802f4eb0400008a.

El objetivo es crear una función que sepa de que sonda tiene que comprobar la alarma.

Un saludo.

Bueno. Creo que lo que intentas es una especie de función "eval", con la que construyes una cadena con nombre de una variable o incluso un código y lo ejecutas. En C (y creo que en ningún lenguaje compilado) no es posible. De todas formas, como te dijo jose, tampoco es necesario.
¿Por qué no creas una estructura con todos los datos que quieres agrupar para cada sensor y creas un array de estructuras?

struct datoSensor{
	DeviceAddress direccion;
	float tempMaxInterior;
	float tempMaxExterior;
};

datoSensor sonda[2] = 
{
	{
		{0x28, 0x02, 0xF4, 0xEB, 0x04, 0x00, 0x00, 0x8A},	// sonda[0].dirección
		25.0,												// sonda[0].tempMaxIxterior
		27.0												// sonda[0].tempMaxExterior
	},
	{
		{0x28, 0xDD, 0x17, 0xEC, 0x04, 0x00, 0x00, 0x78},	// sonda[1].dirección
		25.0,												// sonda[1].tempMaxInterior
		27.0												// sonda[1].tempMaxExterior
	}
};

Luego tu función sólo necesitaría recibir el índice (en este caso 0 o 1, porque sólo hay dos elementos) y con ese índice podemos hacer referencia a cualquier parámetro de la estructura.

void checkAlarmaTemp(int indice){
// podemos hacer referencia a dirección, temperatura máxima interior o exterior de ese elemento mediante
// sonda[indice].direccion
// sonda[indice].tempMaxInterior
// sonda[indice].tempMaxExterior
}

noter creo que lo que me expones es una forma muy sencilla y clara, ES PERFECTO!!.

No conocía la posibilidad de crear estas estructuras. Voy a probarlo y os cuento.

Gracias a todos por la ayuda!!

Funciona genial!!!

Muchas gracias

Bueno; entonces ya puedes editar tu primer post y cambiar el título agregándole [SOLUCIONADO].

De paso te anticipo un poco por si quieres ir más allá, en una aproximación a programación orientada a objetos, que una estructura también puede contener funciones que trabajen con sus propios elementos. Podrías entonces, aumentar tu estructura por ejemplo así:

struct datoSensor{
  DeviceAddress direccion;
  float tempMaxInterior;
  float tempMaxExterior;
  bool alarmaInterior() {
      return(termometros.getTempC(direccion)>tempMaxInterior);
  }
  bool alarmaExterior() {
      return(termometros.getTempC(direccion)>tempMaxExterior);
  }
};

Y podrías hacer llamadas a las funciones de la misma forma que a las variables:

datoSensor sonda1;
datoSensor arraySondas[5];
if (sonda1.alarmaInterior()) Serial.print("Alarma en sonda1");
if (arraySondas[x].alarmaExterior()) {
    Serial print("Alarma Exterior en sonda ");
    Serial.print(x);
}

Esa estructura datoSensor "casi" podría llamarse una clase (las clases tienen algunas características a mayores muy interesantes, pero eso es otra historia) y sonda1, o arraySondas podrían llamarse objetos de clase datoSensor.

Wenas

Creo que lo de [solucionado] lo puse ayer cuando escribí el ultimo comentario. lo mirare por si he metido la pata.

Una vez más muchas gracias noter por la explicación, de esta manera que mas simple y limpio el código. lo voy a adaptar.

Gracias Chicos!