Asistente de aparcamiento con Leds Ws2812 y HC-SR04

Hola :grin:
He seguido un proyecto para arduino pro micro que consiste, en que con el sensor ultrasónico HC-SR04 se apaguen una serie de leds (15 exactamente)y/o se enciendan en función de la distancia del automóvil al sensor y ha salido bien; El problema es que cuando no hay ningún auto y/o el carro ya está aparcado, los leds se quedan encendidos, lo que reduce el tiempo de vida de estos.
Me gustaría que cuando no haya ningún objeto en una distancia "x" frente al sensor, los leds se queden apagados hasta que el sensor detecte algo dentro del rango programado y los encienda, pero los apague cuando el sensor se encuentre a una distancia mínima del auto después de un tiempo.

El código es este:

/*
* Garage Parking Sensor - Published By Bob Torrence
*/
#include <FastLED.h>
#include <QuickStats.h>
QuickStats stats; 
#define LED_PIN     10
#define NUM_LEDS    15
const int trigPin = 13;
const int echoPin = 12;
//Variables utilizadas
CRGB leds[NUM_LEDS];
float duration;
float durationarray[15];
int distance;
int stopdistance=5; 
int startdistance=80; 
int increment=((startdistance-stopdistance)/15);

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<stopdistance){         //Distancia mínima ó final entre el carro y el sensor
    for (int i = 0; i <= 14; i++) 
     leds[i] = CRGB ( 255, 0, 0);     //leds en rojo indicando que ya no se debe avanzar más
     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);
}
}

Primero he simplificado tu código y ahora cuando lo pruebes me dices si funciona igual, al final veras el cambio que permitirá apagar tus leds, pero no lo hice asi que agregalo tu.

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

byte colores[15][3] = { {255,   0,  0},
                        {255, 255,  0},
                        {255, 255,  0},
                        {255, 255,  0},
                        {  0, 255,  0},
                        {  0, 255,  0},
                        {  0, 255,  0},
                        {  0, 255,  0},
                        {  0, 255,  0},
                        {  0, 255,  0},
                        {  0, 255,  0},
                        {  0, 255,  0},
                        {  0, 255,  0},
                        {  0, 255,  0},                        
                        {  0, 255,  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 (distancia <= startdistance) {
   for (byte step=0; step <=15; step++) {
      if (distance<stopdistance+increment*step){
          if (step > 0) {
              for (int i = step; i <= step-1; i++) {
                  leds[i] = CRGB ( 0, 0, 0);
              }
          }
          for (int i = 0; i <= 0; i++) {
              leds[i] = CRGB (colores[step][0], colores[step][1], colores[step][2]);
          }
          FastLED.show();
          delay(50);
      }  
  }
 } else {
     // aca coloca lo que quieras que hagan para apagarlos
 }
}

Olvidé decirte que hay un hilo en el comienzo de la sección que da las razones por las cuales no debes postear en esta sección pero no lo has leído.
Muevo el hilo a Software y presta mas atención a las indicaciones de cada Sección.

No seria mas facil coger la alimentacion de la toma regulada por la llave de contacto para que solo funcione con la llave puesta?

Ok, primero una disculpa por no haber colocado el post en la seccion adecuada

jose:
No seria mas facil coger la alimentacion de la toma regulada por la llave de contacto para que solo funcione con la llave puesta?

Creo que no me he explicado bien, una disculpa lo que intento hacer es algo como esto:
Asistente de Ap
Pero apagando los leds cuando no se utilizan al no tener nada en frente o cuando el auto ha llegado al final.
En cuanto al código que ha puesto Surbyte
Voy a probarlo ya mismo :smiley:

He probado el código, pero ahora solo enciende un led y este lo hace de manera aleatoria y sin ningun motivo.

Se deslizó un error, a ver ahora

if (distancia <= startdistance) {
    for (byte step=0; step <=15; step++) {
        if (distance < stopdistance + increment*step){
            if (step > 0) {
                for (int i = step; i <= 14; i++) {
                    leds[i] = CRGB ( 0, 0, 0);
                }
            }
            for (int i = 0; i <= step-1; i++) {
                leds[i] = CRGB (colores[step][0], colores[step][1], colores[step][2]);
            }
            FastLED.show();
            delay(50);
        } 
    }
 } else {
     // aca coloca lo que quieras que hagan para apagarlos
 }

Solo esta parte, debe ser reemplazada

Gracias, el código ha funcionado y he logrado apagar el verde después de un tiempo, pero ahora no consigo apagar el color rojo después de un tiempo

Yo te puse donde apagas los Leds

 // aca coloca lo que quieras que hagan para apagarlos

Que es lo que no puedes lograr?

Lo que no he conseguido es que cuando los leds esten en el rojo 255, 0, 0, pasen 20 segundos y posteriormente se apaguen

Y debes usar millis() para lograr algo fluido que funcione.

Deberias usar la otra forma que directamente maneja los colores y no esta CRGB (R, G, B)

es mas cómoda creo.

Si cuando se pone en ROJO tu tomas el tiempo x ejemplo start = millis();
luego solo debes hacer esto al momento de chequear cuando apagarlos

if (millis() - start >20000UL) {
  // Apagar los leds
}

start debe ser definida como unsigned long

ve a documentacion y lee en el Indice de temas tutoriales como usar millis()

Ok, parece que funcionó con millis(); Pero me he dado cuenta que los leds prenden de uno en uno y ahora cuando llega a la distancia mínima, no se muestra el color rojo, se muestra el amarillo y luego el verde, esto ocurre con y sin millis() en el código

Bueno verifica los colores. Ya tienes como trabajar, ahora hay que observar como funciona. Si no terminas de entender algo, hazlo mas lento para que quede claro.
Agrega Serial.print("Etiqutas") que te digan que estas haciendo.
Asi se resuelven las cosas.

Ya he arreglado lo de los colores, pero aún no entiendo por que empiezan a prender de uno en uno hasta llegar a el led 15 y despues se reinician y empiezan nuevamente de uno en uno, a pesar de que la distancia sea fija.

Porque eso hacía tu código!!
O como crees que funciona FlashLed? Envía ordenes a cada led ubicado por su ID.

He regresado al código original y le he añadido cosas del código nuevo y todo funciona perfectamente, ha excepción del color rojo que siguen sin apagarse

#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);

long previousMillis = 0;     
long intervalOn = 25000; // 25 segundos  ON

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);
    unsigned long currentMillis = millis();

