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
(Aún así dejo el código por si alguien le interesa)
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();
}