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.