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();
}
