Go Down

Topic: Multiples lecturas I2C Arduino (Read 1 time) previous topic - next topic

dj_xarlys

Buenas.

Ante nada me presento. Llevo bastante tiempo leyendo pero nunca he tenido que participar, puesto que muchas de mis dudas se han visto resueltas en la web, pero en este caso no es así.
Llevo tiempo con arduino, aproximadamente año y medio y ahora estoy empezando a hacer cosas "mas serias".

En concreto el problema es el siguiente:

Dispongo de dos arduinos, uno como maestro y otro esclavo, el cual tiene conectados 3 sensores.
Necesito leer los tres sensores y almacenarlos en 3 variables del maestro.
Lectura del maestro:
Code: [Select]

  Wire.requestFrom(0x44,2);
while(Wire.available())

  temp = Wire.read();
  temp2 = Wire.read();
  }


Con este código en las dos variables me inserta la misma lectura.

El código del esclavo es este:
Code: [Select]

void enviaDatos()

  Wire.write(temperaturaC);
  delay(200);
  Wire.write(sensor2);
  delay(200); 
}


¿Alguien sabría como enviar y recibir multiples datos?


Un saludo y gracias de antemano.

American2020

Hola, no soy experto, pero he visto en algunos videos que hacen algo así

Primero envía los datos así:

  Wire.write(temperaturaC);
  Wire.write("-");
  Wire.write(sensor2);
  Wire.write(".");
  delay(500); 

Y para leerla...

  data = Wire.readStringUntil('.'); //Esto no se si funciona, en este ejemplo usaban port (Sino obvialo este paso y el siguiente
  data = data.substring(0, data.length() - 1); //Esto sería para borrarle ese punto final, si igual te lee hasta ahí, no envías el punto y listo :)
 
Si no usas lo de arriba, iria simplemente esto

data = Wire.read();

  // Buscamos dónde está el -
  index = data.indexOf("-"); //Esto nos da la posición del -
  // buscamos temperaturaC
  temperaturaC = data.substring(0, index); //Nos quedamos con los datos desde el inicio hasta el guion
  // buscamos sensor2
  sensor2 = data.substring(index+1, data.length()); //Nos salteamos el guión y leemos hasta el final

PD: No tengo como probarlo, confirmame si te sirvió o al menos si orienté hacia alguna solución :P

PD: Aunque si sabes ingles (y sino también), te invito a que veas el canal de este Genio, hace cosas muy buenas y muy bien explicadas.
En este video video ví el código que te comento, quizás en otros hace lo que buscas más específicamente.

http://www.youtube.com/watch?v=GJX0BRUagCg


My 3x3x3 Led Cube

[url=http://arduino.cc/forum/index.php/topic,1642

jray

Hazlo así, a ver si funciona

Code: [Select]
Wire.requestFrom(0x44,2);
while(!Wire.available())
{  
 //No hace nada, espera dato
}
 temp = Wire.read();
 temp2 = Wire.read();
 .......

Vaque

Buenas.

Siendo novato pienso que en la rutina   Wire.onRequest(enviaDatos); deberías concatenar en un array los dos datos (temperaturaC y sensor2) para solo hacer una llamada a la funcion Wire.write del tipo Wire.write(array,2); luego con el maestro ya juegas con el dato.

Si pruebas a envíar 3 bytes con Wire.write y te funciona házmelo saber ;)

Un saludo.

dj_xarlys


Hazlo así, a ver si funciona

Code: [Select]
Wire.requestFrom(0x44,2);
while(!Wire.available())
{  
 //No hace nada, espera dato
}
 temp = Wire.read();
 temp2 = Wire.read();
 .......



Pues no funciona.
Al final lo he solucionado enviando un dato "detonador" y almacenando la respuesta de la siguiente forma:

Code: [Select]

Wire.beginTransmission(dirección);
Wire.write('dato');
recibeDatos(); // recibe los datos
  Wire.endTransmission(dirección);


void recibeDatos()
{
   Wire.requestFrom(dirección,bytes);
while(Wire.available())

dato = Wire.read();   
  } 
delay(100);
}



Gracias a todos por la ayuda

Go Up