Comunicação de bytes em I2C entre Arduinos – Código teste para o Arduino Master

Comunicação de bytes em I2C entre Arduinos – Código teste para o Arduino Master

Este programa já tem a base de código para processar os tipos byte, int, long e double.

i2c_master_mod_v1

/*
* I2C comunication demo 1
* 
* I2C master 
* 
* Send a byte (0-255) send a byte to slave
* 
*/

#define serialSpeed 115200
#include <Wire.h>

// slaves i2c address
byte i2cSlave[1] = {7};

// 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 byte b = 0;

Wire.beginTransmission(i2cSlave[0]); 
Wire.write(b);
Wire.endTransmission();

b++;

getSlavesUpdate();

Serial.print(i2c_data[0][0].b[0]); Serial.print("\t");
Serial.println("");

delay(20);

}

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], 2); // 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];
}
}

 

Usar no slave o programa no seguinte link:

Comunicação de bytes em I2C entre Arduinos – Código teste para o Arduino Slave