Control de tiras led con joystick arduino

Buenas noches a todo/as, estoy embarcado en un pequeño proyecto de controlar, mediante un joystick un par e tiras led WS2812B con Arduino Uno WIFI Rev2 y varias librerias, la del ejemplo es con fastled, aunque estoy con adafruit neopixel.
Este es el código que estoy empleando;

#include <FastLED.h>
#define NUM_LEDS 61
CRGBArray<NUM_LEDS> ledsi;
CRGBArray<NUM_LEDS> ledsd;

int X;        // variable para almacenar valor leido del eje X
int Y;        // variable para almacenar valor leido del eje y

//int LED_IZQUIERDO = 3;    // Giro izquierdo a pin digital 3 (No usado)
//int LED_DERECHO = 5;    // Giro derecho a pin digital 5 (No usado)
           
int IZQD_ABAJO = 6;    // Izquierda hacia abajo a pin digital 6
int DRCH_ARRIBA = 9;   // Derecha hacia arriba a pin digital 9
int PULSADOR = 10;    // pulsador incorporado pin digital 10
int PITO_SW = 11;    // PITO de pulsador a pin digital 11
int SW;       // variable para almacenar valor leido del pulsador

void setup(){

FastLED.addLeds<NEOPIXEL,6>(ledsi, NUM_LEDS);
FastLED.addLeds<NEOPIXEL,9>(ledsd, NUM_LEDS);
  
  //pinMode(LED_IZQUIERDO, OUTPUT); // LED como salida(No usado)
  //pinMode(LED_DERECHO, OUTPUT);   // LED como salida(No usado)
  
  pinMode(IZQD_ABAJO, OUTPUT);   // TIRALED IZQD como salida
  pinMode(DRCH_ARRIBA, OUTPUT);    // TIRALED DRCH como salida
  pinMode(PITO_SW, OUTPUT);    // PITO como salida
  pinMode(PULSADOR, INPUT);   // pulsador como entrada
  // entradas analogicas no requieren inicializacion A0-A1
}
void loop(){

  X = analogRead(A0);     // lectura de valor de eje x
  Y = analogRead(A1);     // lectura de valor de eje x
  SW = digitalRead(PULSADOR);   // lectura de valor de pulsador

//  if (X >= 0 && X < 480){         // si X esta en la zona izquierda(No usado)
//  } else {
//  }
//  if (X > 520 && X <= 1023){          // si X esta en la zona derecha(No usado)
//  } else {
//  }
  if (Y >= 0 && Y < 480){         // si Y esta en la zona de abajo (Izquierda)

 static uint8_t hue;
  for(int i = 0; i < NUM_LEDS/2; i++) {   
    // fade everything out
    ledsi.fadeToBlackBy(40);

    // let's set an led value
    ledsi[i] = CHSV(255,255,100);
    hue++; //con esto en alguno de los colores conseguimos que cambien aleatoriamente

    // now, let's first 20 leds to the top 20 leds, 
    ledsi(NUM_LEDS/2,NUM_LEDS-1) = ledsi(NUM_LEDS/2 - 1 ,0);
    FastLED.delay(33);    
  }
}     
//     else {
     
   // analogWrite(IZQD_ABAJO, 0);          // Y en zona de reposo, apago TIRALED
 //  }
  if (Y > 520 && Y <= 1023){          // si Y esta en la zona de arriba

 static uint8_t hue;
  for(int i = 0; i < NUM_LEDS/2; i++) {   
    // fade everything out
    ledsd.fadeToBlackBy(40);

    // let's set an led value
    ledsd[i] = CHSV(255,255,100);
   // hue++ con esto en alguno de los colores conseguimos que cambien aleatoriamente

    // now, let's first 20 leds to the top 20 leds, 
    ledsd(NUM_LEDS/2,NUM_LEDS-1) = ledsd(NUM_LEDS/2 - 1 ,0);
    FastLED.delay(33);
  }
  }
//  else {
//     analogWrite(DRCH_ARRIBA, 0);          // Y en zona de reposo, apaga TIRALED     
//  }
         
  digitalWrite(PITO_SW, !SW);    // escribe en LED valor opuesto al leido del pulsador
  FastLED.clear();
      }
//He intentado ponerlo como bucle pero no me deja.
//void efecto1(){ 
//  static uint8_t hue;
//  for(int i = 0; i < NUM_LEDS/2; i++) {   
//    // fade everything out
//    ledsi.fadeToBlackBy(40);
//
//    // let's set an led value
//    ledsi[i] = CHSV(255,255,100);
//   // hue++; con esto en alguno de los colores conseguimos que cambien aleatoriamente
//
//    // now, let's first 20 leds to the top 20 leds, 
//    ledsi(NUM_LEDS/2,NUM_LEDS-1) = ledsi(NUM_LEDS/2 - 1 ,0);
//    FastLED.delay(33);
//  }
//}
//
//void efecto2(){ 
//  static uint8_t hue;
//  for(int i = 0; i < NUM_LEDS/2; i++) {   
//    // fade everything out
//    ledsd.fadeToBlackBy(40);
//
//    // let's set an led value
//    ledsd[i] = CHSV(255,255,100);
//   // hue++ ; con esto en alguno de los colores conseguimos que cambien aleatoriamente
//
//    // Efecto led, de extremos al centro
//    ledsd(NUM_LEDS/2,NUM_LEDS-1) = ledsd(NUM_LEDS/2 - 1 ,0);
//    FastLED.delay(33);
//  }
//}

Ahora funciona cada vez que le doy al mando. Estoy intentando que permanezca la tira led encendida durante 5 segundos en bucle y se apague, pero no hay manera, una vez activado el mando derecha hace el movimiento de leds y se queda encendido hasta que giro al otro lado, se apaga la tira led encendida ,pero se queda la otra encendida una vez terminado el movimiento de los leds.
Si alguien puede darme alguna idea......
Muchísimas gracias, un cordial saludo.

Ok. Para lograr lo que quieres debes usar una máquina de estados en la que cada movimiento funcione como una secuencia lógica, incluyendo el apagado.

Tienes idea de cómo hacerlo?

No, ahora estaba mirando interrupciones, a ver si parando el codigo..... pero creo que slamente son digitales, no analogicas....comentame lo de la maquina de estados.
Muchas gracias un cordial saludo.

Mirando toldo de [Qué es y cómo funciona una máquina de estados).

viendo tu ejemplo.....thk

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.