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