Solución:
I2C es realmente una opción poderosa de Arduino, por demasiadas razones; sin embargo, la cantidad de tutoriales disponibles no son muchos y, lamentablemente, son demasiado complicados para la persona promedio.
Después de trabajar en esto durante 2 días, creo que tengo una forma de transferir prácticamente cualquier cosa entre maestro y esclavos y viceversa. Tenga en cuenta que I2C no transfiere flotantes o incluso enteros mayores de 255, hay varias formas de hacerlo y aquí hay un buen tutorial http://www.gammon.com.au/i2c e incluso una biblioteca: http: // forum.arduino.cc/index.php?topic=171682.0
La solución que encontré fue más simple. Básicamente, convertimos cualquier valor, cadena, número, texto, flotante, lo que sea, y lo convertimos en un carácter variable, que se puede transferir a través de I2C. Una vez transferido, puede volver a convertir a un número, aunque en mi caso a continuación, solo quería mostrar los datos del esclavo.
Aquí está el código. Proporciono comentarios sobre diferentes partes para mayor claridad. Espero que esto ayude. funcionó para mí.
//master
#include <Wire.h>
char t[10]={};//empty array where to put the numbers comming from the slave
volatile int Val; // varaible used by the master to sent data to the slave
void setup() {
Wire.begin(); // join i2c bus (address optional for master)
Serial.begin(9600); // start serial for output
}
void loop() {
Wire.requestFrom(8, 3); // request 3 bytes from slave device #8
//gathers data comming from slave
int i=0; //counter for each bite as it arrives
while (Wire.available()) {
t[i] = Wire.read(); // every character that arrives it put in order in the empty array "t"
i=i+1;
}
Serial.println
delay(500); //give some time to relax
// send data to slave. here I am just sending the number 2
Val=2;
Wire.beginTransmission (8);
Wire.write (Val);
Wire.endTransmission ();
}
aquí la otra parte // esclavo
#include <Wire.h>
char t[10]; //empty array where to put the numbers going to the master
volatile int Val; // variable used by the master to sent data to the slave
void setup() {
Wire.begin(8); // Slave id #8
Wire.onRequest(requestEvent); // fucntion to run when asking for data
Wire.onReceive(receiveEvent); // what to do when receiving data
Serial.begin(9600); // serial for displaying data on your screen
}
void loop() {
int aRead = analogRead(A0); //plug a potentiometer or a resistor to pin A0, so you can see data being transfer
float x = aRead/1024.0*5.0; //generate a float number, with this method you can use any time of data pretty much
dtostrf(x, 3, 2, t); //convers the float or integer to a string. (floatVar, minStringWidthIncDecimalPoint, numVarsAfterDecimal, empty array);
Serial.println(Val); // print the character
delay(500);
}
// function: what to do when asked for data
void requestEvent() {
Wire.write
}
// what to do when receiving data from master
void receiveEvent(int howMany)
{Val = Wire.read();}