if (distance <= startdistance) {
      
  if (distance<stopdistance){ 
     if(currentMillis - previousMillis < intervalOn) {
      previousMillis = currentMillis;    
      for (int i = 0; i <= 14; i++) {
       leds[i] = CRGB ( 255, 0, 0);     //leds en rojo
        FastLED.show();  
      }
     }
      else{  
        for (int i = 0; i <= 14; i++) {
         leds[i] = CRGB ( 0, 0, 0);     //leds en off
          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);
}
}
}

Por algun fallo mío, que aún no detecto no se apagan en esta parte:

 if (distance<stopdistance){ 
     if(currentMillis - previousMillis < intervalOn) {
      previousMillis = currentMillis;    
      for (int i = 0; i <= 14; i++) {
       leds[i] = CRGB ( 255, 0, 0);     //leds en rojo
        FastLED.show();  
      }
     }
      else{  
        for (int i = 0; i <= 14; i++) {
         leds[i] = CRGB ( 0, 0, 0);     //leds en off
          FastLED.show();
    }
     }
  }

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();
  }

Si se lee cuando se puede porque existe una vida y obligaciones, asi que debes se paciente. Si no respondo yo alguien lo hara.
Millis no se reinicia. Olvida jump porque te dara mas problemas que soluciones.
Si no entendiste millis ve a documentaciin y releelo.

Veo que has vuelto a tu codigo y que usas un setmillis que no creo haga falta. Yo estoy de viaje y mas no puedo opinar oor ahora

Disculpa por ser impaciente, en cuanto al set millis fue un error mío, ya que se me olvido borrarlo :grin:, ya que andaba haciendo algunas pruebas con él.
El millis funciona bien solo que nadamas se ejecuta una vez, pero seguiré estudiando

Ya he solucionado lo del reset/conteo agregando tiempoinicio=millis ();
a esta parte

else{
 for(int i = 0;i<=14;i++){ //Los leds están apagados si no hay nada frente al sensor
  leds[i] = CRGB::Black; 
  } 
  FastLED.show();
   tiempoinicio=millis ();//Reset de millis 
}

El unico inconveniente es que solo se reinicia el conteo, si no hay nada frente al sensor
Aunque es provisional, ya que me gustaría que se reiniciará el conteo, una vez iniciado el color verde, pero se hace lo que se puede :smiley: