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