Usar millis em vez de delay numa função

Boa Noite,
Me ajudem o meu codigo está quase pronto mas queria que ele ativasse alarme sempre que alguem passasse o vermelho dos peões mesmo quando ele pisca o problema é que nao consegui alterar o codigo do piscar para um sem delay logo não consigo ativar alarme devido á pausa fornecida pelo delay, alguem pode ajudar?

codigo:
const int buttonPin = 2; // o numero do pino do botão
const int vermelho = 12; // o numero do pino do LED vermelho
const int amarelo = 11; // numero do pino led amarelo
const int verde = 10; // numero do pino led verde para veiculos
const int vermelho2 = 7; // numero do pino led vermelho para peões
const int verde2 = 6; // numero do pino led verde para peões
const int sensorPin = 3; // numero do pino sensor
const long interval = 3000; // intervalo que permanece o alarme ativado sem qualquer outra intervenção
const int piezo = 5; // numero do pin do piezo
int buttonState = 0; // estado do botão inicial
int sensorState = LOW; // estado do sensor inicial
int ledRedState = LOW;
unsigned long previousTime = 0; //tempo inicial
unsigned char i = 0;
void setup()
{
pinMode(vermelho, OUTPUT); //os leds e o piezo são dispositivos de output
pinMode(amarelo, OUTPUT); //o botão e o sensor são dispositivos de input
pinMode(verde, OUTPUT);
pinMode(vermelho2, OUTPUT);
pinMode(verde2, OUTPUT);
pinMode(buttonPin, INPUT);
pinMode(piezo, OUTPUT);
pinMode(sensorPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(sensorPin), blink, RISING); //interrupt para fazer o alarme ligar sempre que o sensor seja ativado enquanto está vermelho para os peões
}
void loop()
{
digitalWrite(piezo, sensorState); //o alarme funciona consoante o estado do sensor
buttonState = digitalRead(buttonPin); //lê o estado do botão
if (buttonState == HIGH) { //condição para quando o botão está ativo
digitalWrite(verde, LOW); //desliga led verde para os carros
delay(2000); //permanece 2s desligado até o amarelo ligar
digitalWrite(amarelo, HIGH); //liga amarelo
delay(2000); //permanece 2s ligado até o mesmo desligar
digitalWrite(amarelo, LOW); //desliga amarelo
digitalWrite(vermelho, HIGH); //liga vermelho para os carros
delay(2000); //passam-se 2s para o vermelhos para os p~eos ser desativado
digitalWrite(vermelho2, LOW); //desliga o vermelho para os peões
digitalWrite(verde2, HIGH); //liga o verde para os peões
noTone(5); //desliga alarme
delay(10000); //permanece 10s ligado o verde
digitalWrite(verde2, LOW); //desliga verde para peões
piscapisca(); //função para fazer piscar o led vermelho para os peões
digitalWrite(vermelho, LOW); //desliga vermelho para os carros
}
else { // condição para quando o botão está desativado
digitalWrite(vermelho2, HIGH); //liga vermelho para os peões
if(digitalRead(sensorPin) == HIGH){ //condição se o sensor for ativado
tone(5, 300); //ativa o alarme a 300Hz
previousTime = millis(); //regista o tempo
}
}
unsigned long currentTime = millis(); //declarar a variavel do tempo atual
if (currentTime - previousTime >= interval) { //verifica se o tempo está no intervalo
previousTime = currentTime; //guarda tempo atual

noTone(5); //desativa o alarme após 3s (intervalo)

}
delay(10); //passam-se 0,010s
digitalWrite(verde, HIGH); //liga verde para carros
}

void blink() { //função do interruptor
if(digitalRead(vermelho2) == HIGH){ //condição para quando o sinal vermelho para peões estiver ativado
tone(5,300); //ativa alarme a 300Hz
}
}

void piscapisca(){ //função para fazer o led piscar
for (i=0; i<6; i++){ //piscar 6 vezes
digitalWrite(vermelho2, HIGH); //liga led vermelho para peões
delay(500); //permanece 0,5s ligado
digitalWrite(vermelho2, LOW); //desliga led vermelho para peões
delay(500); //permanece 0,5s desligado
}
}

resolvido!!!