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
