Desconectar esclavo en comunicación I2C

Hola a todos, estoy con un proyecto en el que tengo 2 dispositivos esclavos comunicándose con un maestro por I2C. El programa funciona sin problemas salvo cuando desconecto uno de los esclavos (o ambos), ahí se queda congelado y dejan de funcionar todos. La cuestión es que necesito poder y encender uno de los esclavos y no sé cómo hacerlo.

He simplificado el código para que solo envíe y reciba un array porque el programa completo es innecesariamente largo para ponerlo aquí. Adjunto el código del maestro y uno de los esclavos.

Muchas gracias de antemano.

MAESTRO:

int array[4] = {0, 0, 0, 0}; 
int temporal[4] = {0, 0, 0, 0};  

void setup() {
  Wire.begin();      
  Serial.begin(9600);   
}

void loop() {
  
  if (Wire.requestFrom(11, 4) == 4) { 
    receiveData(temporal);
    array[1] = temporal[1]; 
    array[2] = temporal[2];
  }

  if (Wire.requestFrom(12, 4) == 4) { 
    receiveData(temporal);
    array[3] = temporal[3];
  }

  Serial.print("{");
  Serial.print(array[0]);
  Serial.print("; ");
  Serial.print(array[1]);
  Serial.print("; ");
  Serial.print(array[2]);
  Serial.print("; ");
  Serial.print(array[3]);
  Serial.println("}");

  delay(100);
}

void receiveData(int* receivedArray) {
  int index = 0;
  while (Wire.available() && index < 4) {  
    receivedArray[index] = Wire.read(); 
    index++;
  }
}

ESCLAVO:

#define x 12
#define y 10

int array[4];

#include <Wire.h>

void setup() {
  Serial.begin(9600);
  Wire.begin(11);              
  Wire.onReceive(receiveEvent);
  Wire.onRequest(requestEvent);
  pinMode(x, INPUT_PULLUP);
  pinMode(y, INPUT_PULLUP);
}

void loop() {

  delay(50);

  if(digitalRead(x)==LOW){
    while(digitalRead(x)==LOW){
      delay(10);
    }
    if(array[1]==0){
      array[1]=1;
    }else{array[1]=0;}
  }
  
  if(digitalRead(y)==LOW){
    while(digitalRead(y)==LOW){
      delay(10);
    }
    if(array[2]==0){
      array[2]=1;
    }else{array[2]=0;}
  }

}


void receiveEvent(int dato) { 
} 


void requestEvent() {  
  for(int z=0; z<4; z++){
    Wire.write(array[z]);   
  }  
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.