Knight Rider 2008

@elmiranda, No hay tal cosa cómo que el sketch o el circuito no quiera funcionar. Si algo no funciona es que no está correcto en algún punto mínimo.

El hilo me parece bastante completo. Creo que muchos hemos expuestos diferentes formas de hacerlo e incluso tú has compartido ejemplos aunque no hayas logrado hacerlo funcionar, pero claro ¿Dónde está la duda ahora mismo?
Hay muchísimos códigos que puedes escoger cómo base para tu proyecto.

Si no hay dudas yo al menos doy el hilo por más que resuelto. De los más completos con códigos de ejemplos que tiene el foro.

Saludos

1 Like

Por si pasa desapercibido edito el post #54 añadiendo el progarama para el ejemplo alli indicado.
saludos.

Hago lo mismo con el post #5
Y ya por ultimo comparto lo ultimo que me ha salido para una tira neopixel de cualquier numero de diodos y con desvanecimiento al final.

#include <Adafruit_NeoPixel.h>
#define PIN  12 //Pin de datos
#define NUMPIXELS 24 //Numero diodos
#define DELAYVAL 20 // Velocidad tira
#define pot 5 // Potencia de los led maximo = 1 minimo = 5 valores mayores se pierde el "fade"
// Ojo al valor de nº de led y potencia ya que podriamos tener
//que utilizar una alimentacion externa
int expo [NUMPIXELS];
int y ;
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
  for (int n = 0; n <= NUMPIXELS - 8; n++) {
    expo [n] = 254;
  }
  expo [NUMPIXELS - 7] = 128;
  expo [NUMPIXELS - 6] = 64;
  expo [NUMPIXELS - 5] = 32;
  expo [NUMPIXELS - 4] = 16;
  expo [NUMPIXELS - 3] = 8;
  expo [NUMPIXELS - 2] = 4;
  expo [NUMPIXELS - 1] = 2;
  expo [NUMPIXELS] = 1;
  pixels.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
}
void loop() {
  //IDA
  for (int x = 0; x <= (NUMPIXELS * 2); x++) {
    for (y = 0; y < NUMPIXELS; y++) {
      pixels.setPixelColor(x - y, pixels.Color(expo [y] / pot , 0, 0));
    }
    pixels.show();
    delay(DELAYVAL);
    pixels.clear();
  }
  //VUELTA
  for (int x = (NUMPIXELS); x >= -NUMPIXELS; x--) {
    for (y = 0; y < NUMPIXELS; y++) {
      pixels.setPixelColor(x + y, pixels.Color(expo [y] / pot , 0, 0));
    }
    pixels.show();
    delay(DELAYVAL);
    pixels.clear();
  }
}

Y se acabo con el Raider, a ver si acabo con el proyecto para el que compre la tira, opino lo mismo que @cuantron

Saludos.

Hola, finalmente está hecho:

el unico "detalle" es que el fade solo lo hace al terminar de avanzar, pero de todas maneras quedó perfecto!!!, gracias don gatul!!!

Si, tal cual dijiste que querías (y se muestra en el video que subiste) en #31.

¡Quedó excelente! :+1:t2:

Saludos

como se podría hacer que el desvanecimiento, sea al endencer y al apagar?, quise moverle cosas a tu sketch, pero la verdad, quedó la..., en realidad no hizo nada, XD, saludos!!!

Probá éste a ver si te gusta


struct led_s {
  byte pin;
  byte brillo;
  byte fade;
  uint32_t oldTime;  
  };

led_s leds[] = {{5,0,0,0},{6,0,0,0},{9,0,0,0},{10,0,0,0},{11,0,0,0}};

const uint32_t INTERVALO = 200;
const uint32_t FADETIME = 5;

uint32_t oldTime = 0;
uint32_t newTime = 0;

byte numLeds;
byte paso = 1;
char pos = 0;  // char => signed byte

void setup(){
  numLeds = sizeof(leds)/sizeof(leds[0]);
  
  for(byte pos = 0; pos < numLeds; pos++){
    pinMode(leds[pos].pin, OUTPUT);
  }
  oldTime = millis();
}

