Comunicação de byte, int, long, double em I2C entre Arduinos – Código teste para o Arduino master

Programa exemplo para a domunicação de datos do tipo byte, int, long, double em I2C entre Arduinos

Este é o código para o programa de teste no Arduino master.

i2c_master_mod3_v1

#define serialSpeed 115200
#include <Wire.h>
byte i2cSlave[1] = {8};// slaves i2c address

// I2C byte conversion
union u_tag {
byte b[4];
int i[2];
double d;
long l;
};
union u_tag i2c_data[1][16];

void setup() {
Serial.begin(serialSpeed); // start serial for output
while (!Serial);
Wire.begin(); // join i2c bus (address optional for master)
Wire.setClock(400000); // 400kHz clock. Comment if having compilation difficulties
}

void loop() {
static int i = 0; 

Wire.beginTransmission(i2cSlave[0]); 
Wire.write(0); // cmd
Wire.write(90); // cmd
Wire.write((byte*)&i, 2);
Wire.endTransmission();

i++;

getSlavesUpdate();

Serial.print(i2c_data[0][0].b[0]); Serial.print("\t");
Serial.print(i2c_data[0][0].b[1]); Serial.print("\t");
Serial.print(i2c_data[0][0].b[2]); Serial.print("\t");
Serial.print(i2c_data[0][0].b[3]); Serial.print("\t");

Serial.print(i2c_data[0][1].b[0]); Serial.print("\t");
Serial.print(i2c_data[0][1].b[1]); Serial.print("\t");
Serial.print(i2c_data[0][1].b[2]); Serial.print("\t");
Serial.print(i2c_data[0][1].b[3]); Serial.print("\t");

Serial.print(i2c_data[0][2].d); Serial.print("\t");
Serial.print(i2c_data[0][3].d); Serial.print("\t");
Serial.print(i2c_data[0][4].l); Serial.print("\t");
Serial.print(i2c_data[0][5].l); Serial.print("\t");
Serial.print(i2c_data[0][6].i[0]); Serial.print("\t");
Serial.print(i2c_data[0][6].i[1]); Serial.print("\t");
Serial.print(i2c_data[0][7].i[0]); Serial.print("\t");
Serial.print(i2c_data[0][7].i[1]); Serial.print("\t");
Serial.println("\t");

delay(10);

}

void getSlavesUpdate() {
// global union u_tag i2c_data[][];
byte i2c_byte[32];
int i;

// master reader (first loop data request)
for(i=0; i < 32; i++) {
i2c_byte[i] = 0;
}
i = 0;
Wire.requestFrom((int)i2cSlave[0], 32); // request 6 bytes from slave device #8
while (Wire.available()) { // slave may send less than requested
char c = Wire.read(); // receive a byte as character
i2c_byte[i] = c;
i++;
} 
for(i=0; i < 8; i++) {
i2c_data[0][i].b[0] = i2c_byte[i*4 + 0];
i2c_data[0][i].b[1] = i2c_byte[i*4 + 1];
i2c_data[0][i].b[2] = i2c_byte[i*4 + 2];
i2c_data[0][i].b[3] = i2c_byte[i*4 + 3];
}
}

O programa para usar no slave disponivel no seguinte link:

Comunicação de byte, int, long, double em I2C entre Arduinos – Código teste para o Arduino slave