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