void loop(){
  switch(paso){
    case 1:
      newTime = millis();
      if(pos < numLeds){
        if(newTime - oldTime >= INTERVALO){
          leds[pos].fade = 1;
          leds[pos].oldTime = oldTime;
          oldTime = newTime;        
          pos++;
        }
      }
      for(byte i = 0; i < numLeds; i++) {
        if(newTime - leds[i].oldTime >= FADETIME){
          leds[i].oldTime = newTime;
          if(leds[i].fade == 1){
            leds[i].brillo += 5;
            analogWrite(leds[i].pin,leds[i].brillo);
            if(leds[i].brillo == 255) leds[i].fade = 0;
          }
        }
      }
      if(leds[numLeds - 1].brillo == 255){
        pos = 0;
        paso = 2;
        oldTime = newTime;
      }
      break; 
    case 2: 
      newTime = millis();
      if(pos < numLeds){
        if(newTime - oldTime >= INTERVALO){
          leds[pos].fade = 1;
          leds[pos].oldTime = oldTime;
          oldTime = newTime;        
          pos++;
        }
      }
      for(byte i = 0; i < numLeds; i++) {
        if(newTime - leds[i].oldTime >= FADETIME){
          leds[i].oldTime = newTime;
          if(leds[i].fade == 1){
            leds[i].brillo -= 5;
            if(leds[i].brillo == 0) leds[i].fade = 0;
            analogWrite(leds[i].pin,leds[i].brillo);
          }
        }
      }
      if(leds[numLeds - 1].brillo == 0){
        pos = numLeds - 1;
        paso = 3;
        oldTime = newTime;
      }
      break; 
    case 3:
      newTime = millis();
      if(pos >= 0){
        if(newTime - oldTime >= INTERVALO){
          leds[pos].fade = 1;
          leds[pos].oldTime = oldTime;
          oldTime = newTime;        
          pos--;
        }
      }
      for(char i = numLeds - 1; i >= 0; i--) {
        if(newTime - leds[i].oldTime >= FADETIME){
          leds[i].oldTime = newTime;
          if(leds[i].fade == 1){
            leds[i].brillo += 5;
            analogWrite(leds[i].pin,leds[i].brillo);
            if(leds[i].brillo == 255) leds[i].fade = 0;
          }
        }
      }
      if(leds[0].brillo == 255){
        pos = numLeds - 1;
        paso = 4;
        oldTime = newTime;
      }
      break; 
    case 4: 
      newTime = millis();
      if(pos >= 0){
        if(newTime - oldTime >= INTERVALO){
          leds[pos].fade = 1;
          leds[pos].oldTime = oldTime;
          oldTime = newTime;        
          pos--;
        }
      }
      for(char i = numLeds - 1; i >= 0; i--) {
        if(newTime - leds[i].oldTime >= FADETIME){
          leds[i].oldTime = newTime;
          if(leds[i].fade == 1){
            leds[i].brillo -= 5;
            analogWrite(leds[i].pin,leds[i].brillo);
            if(leds[i].brillo == 0) leds[i].fade = 0;
           }
        }
      }
      if(leds[0].brillo == 0){
        pos = 0;
        paso = 1;
        oldTime = newTime;
      }
      break; 
  }
}

Recordá corregirle los pines para el Mega como lo hiciste antes.

Saludos

1 Like

Probá este!!!, jajajajajajaja, me dió tanta risa!!!, joajoajoajoajoa,

Si maestrísimo, excelente, es lo que andaba buscando, perfecto, muuuuchas gracias, si algún día tienes que venir a santiago de chile, y no tienes donde quedarte, pasa por acá maestro, saludos, y muuuuchas gracias, mañana subo un video con el KR Nissan Sentra V16!!!

:joy: :rofl: :joy:

Salió chiste sin querer!

Y te tomo la palabra! Voy preparando la valija. Jajaja

Saludos

1 Like

y bueno, lo prometido es deuda:

después veré como hacerlo par aque la velocidad sea manejada desde un potenciómetro, y, que además reproduzca el clásico sonido del escaner, gracias miles muchachos!!!

1 Like

muchachos todos, quisiera molestarlos con otra ayuda, pero del mismo tema, pasa que se me ocurrió ahora, con otro arduino, hacerlo más "inteligente", es decir, que, con un sensor de movimiento active n veces la luz de kitt, cuando esté el auto apagado, cuando esté encendido, "creo" haberlo resuelto, pero, como no es tanto lo que le pego, hice lo siguiente por mientras:


