В АТмегах есть режим работы таймера Input Capture, идеально подходящий под задачу. Правда не знаю, доступен ли он в Ардуинах.
Краткое описание из даташита на АТмегу:
Если вкратце - сажаем входной сигнал на определенную ногу, и таймер будет выдавать нам свое текущее значение каждый раз, когда входной сигнал меняется (вроде можно настроить срабатывание - по фронту, по спаду, по обоим условиям). При этом генерится прерывание.The Timer/Counter incorporates an Input Capture unit that can capture external events and give them a time-stamp indicating time of occurrence. The external signal indicating an event, or multiple events, can be applied via the ICP1 pin or alternatively, via the analog-comparator unit. The time-stamps can then be used to calculate frequency, duty-cycle, and other features of the signal applied. Alternatively the time-stamps can be used for creating a log of the events.
В таймер можно ввести делитель от тактовой частоты ядра, чтобы в него влезал больший временной период (таймеры есть на 8 и 16 бит).
Если немного подумать, можно даже сделать точное измерение временных интервалов длиннее, чем полный период таймера.
В общем, таймеры - вещь весьма гибкая, нужно только не полениться и повтыкать даташит.