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

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 slave.

i2c_slave_mod3_v1

#define serialSpeed 115200

// I2C Arduino Slave
#include <Wire.h>
#define I2C_NODE_ADDRESS 8

union u_tag {
byte b[4];
int i[2];
long l;
double d;
} i2c_data[3];

unsigned long loopTimeStart;

void setup() {
Serial.begin(serialSpeed);
//while (!Serial);
// I2C Arduino Slave
Wire.begin(I2C_NODE_ADDRESS); // join i2c bus with address
Wire.onReceive(receiveEvent); // register event
Wire.onRequest(requestEvent); // register event 
loopTimeStart = millis();

}

void loop() {
Serial.print(i2c_data[0].b[0]); Serial.print("\t");
Serial.print(i2c_data[0].b[1]); Serial.print("\t");
Serial.print(i2c_data[0].i[1]); Serial.print("\t");
Serial.println("");
delay(10);
}

// function that executes whenever data is requested by master
// this function is registered as an event, see setup()
// respond with message of N bytesas expected by master
// I2C limit write to 32 bytes
void requestEvent() {
byte b0 = 0, b1 = 1, b2 = 2, b3 = 3;
int i0 = 1000, i1 = -1000;
double d0 = 12.5, d1 = -0.5;
long l0 = 20000, l1 = -20000;
// send
Wire.write((byte*)&b0, 1);
Wire.write((byte*)&b1, 1);
Wire.write((byte*)&b2, 1);
Wire.write((byte*)&b3, 1);

Wire.write((byte*)&b3, 1);
Wire.write((byte*)&b2, 1);
Wire.write((byte*)&b1, 1);
Wire.write((byte*)&b0, 1);

Wire.write((byte*)&d0, 4); 
Wire.write((byte*)&d1, 4);
Wire.write((byte*)&l0, 4);
Wire.write((byte*)&l1, 4);

Wire.write((byte*)&i0, 2);
Wire.write((byte*)&i1, 2);
Wire.write((byte*)&i1, 2);
Wire.write((byte*)&i2c_data[0].i[1], 2);
}


// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(int howMany) {
/*
byte i2c_byte[32];
int i = 0;
// fill i2c_byte buffer
while (Wire.available()) { // slave may send less than requested
char c = Wire.read(); // receive a byte as character
i2c_byte[i] = c;
//Serial.print(c);
i++;
}
//Serial.println("");
Serial.print(i2c_byte[0]); Serial.println("\t");
Serial.print(i2c_byte[0]);
*/

byte i2c_byte[32];
int i = 0;
// fill i2c_byte buffer
while (Wire.available()) { // slave may send less than requested
char c = Wire.read(); // receive a byte as character
i2c_byte[i] = c; 
i++;
}
// set i2c_data array
for(i=0; i < 3; i++) {
i2c_data[i].b[0] = i2c_byte[i*4 + 0];
i2c_data[i].b[1] = i2c_byte[i*4 + 1];
i2c_data[i].b[2] = i2c_byte[i*4 + 2];
i2c_data[i].b[3] = i2c_byte[i*4 + 3];
}
}

O programa para usar no master disponivel no seguinte link:

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