Тупо заменить delay() на таймер на миллисе не выйдет, т.к. они работают на разных принципах. Если делать именно тупо, то можно сделать примерно так. Рядом с переменной timing объявите еще одну
bool stop_micro_flag = false;
А дальше код нужно изменить так
if (command == 'w')
{
Serial.println(timing);
// поднять флаг и запустить таймер
timing = millis();
stop_micro_flag = true;
up();
}
else if (command == 'W')
{
Serial.println(timing);
// поднять флаг и запустить таймер
timing = millis();
stop_micro_flag = true;
up();
}
else if (command == 'u')
{
Serial.println(timing);
// поднять флаг и запустить таймер
timing = millis();
stop_micro_flag = true;
down();
}
else if (command == 'U')
{
Serial.println(timing);
// поднять флаг и запустить таймер
timing = millis();
stop_micro_flag = true;
down();
}
// если флаг поднят и время вышло, запустить stop_micro()
if (stop_micro_flag && ((millis() - timing > 5000)))
{
stop_micro_flag = false;
stop_micro();
}
Т.е. старт таймера с одновременным подъемом флага делать при получении команды, а проверку на запуск stop_micro() выполнять отдельно от блока проверки команд.