Multiples lecturas I2C Arduino

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:

  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:

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.

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 :slight_smile:

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 :stuck_out_tongue:

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.

Hazlo así, a ver si funciona

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

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 :wink:

Un saludo.

jray:
Hazlo así, a ver si funciona

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:

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

Yo he querido trabajar lo mismo pero no me sale, quiero recibir los datos de un arduino esclavo que tiene conectado tres sensores. Primero el maestro envia el numero de sensor y dependiendo del número el esclavo debe enviar el valor... pero el maestro simplemente recibe un 3... no se que onda... ayuda!!!
Primero esta el esclavo y luego el maestro

ESCL4.ino (947 Bytes)

MAES4.ino (1.71 KB)