Entrenamiento para nadadores con tiras led WS2801

Hola!

Estoy haciendo un proyecto para la universidad que consiste en guiar al nadador a través de una tira de leds WS2801, controlada mediante un Arduino MEGA, de la cual solo se encienden 6 leds que van recorriendo la tira marcando así el ritmo que debe llevar el nadador.

A continuación os muestro el código:

#include <SoftwareSerial.h>
#include "SPI.h"
//#include "Adafruit_WS2801.h"
#include <FastLED.h>

#define NUM_LEDS 800
#define DATA_PIN 3
#define CLOCK_PIN 8

CRGB leds[NUM_LEDS];

SoftwareSerial BT(0,1); //0 RX, 1 TX.
uint8_t dataPin  = 6;    // Yellow wire on Adafruit Pixels
uint8_t  clockPin  = 7;
String Datosleidos={};

String metros;
int metros1;
String inicio;
int inicio1;
String minutos;
int minutos1;
String segundos;
int segundos1;
int segundos_totales;
String vuelta_nadador;
int vuelta_nadador1;
int vuelta_nadador2;

float tiempo_por_vuelta=0.0000;
float x=0.0000;
float x1=0.0000;
char c;

float numerador=0.0000;
float denominador=0.0000;


void setup()         {    
    Serial.begin(9600); //Velocidad del puerto del módulo Bluetooth 
    FastLED.addLeds<WS2801, DATA_PIN, CLOCK_PIN, RGB, DATA_RATE_MHZ(12)>(leds, NUM_LEDS);
                     }

void loop() {   

if (Serial.available() >0) {
   {
    char c = Serial.read();
    Datosleidos += c;      
   }
                           
  if (Datosleidos.length()==10) 
  {
      inicio  = Datosleidos.substring(0,1);
      inicio1 = inicio.toInt();
      Serial.println(inicio1);                    
      metros  = Datosleidos.substring(1,4);
      metros1 = metros.toInt();
      Serial.println(metros1);
      minutos  = Datosleidos.substring(4,6);
      minutos1 = minutos.toInt(); 
      Serial.println(minutos1);                      
      segundos  = Datosleidos.substring(6,8);
      segundos1 = segundos.toInt();
      Serial.println(segundos1);
      vuelta_nadador = Datosleidos.substring(8,10);
      vuelta_nadador1 = vuelta_nadador.toInt();
      Serial.println(vuelta_nadador1); 

      segundos_totales=(minutos1*60+segundos1);
      numerador=(float)segundos_totales-(((float)vuelta_nadador1/10.0000)*((float)metros1/25.0000-1));
      denominador=(float)metros1/25.0000;
      tiempo_por_vuelta=numerador/denominador;
      x=(((float)tiempo_por_vuelta-15)/NUM_LEDS); //Puede que haya que añadir un -6
      
     
      x1=(x*1000); //tiempo en milisegundos
      
      vuelta_nadador2=vuelta_nadador1*100;
      
   
  if(inicio1 = 1)
    {
     switch (metros1){
     case 50 :
        {
         colorWipe(x1);
         delay(vuelta_nadador2);
         colorWipe2(x1);
         delay (vuelta_nadador2);
         FinishColorWipe();
         break;
        }
      case 100:
        {
         colorWipe(x1);
         delay(vuelta_nadador2);
         colorWipe2(x1);
         delay(vuelta_nadador2);
         colorWipe(x1);
         delay(vuelta_nadador2);
         colorWipe2(x1);
         delay (vuelta_nadador2);
         FinishColorWipe();    
        break;
        }
        case 200:
        {
         colorWipe(x1);
         delay(vuelta_nadador2);
         colorWipe2(x1);
         delay(vuelta_nadador2);
         colorWipe(x1);
         delay(vuelta_nadador2);
         colorWipe2(x1);
         delay(vuelta_nadador2);
         colorWipe(x1);
         delay(vuelta_nadador2);
         colorWipe2(x1);
         delay(vuelta_nadador2);
         colorWipe(x1);
         delay(vuelta_nadador2);
         colorWipe2(x1);
         FinishColorWipe();
        break;
        } 
        case 400:
        {
         colorWipe(x1);
         delay(vuelta_nadador2);
         colorWipe2(x1);
         delay(vuelta_nadador2);
         colorWipe(x1);
         delay(vuelta_nadador2);
         colorWipe2(x1);
         delay(vuelta_nadador2);
         colorWipe(x1);
         delay(vuelta_nadador2);
         colorWipe2(x1);
         delay(vuelta_nadador2);
         colorWipe(x1);
         delay(vuelta_nadador2);
         colorWipe2(x1);
         delay(vuelta_nadador2);
         colorWipe(x1);
         delay(vuelta_nadador2);
         colorWipe2(x1);
         delay(vuelta_nadador2);
         colorWipe(x1);
         delay(vuelta_nadador2);
         colorWipe2(x1);
         delay(vuelta_nadador2);
         colorWipe(x1);
         delay(vuelta_nadador2);
         colorWipe2(x1);
         delay(vuelta_nadador2);
         colorWipe(x1);
         delay(vuelta_nadador2);
         colorWipe2(x1);
         FinishColorWipe();
         
        break;
        }
         

    }
   }
  }   
 }
}             



