Limpiaparabrisas (R.Encoder y Servo) - Problema temporizacion

Hola compañeros. Aprovechando la ayuda del compañero surbyte y el programa de los 16 niveles que he hecho anteriormente, quiero hacer una especie de limpia parabrisas. Consiste en los mismo, pero 16 niveles de velocidad segun la posicion del rotary (De mas lento a mas rapido)
Mi problema es que de los tiempo que coloco es para que se realice el movimiento de 1 grado, pero eso hace que se detenga todo el arduino y si muevo el rotaryEncoder no lee valor ninguno hasta que haya pasado el delay. ¿¿Como puedo solucionar este caso??

#include <Servo.h>

#include <RotaryEncoder.h>

RotaryEncoder encoder(2, 3);

int newPos;
int pos = 0;


Servo myservo;

void setup ()
{  
  Serial.begin (9600);
  myservo.attach (9);
}
void loop ()
{
  
  encoder.tick();

  newPos = encoder.getPosition();
  if (pos != newPos)  
  {
    if (newPos <= -1) 
        encoder.setPosition(0);
    if (newPos >= 17) 
        encoder.setPosition(16);
    if (newPos < 0) 
        newPos = 0;
    if (newPos > 16) 
        newPos = 16;
    Serial.print(newPos);
    Serial.println();
    pos = newPos;
  }
  if(newPos == 1)
  {
     for(int i = 0; i <180;i++)
      {
        myservo.write(i);
        delay(16);
      }
  
      for(int i = 180; i > 0;i--)
      {
        myservo.write(i);
        delay(16);
      }
  }
  if(newPos == 2)
  {
     for(int i = 0; i <180;i++)
      {
        myservo.write(i);
        delay(15);
      }
  
      for(int i = 180; i > 0;i--)
      {
        myservo.write(i);
        delay(15);
      }
  }
  if(newPos == 3)
  {
     for(int i = 0; i <180;i++)
      {
        myservo.write(i);
        delay(14);
      }
  
      for(int i = 180; i > 0;i--)
      {
        myservo.write(i);
        delay(14);
      }
  }
  if(newPos == 4)
  {
     for(int i = 0; i <180;i++)
      {
        myservo.write(i);
        delay(13);
      }
  
      for(int i = 180; i > 0;i--)
      {
        myservo.write(i);
        delay(13);
      }
  }
}

PD: Pongo 4 puesto que como ponga 16 el programa se hace muy extenso. No se si existe un amanera de hacerlo mas corto. Ya probe de mil maneras y esta es la que mas logica veo
Gracias y saludos

La solución es crear una máquiina de estados y usar millis() para la temporización.
Si te dejé helado con la respuesta, en DOCUMENTACION un forero de mucha experiencia en programación esta explicando que es una máquina de estados.
Ya que el lo ha hecho y de una manera brillante, te invito a que vayas y lo consultes.
millis() no es reemplazo directo de delay() no puedes poner una cosa por otra pero si puedes hacer que tu código fluya sin demoras usándolo y cuando se cumplen las condiciones ejecuta el retardo que necesitas.

surbyte:
La solución es crear una máquiina de estados y usar millis() para la temporización.
Si te dejé helado con la respuesta, en DOCUMENTACION un forero de mucha experiencia en programación esta explicando que es una máquina de estados.
Ya que el lo ha hecho y de una manera brillante, te invito a que vayas y lo consultes.
millis() no es reemplazo directo de delay() no puedes poner una cosa por otra pero si puedes hacer que tu código fluya sin demoras usándolo y cuando se cumplen las condiciones ejecuta el retardo que necesitas.

Gracias, nunca oi lo de la maquina de estados, es abastante interesante. Le echare un ojo.Muchas gracias

Mira este tópico donde corrijo a alguien usando algo similar

Presta atención a como cambio los delay por millis() que es tu problema.