int ledpin[] ={3, 5, 6, 9, 10, 11}; //organize all PWM pins neatly.
int n = 0; //speed counter.
int i =0; // repeater.
int value[] ={0,0,0,0,0,0};

int PIR = 2;      
int RELE = 3;     
int ESTADO = 0;     

void setup(){
  pinMode(PIR, INPUT);    
  pinMode(RELE, OUTPUT);  
  delay(20000);     
}

void loop(){

  ESTADO = digitalRead(PIR);  
  if (ESTADO == HIGH){    
    //digitalWrite(RELE, HIGH);  
    RPT();
    //delay(4000);    // demora de 4 segundos
  } else {
    //digitalWrite(RELE, LOW);
  }
}

void RPT() {
 
 if(n == 100){value[0]=200;}
 if(n == 200){value[0]=200;}
 if(n == 300){value[1]=200;}
 if(n == 400){value[2]=200;}
 if(n == 500){value[3]=200;}
 if(n == 600){value[4]=200;}
 if(n == 700){value[5]=200;}
 if(n == 800){value[5]=200;}
 if(n == 900){value[4]=200;}
 if(n == 1000){value[3]=200;}
 if(n == 1100){value[2]=200;}
 if(n == 1200){value[1]=200;}
 if(n >= 1200){n =0;}
 
 //fade all pins
 for (i  = 0; i <=5; i++)
 {
   if(value[i] >= 5){ value[i]-=1;}
   else if (value[i] < 5) { value[i]=0;}
 }
 
//write to all pins
for (i  = 0; i <=5; i++)
  {
    analogWrite(ledpin[i], value [i]);
  }
  n+=5; // time stepper. Tweak at your own risk.
  delay(6); //speed modifier. Tweak at your own risk!
}
}

entonces, al momento de el PIR detectar el movimiento, como que avanza la cuncuna y se mueve casi una vez completa y dsps se queda encendida, como que no termina el ciclo

desde ya les estoy completamente agradecido a todos!!!

Que es lo que quieres que haga cuando el PIR detecta movimiento?
Cuanto tiempo debe funcionar RPT() o cuantos ciclos?

no lo puse, lo pensé pero no lo escribí, unos 20 segundos, estuve jugando un poco, e hice esto


int periodo = 2000;
int periodo2 = 5000;
unsigned long TiempoAhora = 0;
unsigned long TiempoAhora2 = 0;


int PULSADOR = 4; 

int ledpin[] ={3, 5, 6, 9, 10, 11}; 
int n = 0; 
int i =0; 
int value[] ={0,0,0,0,0,0};

int PIR = 2;      
int RELE = 13;     
int ESTADO = 0;     

void setup(){
  pinMode(PULSADOR, INPUT);
  pinMode(PIR, INPUT);    
  pinMode(RELE, OUTPUT);  
  delay(20000);     
}

void loop(){
  
  if (digitalRead(PULSADOR) == HIGH){  //dígase al darle partida al auto, se activa
    //kitton();                        //encender todos los leds en desvanecimiento
    RPT();                             // kitt luces comienzar a funcionar ininterrumpidamente
  }  
  else  {                              //cuando no, solo se activa el scanner determinado tiempo
    
    i==0;
    ledsoff();
    PIRs();
  }

  
}

void RPT() {
  
  
 {

 if(n == 100){value[0]=100;}
 if(n == 200){value[0]=100;}
 if(n == 300){value[1]=100;}
 if(n == 400){value[2]=100;}
 if(n == 500){value[3]=100;}
 if(n == 600){value[4]=100;}
 if(n == 700){value[5]=100;}
 if(n == 800){value[5]=100;}
 if(n == 900){value[4]=100;}
 if(n == 1000){value[3]=100;}
 if(n == 1100){value[2]=100;}
 if(n == 1200){value[1]=100;}
 if(n >= 1200){n =0;}
 
 //fade all pins
 for (i  = 0; i <=5; i++)
 {
   if(value[i] >= 5){ value[i]-=1;}
   else if (value[i] < 5) { value[i]=0;}
 }
 

for (i  = 0; i <=5; i++)
  {
    analogWrite(ledpin[i], value [i]);
  }
  n+=5; 
  delay(6);
 }
}

