Hola,
De vistazo rápido:
- Las variables que se modifican dentro de una interrupción tienen que estar declaradas como volatile (volatile (computer programming) - Wikipedia).
- Las rutinas que se ejecutan dentro, tienes que intentar que sean lo más pequeñas posibles.
- Podrías usar las dos entradas de interrupción que tiene Arduino (tiene pinta que lo intentaste asi por la linea comentada). Lo digo, porque digitalRead es lento.
- Si esperas tiempos pequeños, puedes usar micros() para tener más precisión.
- Yo cambiaría que velocidad=(float)distancia/(float)tiempo;
- El Serial.println("celula 2"); antes de recoger el tiempo, te está metiendo mucho retraso, ya que se queda esperando hasta que termina de mandar dicha cadena a 9600 bps (8 +2 (CR+LF) bytes a 960 bytes/s). Sólo esa linea antes de recoger tiempo, te mete un error considerable....
Saludos
Igor R.