Go Down

Topic: Asistente de aparcamiento con Leds Ws2812 y HC-SR04 (Read 943 times) previous topic - next topic

Marcus9812

Hola :smiley-mr-green:
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:
Code: [Select]

/*
* 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);
}
}
 

surbyte

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.

Code: [Select]
#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
 }
}

surbyte

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.

_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?

Marcus9812

#4
Jun 30, 2019, 07:51 pm Last Edit: Jun 30, 2019, 07:56 pm by Marcus9812
Ok, primero una disculpa por no haber colocado el post en la seccion adecuada
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 :D

Marcus9812

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

surbyte

Se deslizó un error, a ver ahora


Code: [Select]
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

Marcus9812

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

surbyte

Yo te puse donde apagas los Leds

Code: [Select]
// aca coloca lo que quieras que hagan para apagarlos

Que es lo que no puedes lograr?


Marcus9812

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

surbyte

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
Code: [Select]
start = millis();
luego solo debes hacer esto al momento de chequear cuando apagarlos

Code: [Select]
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()

Marcus9812

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

surbyte

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.

Marcus9812

#13
Jul 06, 2019, 05:02 pm Last Edit: Jul 06, 2019, 05:07 pm by Marcus9812
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.

surbyte

#14
Jul 07, 2019, 12:50 am Last Edit: Jul 23, 2019, 03:01 am by surbyte
Porque eso hacía tu código!!
O como crees que funciona FlashLed? Envía ordenes a cada led ubicado por su ID.

Go Up