Comunicação I2C entre Arduinos

Olá, estou tentando fazer 2 Arduino se comunicarem via I2C, o que teoricamente é muito simples usando a lib Wire.h e 4 fios para ligá-los,

porém, não está funcionando nem por decreto, tentei os exemplos da própria lib, tentei exemplos achados em blogs, e nada :(

Alguém tem idéia de alguma causa de problema?

Eu estou usando pull-ups de 22K externos, os GNDs e o VCC estão ligados juntos, os pinos usados são o A4 e o A5 (4 e 5 analógicos) o chip é o ATMEGA168

os Arduinos estão a menos de 10 centímetros de distância, medi continuidade, etc...

Descobri! medi os pinos com um osciloscópio e descobri que o pino 4 estava se comportando de acordo com o led do pino 13… meu Arduino estava coincidentemente com um respingo de solda entre a trilha do pino analógico 4 e o pino 13 (do led) ¬¬

Agora funciona perfeitamente, mas aproveito para deixar outra pergunta,

Esta lib tem confirmação de recebimento da mensagem pelo slave (ou mesmo pelo master se for o caso) ou terei de fazer isso manualmente?

Como seria um código simples (pode ser só a lógica) com confirmação de recebimento de pacote?

Obrigado.

Olá Osias,

Nunca fiz esta comunicação entre dois arduinos, mas gostaria de ver esta sua aplicação. Pode postar o código aqui?

Olá, eu achei um pequeno tutorial no Instructables, com uns alguns videos etc, então apenas adaptei o código para receber um numero via serial, e transmitir de um Arduino ao outro, e este último pisca 3 leds alternadamente de acordo com o numero recebido.

Aqui está,

Master:

#include <Wire.h>

#define LED_PIN 13
byte x = 0;

void setup()
{
  Wire.begin(); // Start I2C Bus as Master
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, LOW);
  Serial.begin(9600);
  Serial.println("start");
}

int incoming;
void loop()
{
  if(Serial.available() >0)
  {
     delay(500); // delay para carregar os bytes no buffer
     x=0; // zera variaveis
     incoming = 0;
     while(Serial.available()) // enquanto houver bytes para ler:
     {
        incoming =(Serial.read() - 0x30); // armazena  o byte lido com seu valor numerico
        x = (x*10) + incoming; // calculo para x receber numero completo digitado
     }
  Serial.println(x, DEC); // imprime x para verificar
  
  Wire.beginTransmission(9); // transmit to device #9
  Wire.send(x);              // sends x 
  Wire.endTransmission();    // stop transmitting
  //x++;
  //if (x > 5) x=0;
  delay(450);
  }
}

Slave:

#include <Wire.h>

#define LED_PIN 13
#define LED_1 12
#define LED_2 11

int x;

void setup() {
  Wire.begin(9);                // Start I2C Bus as a Slave (Device Number 9)
  Wire.onReceive(receiveEvent); // register event
  
  pinMode(LED_PIN, OUTPUT);
  pinMode(LED_1, OUTPUT);
  pinMode(LED_2, OUTPUT);
  
  digitalWrite(LED_PIN, LOW);
  digitalWrite(LED_1, LOW);
  digitalWrite(LED_2, LOW);
  
  x = 0;
}

int j=13;
void loop()
{
 if (x > 0)
 {
   for (int i=0; i<x; i++) // funcao para piscar 3 leds alternadamente, o numero de vezes recebido via i2c
   {
     digitalWrite(j, HIGH);
     delay(200);
     digitalWrite(j, LOW);
     delay(200);
     j--;
     if(j<11) j=13;
   }
   x = 0;
   delay(1000);
 }
 delay(100);
}
  

void receiveEvent(int howMany) // evento
{
  x = Wire.receive();    // receive byte as an integer  
}

Faltou o link hehe

http://www.instructables.com/id/I2C-between-Arduinos/