gestione interrupt

Buongiorno a tutta la board,
stavo cercando di integrare gli interrupt tramite modulo mcp23017, ecco il codice di test, reperito in rete e adattato;

#include <Wire.h>
#include <Adafruit_MCP23017.h>
Adafruit_MCP23017 mcp;
byte ledPin = 0;
byte arduinoIntPin = 23;
volatile boolean awakenByInterrupt = false;
static uint16_t ledState = 0;
byte mcpPinA = 8;
void setup() {
  Serial.begin(115200);
  Serial.println("MCP23007 Interrupt Test");
  pinMode(arduinoIntPin, INPUT);
  mcp.begin(1);      // use default address 0
  mcp.pinMode(ledPin, OUTPUT);
  mcp.pinMode(mcpPinA, INPUT);
  mcp.pullUp(mcpPinA, HIGH);  // turn on a 100K pullup internally
  mcp.setupInterrupts(true, false, LOW);
  mcp.setupInterruptPin(mcpPinA, FALLING);
  mcp.readGPIOAB();
  attachInterrupt(digitalPinToInterrupt(arduinoIntPin), intCallBack, FALLING);
}
// The int handler will just signal that the int has happen
// we will do the work from the main loop.
void intCallBack() {
  awakenByInterrupt = true;
}
void handleInterrupt() {
  uint8_t pin = mcp.getLastInterruptPin();
  uint8_t val = mcp.getLastInterruptPinValue();
  Serial.println("punto5");//----------------------------------test------------------------
  if ( pin == mcpPinA && val == 0) {
    if ( ledState ) {
      mcp.digitalWrite(ledPin, LOW);
    } else {
      mcp.digitalWrite(ledPin, HIGH);
    }
    ledState = ! ledState;

  }
  while ( !mcp.digitalRead(mcpPinA));

  // and clean queued INT signal
  cleanInterrupts();

}
void cleanInterrupts() {
  Serial.println("punto1");//-----------------------------------test------------------------
  delay(50);
  mcp.readGPIOAB();
  awakenByInterrupt = false;
  Serial.println(mcp.readGPIOAB());//------------------------test------------------------

}

void loop() {
  if (awakenByInterrupt) handleInterrupt();
}

funziona bene fino a che non si preme un po piu velocemente il pulsante, a questo punto si blocca, ho inserito dei Serial per vedere dove si fermava è ho notato che quando si blocca il valore letto da Serial.println(mcp.readGPIOAB()); è diverso , come si vede sulla lettura della seriale;

punto5
punto1
1795
punto5
punto1
1792
punto5
punto1
1795
punto5
punto1
1536

avete qualche suggerimento ?
buona domenica a tutti
p.s. il codice è caricato su un ESP32

il modulo mcp23017 in questione è quello integrato di tutti i componenti allego foto.

61RETr-RwPL.SX425.jpg

Perché non provi a togliere la riga 43?
while ( !mcp.digitalRead(mcpPinA));
Anche se non ho un MCP per provare, tu hai impostato un interrupt su FALLING quindi non ti serve restare lì finché il pin è LOW.

Inoltre perché a riga 52 fai una lettura "mcp.readGPIOAB()", che poi ripeti anche nel Serial.println()? Questo non dovrebbe dare problemi, però mi pare inutile.