[Algoritmo] Mutua esclusione multipla. Non ci riesco...

no, nonpuò andarte perchè disattivando gli interrupt disabiliti anchela seriale, e quindi perdi i dati. In oltre normalmente dentro un iterrup, gli interrupt sono già disattivati: ed ecco il possibile problema! mentre elabori un dati perdi gli altri. Insomma, il tuo interrupt è troopo lungo! smettila di usare receiveEvent e sposta il codice nel loop(), così non hai più problemi. Al massimo in receiveEvent() "risvegli" il chip se necessario

immagino che leggi dati invalidi ogni tanto... o se non succede è solo perchp usi un bad abbastanza veloce o un ciclo abbstanza lento.

inoltre se nella primalettura NON leggi 199, comunque se ci sono 2 byte disponibili li leggi (e quindi immagino leggi cacca)

io farei:

void loop(){
  while ((Wire.available() > 2) { // finchè ci sono almeno 3 byte da leggere
    unsigned char okey = Wire.read();
    if(okey == 199){// il valore è valido, prosegui la la lettura
      myGLCD.setFont(BigFont);
      myGLCD.setColor(VGA_BLUE);
      myGLCD.print("I2C OK", 70, 0);
      code = Wire.read();    /// Codice-numero del contatto
      alarm = Wire.read();   ///  tipo di allarme, se Rosso o Giallo
      checkIfCodeIsBiggerThanActualAlarm(code, alarm);
    }else{
      //not ok, non leggere nulla, il while ricomincia e se ci sono ancora almeno 3 byte disponibili, rifarà il controllo del primo, e via andare finchè non trova come primo byte letto 199 (ed effettua una lettura) o ci sono meno di 3 byte. Sarebbe da segnalare l'errore, se si accumulano c'è troppo disturbo in linea, oppure un chip impazzito/rotto.
    }
  }
}

comunque io ti chiedo gentilemnte uno schema elettrico delle connessioni tra contatti e da contatti e master/slave, chenon ci sto più a capire una bega.

io mi immagino come soluzione efficiace:

UN master, che va in polling sugli slave, a partire da quello che ha priorità 1 fino al 100 (o fino al primo errore: in tal caso segnala l'errore e ricomincia il ciclo, inutile andare oltre. quando finalmente continua il ciclo è perchè l'errore a monte è stato risolto, quindi gli errori successivo è da segnalare. Niente tasto reset!)
il polling va bene tanto il master fa solo quello.

oppure se il master fosse un pc o deve fare altro, o vuoi fare le cose fighette, va bene l'idea che il master riceve l'interrupt, ma essi devono essere di:
ALLARME TIPO x ON SUL PIN y
ALLARME TIPO x ON SUL PIN y FINITO

a questo punto però il master DEVE avere abbastanza ram per contenere una struttura per ogni pin (e con un atmega328 NON ce la fai, un array di 100 int è già rischioso da fare), e alla fine dei conti anzichè fare il ciclo da 1 a errore sugli slavelo fai sull'array, e il tuo loop() che leggerela seriale semplicemente aggiorna l'array; quindi ricevi "l'intterrupt", che DEVE essere veloce, e 1 quindi semplicemente copi il byteletto su un buffer. (in oltre non puoi modificare l'array mentre lo stai eseguendo, crei un disallineamento dei dati che si risolve usando un database e/o query/codice atomico).
Quindi ogni loop leggi tutti i byte arriavi a 3 a 3 e aggiorni l'array di stati, poi scorri l'array stati e segnali il primo allarme che trovi e ricominci. Magari ti salvi il numero dell'ultimo allarme, così se è diverso segnali all'operatore che sì ha riparato un guasto, ma ce ne è già un altro in cascata.