¿Por qué me sale error al compilar la función de interrupción?

La salida digital se mantiene en el último estado que se le diga. Tu ejemplo nunca la pone a nivel bajo. Sólo la pone a nivel alto. Has la prueba de la interrupción con el siguiente loop(), sin el while:

void loop() {
  digitalWrite(3, boton % 2);
}

Corrigo el código, por despiste puse % 1 cuando lo correcto es % 2