проблема есть на твоем скрине , у тебя на моменте где пропуск зуба , впадина длится дольше выступа и, заметь, это как раз через раз происходит.
в коде в массиве, где задается, зуб или впадина (нули и единицы), сделано 240 значений . Это видимо было сделано для полного цикла работы 4 тактного двс, где за два оборота коленвала весь цикл проходит. то есть имеем дпкв 60 импульсов, на каждом импульсе нужна впадина и выступ, то есть 120 значений , а так как оборота 2 за полный цикл, то поэтому массив имеет 240 значений .
но косяк в вашем скетче я нашел. Он возникает в конце массива, поэтому проблема возникает через раз (потому что один пропуск зубьев проходит в центре тела массива и тут косяк не влияет)
проблема тут . вместо
if (index++ >= wheel_len) {
index = 0;}
надо
index++;
if (index >= wheel_len) {index = 0;}