void colorWipe(float x) 
{
 for(int whiteLed = 0; whiteLed < NUM_LEDS-6; whiteLed = whiteLed + 1) {
      // Turn our current led on to white, then show the leds
      leds[whiteLed] = CRGB::Blue;
      leds[whiteLed+1] = CRGB::Blue;
      leds[whiteLed+2] = CRGB::Blue;
      leds[whiteLed+3] = CRGB::Blue;
      leds[whiteLed+4] = CRGB::Blue;
      leds[whiteLed+5] = CRGB::Blue;
      leds[whiteLed-1] = CRGB::Black;

      // Show the leds (only one of which is set to white, from above)
      FastLED.show();

      // Wait a little bit
      delay(x);

      // Turn our current led back to black for the next loop around
      //leds[whiteLed] = CRGB::Black;
   }
}
void colorWipe2(float x)
{
  for(int whiteLed = NUM_LEDS; whiteLed >= 5; whiteLed = whiteLed - 1) {
      // Turn our current led on to white, then show the leds
      leds[whiteLed] = CRGB::Blue;
      leds[whiteLed-1] = CRGB::Blue;
      leds[whiteLed-2] = CRGB::Blue;
      leds[whiteLed-3] = CRGB::Blue;
      leds[whiteLed-4] = CRGB::Blue;
      leds[whiteLed-5] = CRGB::Black;
      leds[whiteLed+1] = CRGB::Black;

      // Show the leds (only one of which is set to white, from above)
      FastLED.show();

      // Wait a little bit
      delay(x);

      // Turn our current led back to black for the next loop around
      //leds[whiteLed] = CRGB::Black;
   }
}
 
void FinishColorWipe()
{
  for (int i=0; i < NUM_LEDS; i++)
    {
      leds[i] = CRGB::Black;
      FastLED.show();
      Datosleidos.remove(0,10);
      inicio='0';
      inicio1=0;
      metros='0';
      metros1=0;
      minutos='0';
      minutos1=0;
      segundos='0';
      segundos1=0;
      segundos_totales=0;
      tiempo_por_vuelta=0.0;
      vuelta_nadador2=0;
      vuelta_nadador1=0;
      vuelta_nadador='0';

      x1=(x1,4);
      x=0.0;
      Serial.flush();
      
    }
}

Con este código solo controlo a un nadador por pista, y me gustaría ser capaz de controlar por lo menos a 3. El problema es que no se me ocurre como modificar el código para controlar a los 3 nadadores a la vez puesto que la programación en Arduino es secuencial. ¿Me podríais dar alguna idea?

Muchas gracias de antemano.

El problema es que utilizas delays en tu programa, extenderlo es casi imposible , como primer paso deberías recoventir todo tu código eliminándolos.
Saludo

Ya estoy trabajando en eliminar todos los delays de mi código, aún así, si se os ocurriera alguna idea de como implementar lo de los 3 nadadores, lo agradecería!

Mira en documentación => Indice de temas tutoriales => millis() y tmb lee máquinas de estados.

Tambien te daré este dato que te servirá de Arduino Create, alguien que se le ocurrió usar una tira led simulando la carrera de de autos usando leds... muy interesante pero se aplica a lo que pides.

Se llama Open Led Race
Mira el video y verás que tiene similitud

Muchas gracias!

Le echaré un ojo y a ver si me es de ayuda.