Wenn du zeitgesteuerte Abläufe haben willst, ohne den Controller durch delay()'s zu blockieren, schau dir einfach mal das mitgelieferte Beispiel "BlinkWithoutDelay" ganz genau an.
Wenn man das ein bisschen umstrickt, kann man damit prima Timer bauen, die ohne jegliches delay() funktionieren.
Ich packe da regelmässig nen Sekundentick (oder auch kürzer, je nach Intervall, dass ich benötige) rein, den ich dann für alles Mögliche benutzen kann. Damit kann man problemlos auch mehrere unterschiedliche Zeitintervalle realisieren.
Da der Aufruf der Timer-Funktion nur einige Mikrosekunden dauert, merkt man den im normalen Programmablauf gar nicht.