void ledsoff(){
  for (i  = 0; i <=5; i++){
    digitalWrite(ledpin[i], LOW);
    }
}

void PIRs(){
  ESTADO = digitalRead(PIR);  
    if (ESTADO == HIGH){    
      if (millis() > TiempoAhora2 + periodo2){
        digitalWrite(RELE, HIGH);  // activa mientras tanto lo que sería el encendido de todos los
        //RPT();                   // led para después comenzar con el scanner, pero no me funciona
        i==0;                      // seguir investigando
        //delay(4000);    // demora de 4 segundos
      } 
      TiempoAhora2 = millis(); 
    }
    else {
     digitalWrite(RELE, LOW); // apaga modulo rele
    }
}

void kitton(){                                //esta funcion tiene como fin, que cuando se encienda el auto, haga así como un encendido
  if (millis() > TiempoAhora + periodo){      // de todos los leds, pero no me funcionó, jajajaja, en investigación...
    for (int BRILLO = 0; BRILLO < 256; BRILLO++){
      analogWrite(ledpin[0, 1, 2, 3, 4, 5], BRILLO);
      delay(15);
    }
    for (int BRILLO = 255; BRILLO >= 0; BRILLO--){
      analogWrite(ledpin[0, 1, 2, 3, 4, 5], BRILLO);
      delay(15);
    }
    TiempoAhora = millis();
  }  
}

harto malo el "invento" jajajajaja, busca busca...

gracias a todos!

No se cual es el invento? Dirás el intento, pero seguro es tu modo de expresarte.
Yo creo que debes volver a Documentación y leer como funciona millis(). Lo usas bien, pero enfocas mal.
Si usas millis() no puedes dentro bloquear algo haciendo un ciclo como estos

Esos ciclos insumen 2x256x15 mseg = 512*15 = 7680 mseg o 7.7 segundos aprox
Obviamente no se cuanto has puesto en periodo2 y veo que son 5000 mseg o sea que en una sola iteracción consumes todo el tiempo.
Asi no se usa millis().

1 Like

por más que le busco, no lo entiendo, gracias de todas formas.

Lo que te dice @Surbyte es que no tiene sentido controlar un tiempo cada 5 segundos si lo que haces luego demora 7 segundos porque obviamente van a pasar más de 5 segundos.

Por otro lado, la forma adecuada de comparar el tiempo es

if(millis() - TiempoAhora >= periodo){

Aunque parezca lo mismo que como lo planteaste, no lo es por un tema del desborde de los contadores. Te lo dejo para que lo investigues. :wink:

Saludos

1 Like

Lo investigué, pero igual no lo entiendo..., XD, gracias de todas maneras

@gatul, supongamos que TiempoAhora = 2 y periodo = 5, hacemos un control y mseg() devuelve 3 (o sea, pasó solo un milisegundo desde que la condición se cumplió por última vez) ¿Nos puedes decir qué resultado nos daría el if?

if(mseg() - periodo >= TiempoAhora)

Pregunto yo si la forma realmente correcta de hacerlo no sería tal vez así:

if(mseg() - TiempoAhora >= periodo)

Saludos.

@elmiranda si entendiste mi primer explicación... ¡Olvidate! (Y si no llegaste a leerla, no te perdiste nada) :wink:
¡Tiene razón, me equivoqué!

Juro que mientras escribía había algo que no me cerraba, y no me di cuenta que invertí los términos.

¡Qué pedazo de pelo... pincho! :crazy_face:

¡Gracias @IgnoranteAbsoluto!

Saludos

PD: Iba a corregir el post pero es imposible, tengo que pensar todo de nuevo, así que al tacho. Perdón @elmiranda.
@IgnoranteAbsoluto si pasa nuevamente (es seguro) directamente decime que me equivoqué, no me ofende para nada. ¿Para qué hacerme pensar?
Edité #76 porque también estaba mal. Es la edad...

1 Like

Moderador:
No editen los post anteriores o si lo hacen escriban debajo
EDITO: tal cosa de lo contrario los comentarios posteriores quedan fuera de lugar.