Comunicação multimaster i2c entre Arduinos – Programa 2

Este é um  programa exemplo da implementação da comunicação i2c entre Arduinos em que ambos são master.

Este é o segundo de 3 programas que exploraram o uso do interface i2c com mais que um Arduino master.

Este exemplo produz muitas mensagens no bus i2c e funciona de forma estavel se nenhum dos Arduinos tiver slaves.

Arduino 1

#include <Wire.h>

#define I2C_NODE_ADDR 0x04
byte receiveArray[32];
byte *arrayPtr = receiveArray;

#define TIMER_INTERVAL 5
unsigned long timerTime;

byte requestCounter = 0;
unsigned long loopTimeStart;

#define I2C_SLAVE_ADDR 0x2

void setup() {
Serial.begin(115200);
Serial.print("initialize..");
Wire.begin(I2C_NODE_ADDR);
Wire.onReceive(dataReceive);
Wire.onRequest(dataRequest);
Serial.println(".");
timerTime = millis() + TIMER_INTERVAL;
}

void loop() {
static byte counter = 0; 
if(millis() > timerTime) {
timerTime = millis() + TIMER_INTERVAL;
Wire.beginTransmission(I2C_SLAVE_ADDR);
Wire.write(I2C_NODE_ADDR);
Wire.write(" Hello ");
Wire.write(I2C_SLAVE_ADDR + 48);
Wire.write(" From ");
Wire.write(I2C_NODE_ADDR + 48);
Wire.write('\0');
Wire.write(" ");
Wire.write(counter + 48);
Wire.endTransmission();
counter++; if(counter == 10) counter = 0;
}
Serial.print(requestCounter); Serial.print("\t");
Serial.print(receiveArray[0]);
int i;
for(i = 1; i < 32; i++) {
Serial.print((char)receiveArray[i]);
}
Serial.print("\t");

Serial.print(millis() - loopTimeStart); Serial.print("\t");
loopTimeStart = millis();

Serial.println("");
}

void dataRequest(){
requestCounter++;
Wire.write(requestCounter);
}

void dataReceive(int byteCount) {
byte *ptr = receiveArray; 
while(Wire.available()) {
byte b = Wire.read();
*ptr = b;
ptr++;
} 
}

Arduino 2

Este é uma versão mais proxima do programa básico, mas que faz variar os dados e envia muito mais mensagens pelo bus i2c.

#include <Wire.h>

#define I2C_SLAVE_ADDR 0x4
#define I2C_NODE_ADDR 0x2

void setup() {
Serial.begin(115200);
Wire.begin(I2C_NODE_ADDR);
Wire.onReceive(onReceiveFunc);
}

void loop() {
static byte counter = 0; 
delay(1);
Wire.beginTransmission(I2C_SLAVE_ADDR);
Wire.write(I2C_NODE_ADDR);
Wire.write(" Hello ");
Wire.write(I2C_SLAVE_ADDR + 48);
Wire.write(" From ");
Wire.write(I2C_NODE_ADDR + 48);
Wire.write('\0');
Wire.write(" ");
Wire.write(counter + 48);
Wire.endTransmission();
counter++; if(counter == 10) counter = 0;
}

void onReceiveFunc(int howMany) {
while (Wire.available() > 0) {
char c = Wire.read();
Serial.print(c);
}
Serial.println();
}