Go Down

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

Marcus9812

#15
Jul 11, 2019, 08:54 pm Last Edit: Jul 12, 2019, 07:40 pm by Marcus9812
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
Code: [Select]

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

Marcus9812

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:
Code: [Select]
#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 :P
(Aún así dejo el código por si alguien le interesa) :smiley-mr-green:

En esta parte millis() se debería ejecutar desde 0 al cumplirse el condicional:
Code: [Select]
if (distance<stopdistance){
    if (millis () - tiempoinicio <= intervalo){
       for (int i = 0; i <= 14; i++) {
        leds[i] = CRGB::Red; }    //leds en rojo
         FastLED.show();
  }

surbyte

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

Marcus9812

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

Marcus9812

Ya he solucionado lo del reset/conteo agregando
Code: [Select]
tiempoinicio=millis ();
a esta parte
Code: [Select]
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  :D

surbyte

Y cual es el código completo que estas usando y señala donde quieres que se reincie!!

Marcus9812

Primero una disculpa por no haber contestado, ya que no he estado en casa, al final me ha gustado como ha quedado el proyecto con el codigo, pronto lo subire por si a alguien le interesa, muchas gracias por la ayuda :D

Go Up