Asistente de aparcamiento con Leds Ws2812 y HC-SR04

Hola de nuevo (Aunque creo que ya nadie lee esto jaja); Ya he solucionado el error que tenía y ha quedado de la siguiente manera:

#include <FastLED.h>
#include <QuickStats.h>
QuickStats stats; 
#define LED_PIN     10
#define NUM_LEDS    15
const int trigPin = 7;
const int echoPin = 6;
//Variables utilizadas
CRGB leds[NUM_LEDS];
float duration;
float durationarray[15];
int distance;
int stopdistance=5; 
int startdistance=80; 
int increment=((startdistance-stopdistance)/15);

unsigned long tiempoinicio = millis (); 
unsigned long intervalo = 10000; //Leds rojos a 10 segundos 

extern volatile unsigned long timer0_millis;
unsigned long new_value = 0;


void setup() {
 pinMode(trigPin, OUTPUT); 
 pinMode(echoPin, INPUT);
 FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
 Serial.begin(9600); 
}

void loop() {
  for (int i=0;i<=14;i++){
    // Clears the trigPin
    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);
    durationarray[i] = pulseIn(echoPin, HIGH);
    distance= durationarray[i]*0.034/2;
    Serial.print(distance);
    Serial.print(" ");
    
  }
    duration = (stats.median(durationarray,15));
    distance= duration*0.034/2;
    Serial.print("Distance: ");
    Serial.println(distance);

if (distance <= startdistance) {
  if (distance<stopdistance){ 
    if (millis () - tiempoinicio <= intervalo){
       for (int i = 0; i <= 14; i++) {
        leds[i] = CRGB::Red; }    //leds en rojo
         FastLED.show();
  }
  else{
 for(int i = 0;i<=14;i++){ //Los leds estan apagados si no hay nada frente al sensor
  leds[i] = CRGB::Black; 
  } 
  FastLED.show();
}
  }
else
if (distance<stopdistance+increment){
  for (int i = 1; i <= 14; i++) {
    leds[i] = CRGB ( 0, 0, 0);
  }
 for (int i = 0; i <= 0; i++) {
    leds[i] = CRGB ( 255, 255, 0);
  }
  FastLED.show();
  delay(50);
}
else
if (distance<stopdistance+increment*2){
  for (int i = 2; i <= 14; i++) {
    leds[i] = CRGB ( 0, 0, 0);
  }
 for (int i = 0; i <= 1; i++) {
    leds[i] = CRGB ( 255, 255, 0);
  }
  FastLED.show();
  delay(50);
}
else
if (distance<stopdistance+increment*3){
   for (int i = 3; i <= 14; i++) {
    leds[i] = CRGB ( 0, 0, 0);
  }
 for (int i = 0; i <= 2; i++) {
    leds[i] = CRGB ( 255, 255, 0);
  }
  FastLED.show();
  delay(50);
}
else
if (distance<stopdistance+increment*4){
   for (int i = 4; i <= 14; i++) {
    leds[i] = CRGB ( 0, 0, 0);
  }
 for (int i = 0; i <= 3; i++) {
    leds[i] = CRGB ( 0, 255,0);
  }
  FastLED.show();
  delay(50);
}
else
if (distance<stopdistance+increment*5){
   for (int i = 5; i <= 14; i++) {
    leds[i] = CRGB ( 0, 0, 0);
  }
 for (int i = 0; i <= 4; i++) {
  leds[i] = CRGB ( 0, 255,0);
  }
  FastLED.show();
  delay(50);
}
else
if (distance<stopdistance+increment*6){
   for (int i = 6; i <= 14; i++) {
    leds[i] = CRGB ( 0, 0, 0);
  }
 for (int i = 0; i <= 5; i++) {
   leds[i] = CRGB ( 0, 255,0);
  }
  FastLED.show();
  delay(50);
}
else
if (distance<stopdistance+increment*7){
   for (int i = 7; i <= 14; i++) {
    leds[i] = CRGB ( 0, 0, 0);
  }
 for (int i = 0; i <= 6; i++) {
   leds[i] = CRGB ( 0, 255,0);
  }
  FastLED.show();
  delay(50);
}
else
if (distance<stopdistance+increment*8){
   for (int i = 8; i <= 14; i++) {
    leds[i] = CRGB ( 0, 0, 0);
  }
 for (int i = 0; i <= 7; i++) {
    leds[i] = CRGB ( 0, 255,0);
  }
  FastLED.show();
  delay(50);
}
else
if (distance<stopdistance+increment*9){
   for (int i = 9; i <= 14; i++) {
    leds[i] = CRGB ( 0, 0, 0);
  }
 for (int i = 0; i <= 8; i++) {
   leds[i] = CRGB ( 0, 255,0);
  }
  FastLED.show();
  delay(50);
}
else
if (distance<stopdistance+increment*10){
   for (int i = 10; i <= 14; i++) {
    leds[i] = CRGB ( 0, 0, 0);
  }
 for (int i = 0; i <= 9; i++) {
    leds[i] = CRGB ( 0, 255,0);
  }
  FastLED.show();
  delay(50);
}
else
if (distance<stopdistance+increment*11){
   for (int i = 11; i <= 14; i++) {
    leds[i] = CRGB ( 0, 0, 0);
  }
 for (int i = 0; i <= 10; i++) {
    leds[i] = CRGB ( 0, 255,0);
  }
  FastLED.show();
  delay(50);
}
else
if (distance<stopdistance+increment*12){
   for (int i = 12; i <= 14; i++) {
    leds[i] = CRGB ( 0, 0, 0);
  }
 for (int i = 0; i <= 11; i++) {
    leds[i] = CRGB ( 0, 255,0);
  }
  FastLED.show();
  delay(50);
}
else

if (distance<stopdistance+increment*13){
   for (int i = 13; i <= 14; i++) {
    leds[i] = CRGB ( 0, 0, 0);
  }
 for (int i = 0; i <= 12; i++) {
   leds[i] = CRGB ( 0, 255,0);
  }
  FastLED.show();
  delay(50);
}
else
if (distance<stopdistance+increment*14){
   for (int i = 14; i <= 14; i++) {
    leds[i] = CRGB ( 0, 0, 0);
  }
 for (int i = 0; i <= 13; i++) {
   leds[i] = CRGB ( 0, 255,0);
  }
  FastLED.show();
  delay(50);
}
else
if (distance>=stopdistance+increment*14){
 for (int i = 0; i <= 14; i++) {
   leds[i] = CRGB ( 0, 255,0);
  }
  FastLED.show();
  delay(50);
}
}
else{
 for(int i = 0;i<=14;i++){ //Los leds estan apagados si no hay nada frente al sensor
  leds[i] = CRGB::Black; 
  } 
  FastLED.show();
}
}
void setMillis(unsigned long new_millis){
  uint8_t oldSREG = SREG;
  cli();
  timer0_millis = new_millis;
  SREG = oldSREG;
}

Ahora, el único problema es que el timer con millis solo se ejecuta una sola vez, al llegar al color rojo y no lo vuelve a hacer nunca, a menos de que reinicie la placa. He estado investigando que existe una forma de reiniciar millis(), pero es usando una función llamada jump, de la cual no entiendo nada :stuck_out_tongue:
(Aún así dejo el código por si alguien le interesa) :grin:

En esta parte millis() se debería ejecutar desde 0 al cumplirse el condicional:

if (distance<stopdistance){ 
    if (millis () - tiempoinicio <= intervalo){
       for (int i = 0; i <= 14; i++) {
        leds[i] = CRGB::Red; }    //leds en rojo
         FastLED.show();
  }