Hola a todos,
Quiero comunicar dos arduinos mediante I2C, en el esclavo tengo conectado un potenciometro, y el maestro cada cierto tiempo solicita la información al esclavo.
Divido el valor del potenciometro en dos de 8bits, y los envio seguidos cuando el maestro lo pide, pero el maestro solo me guarda el ultimo que envio. ¿Como se hace para mandar los dos datos del esclavo al maestro?
Empezé ayer a usar el I2C y he estado mirando pero no encuentro este mismo problema por internet.
Por lo que veo en la Reference de Wire, el .available crea un bucle, por lo que estás asignando siempre a las variables el mismo valor, primero el alto (a las dos) y luego el bajo (por eso sólo te guardaría el bajo) pero en el monitor te tendrían que aparecer los dos repetidos (dos altos, dos bajos)
Quizá una forma de arreglarlo sea con un array[Wire.available()] (no sé si esto funcionaría) o desplazando bits (<<).
Algo asín (asegurate que dato está a 0 o que es del mismo tamaño que el número de bytes que vas a recibir):
while(Wire.available())
{
dato = dato << 8 ;
dato += Wire.read();
}
Serial.println(dato);
Por otro lado, en la parte del esclavo...
Cuando creas dato_bajo en el esclavo, has puesto "*256", por lo siempre le estás dando valor 0.
Tampoco sé si hay problema al enviar dato_* que son int (2bytes), cuando .write sólo coge byte (en determinados casos dice por ahí que los manda en paquetes de byte...)
Example
#include <Wire.h>
void setup()
{
Wire.begin(); // join i2c bus (address optional for master)
Serial.begin(9600); // start serial for output
}
void loop()
{
Wire.requestFrom(2, 6); // request 6 bytes from slave device #2
while(Wire.available()) // slave may send less than requested
{
char c = Wire.read(); // receive a byte as character
Serial.print(c); // print the character
}
delay(500);
}