Comunicação - Pergunta e Resposta I2C

Boa tarde a todos.

Estou substituindo o tópico anterior por este, pois assim, evito códigos excessivos e fora do conceito I2C.

Estou querendo comunicar dois (ou mais) arduinos. Algo bem simples, como:
(x = Master; y = Slave)

Quero que o x envie (uma pergunta) ao y sempre que eu pressionar um botão. Até aí os códigos abaixo funcionam.

Só que, logo após o x enviar ao y uma pergunta (considere a pergunta como um int qualquer), quero que o y responda. Esse é o problema que tenho, pois não sei como posso cambiar quem fala e quem ouve e vice-versa.

Dando uma olhada no I2C na página oficial do arduino obtive esses dois códigos (com a inclusão do botão):

Master:

#include <Wire.h>

byte botao = 7;
boolean estadoBotao = 0;
int estadoAnterior;

void setup() {
  pinMode(botao,INPUT);
  digitalWrite(botao,LOW);
  Wire.begin(8); // join i2c bus (address optional for master)
}

byte x = 0;

void loop() {
  estadoBotao = digitalRead(botao);
  if (estadoBotao == HIGH && estadoAnterior == LOW){
    Wire.beginTransmission(8); // transmit to device #8
    Wire.write("x is ");        // sends five bytes
    Wire.write(x);              // sends one byte
    Wire.endTransmission();    // stop transmitting
    x++;
  }
  estadoAnterior = estadoBotao;
}

Slave:

#include <Wire.h>

void setup() {
  Wire.begin(8);                // join i2c bus with address #8
  Wire.onReceive(receiveEvent); // register event
  Serial.begin(9600);           // start serial for output
}

void loop() {
  delay(100);
}

// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(int howMany) {
  while (1 < Wire.available()) { // loop through all but the last
    char c = Wire.read(); // receive byte as a character
    Serial.print(c);         // print the character
  }
  int x = Wire.read();    // receive byte as an integer
  Serial.println(x);         // print the integer
}

Como eu poderia, no slave, responder ao master? Alguém poderia dar uma ajuda?

Grato,

Yago

Isto e o exemplo que pretendes...

https://www.arduino.cc/en/Tutorial/MasterReader

Viu este exemplo? Não é exactamente comunicação entre 2 Arduinos,mas aqui o master espera por receber dados de um dispositivo I2C.

Vi o link do bubulindo e adaptei-o.

Atenção: A adaptação funcionou perfeitamente para mim. Porém, como já devem ter percebido, muitos dos “meus” programas estão aparentemente funcionais, mais com os ingredientes errados, ou seja, pode ser que vocês vejam algo errado, e gostaria que me avisassem.

Mas relembrando, o código funcionou muito bem.

Master:

#include <Wire.h>

byte botao = 7;
boolean estadoBotao = 0;
int estadoAnterior;

void setup() {
  pinMode(botao,INPUT);
  digitalWrite(botao,LOW);
  Wire.begin(8); // join i2c bus (address optional for master)
  Serial.begin(9600);
}

byte x = 0;

void loop() {
  estadoBotao = digitalRead(botao);
  if (estadoBotao == HIGH && estadoAnterior == LOW){
    Wire.beginTransmission(8); // transmit to device #8
    Wire.write(x);              // sends one byte
    Wire.endTransmission();    // stop transmitting
    x++;
    delay(50);
     Wire.requestFrom(8, 2);    // request 2 bytes from slave device #8

  while (Wire.available()) { // slave may send less than requested
    int y = Wire.read();
    if (y == 99){
      Serial.println("Resposta"); // Successful
    }
  }
  }
  estadoAnterior = estadoBotao;
}

Slave:

#include <Wire.h>

void setup() {
  Wire.begin(8);                // join i2c bus with address #8
  Wire.onReceive(receiveEvent); // register event
 
  Serial.begin(9600);           // start serial for output
}

void loop() {
  delay(100);
}

// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(int howMany) {
  while (1 < Wire.available()) { // loop through all but the last
    char c = Wire.read(); // receive byte as a character
    Serial.print(c);         // print the character
  }
  int x = Wire.read();    // receive byte as an integer
  Serial.println(x);         // print the integer

  if (x == 1){
    digitalWrite(13,HIGH);
  }
  if (x == 2){
     Wire.onRequest(requestEvent); // register event
     digitalWrite(13,LOW);
  }
}
void requestEvent() {
      Wire.write(99);
}