Saltar al contenido

Enviar y recibir diferentes tipos de datos a través de I2C en Arduino

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();}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *