Опять же, я не знаю, как работает Serial.read()
Может, там буфер есть какой-то 
В любом случае, нажать и отпустить кнопку за 20 мс можно только специально, и в этом случае ты возможно потеряешь 1 градус поворота 
Но, скорее всего, Serial.read() работает не так 
опять же непонятно - как посылаются сигналы с приложения андроида
либо оно сколько то раз в секунду отправляет команду зажатой нопки, либо отправляет только один раз в момент нажимания. вот цветочек его знает

допустим что пока держишь кнопку, оно непрерывно шлет код на блютуз (тыщу раз в секунду допустим).
тогда ардуина будет 50 раз (у ней если дилей стоит 20) в секунду выполнять этот код. тогда если я например повешу на кнопку циклическое включение-выключение лампочки
case 'Z':
if (!digitalRead(2))
{ digitalWrite(2, HIGH); }
else { digitalWrite(2, Low); }
break;
то она будет моргать 50 раз в секунду (пока не отпустишь кнопку, при этом в половине случаев будет отпущено не в тот момент)? надо тогда ввести какой-то таймер, который запретит меняться состоянию лампочки какое-то время.
в связи с этим еще вопрос
допустим вот есть таймер
case 'X':
long timer = 0;
timer = millis();
if (millis() - timer < 1000)
{ digitalWrite(3, HIGH); }
else { digitalWrite(3, Low); }
break;
тут просто загорается и само через секунду тухнет - так вот, пока длится эта секунда (millis() - timer < 1000) - что оно вообще делает? если в это время приходит другой сигнал? или тот же самый?
... и добавил:тут проблема в том, что с обычной кнопкой всё просто - она либо замкнута, либо нет (без учета дребезжания в промежутках). а тут хз как с приложения через блютуз сообщает что кнопка была нажата или отжата и т.д.
... и добавил:а может быть оно вообще например переключает как-то. типа если до блютуза доходит код R, то он там как-то висит, пока не будет отпущена кнопка на приложении, после чего это место (буфер) обнуляется например (или остается там висеть

) пока не придет другая команда