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