Acionamento de motor usando timers invés de delay.

Olá galera, estou tentando realizar um código que trabalhe em sequencia, tipo, quando eu apertar o botão ele liga o motor 1 por 0,5s depois desliga, então ele aciona o motor 2 por 10s e apos este tempo aciona a ponte h do motor 2 por 10s tb (ele estará em um sentido e será invertido), apos isso desliga motor 2 e aciona a ponte h no motor 1 por 0,5s. Porem o problema que encontrei e tb pelo que andei lendo em alguns fóruns, a função delay não seria uma boa escolha, pois ela dá um pequeno atraso no microcontrolador, e se eu tiver alguma prioridade (exp. interrupção), ele para o delay para atender a prioridade, o certo seria utilizar interrupções com timers (por ser uma das prioridades e tb por ser mais preciso comparando com a função delay). Essa parte de timers eu não tenho muito conhecimento ainda, alguém poderia me dar uma ajuda? Outra dúvida é quando a vida útil da EEPROM, no mesmo fórum que li este assunto relatava que se o delay for muito grande ou executado muitas vezes diariamente, pode acabar escrevendo demais na memoria EEPROM, que tem vida útil de aproximadamente 100000 escritas. A funcao dos timers não amenizariam este problema? Isso é um pouco confuso para mim, peço até desculpas se não entenderem direito, qualquer coisa tento me explicar melhor. Agradeço a compreensão. Boa tarde!

Esse é o código que fiz até agora. Teria tb que implementar uma parada de emergencia, porem acho que não seja possível utilizando delay, pois não consegui interromper o loop.

//Programa : Projeto Arduino
//Autor : Elias A. Farias

//Sentido horário
int horario = 3;
//Sentido anti-horário
int anti = 4;
//Eixo sobe
int sobe = 5;
//Eixo desce
int desce = 6;
//Acionamento por botao
int botao = 2;
//Armazena o valor lido do botao
int leitura1 = 0;

void setup()
{
//Define pinos para o motor como saida
pinMode(horario, OUTPUT);
pinMode(anti, OUTPUT);
pinMode(sobe, OUTPUT);
pinMode(desce, OUTPUT);
//Define pino do botao como entrada
pinMode(botao, INPUT);
}

void motorA(int mode)
{
switch(mode)
{
case 0: //Desliga
digitalWrite(horario, LOW);
digitalWrite(anti, LOW);
break;

case 1: //sentido horario
digitalWrite(horario, HIGH);
digitalWrite(anti, LOW);
break;

case 2: //sentido anti-horario
digitalWrite(horario, LOW);
digitalWrite(anti, HIGH);
break;
}
}

void motorB(int mode)
{
switch(mode)
{
case 0: //Desliga
digitalWrite(sobe, LOW);
digitalWrite(desce, LOW);
break;

case 1: //Sentido horario
digitalWrite(sobe, HIGH);
digitalWrite(desce, LOW);
break;

case 2: //Sentido anti-horario
digitalWrite(sobe, LOW);
digitalWrite(desce, HIGH);
break;
}
}

void loop()
{
//Verifica o acionamento do botao
leitura1 = digitalRead(botao);
if (leitura1 != 0)
{
while(digitalRead(botao) != 0)
{
motorA(1, HIGH);
delay(500);
motorB(1, HIGH);
delay(500);
motorB(0, LOW);
delay(9000);
motorA(0, LOW);
delay(500);
motorA(2, HIGH);
delay(9000);
motorA(0, LOW);
delay(500);
motorB(2, HIGH);
delay(500);
motorB(0, LOW);
break;
}
}
}

Quanto à EEPROM, o teu código não escreve na EEPROM uma única vez... logo é difícil de saber o que aconteceria. O que te disseram está correcto e deves evitar ler e escrever na eeprom se não precisas.

O que tu queres para resolver o teu problema é veres o exemplo blink without delay. Depois precisas de ver uma máquina de estados para realizar a tua sequência, ou em inglês finite state machine.