Именно, когда delta == 2 - все очевидно работает становится неправильно, и лучше не сбивать порог. Если это становится существенно - разбираться почему. Если окислы - бороть окислы.
IMHO фильтрацию можно делать цифровую. 300 мкс по фиг. Если за 300 мкс меняется многократно, выбрать одно состояние. Главное чтобы состояний было много на время типичной четверти. Поллить с разумным фиксированным периодом, но достаточно часто. И простой фильтр на сдвигах.
Как-нибудь так:
if( pin )
filterState += (0xff - filterState) >> 16;
else
filterState -= filterState >> 16;
filteredPin = filterState & 0x80;
Код, разумеется, не оптимизирован.