// ---------------------------------------------------------------------------
// (| " Scanner_Larson.ino                                                 "|)
// (| "                                                                    "|)
// (| " Ultimate Arduino Chaser - Originalmente por Joe Larson             "|)
// (| "                                                                    "|)
// (| " ¿Quieres hacer un perseguidor simple, conocido como "Scáner Larson""|)
// (| " para tus proyectos?                                                "|)
// (| "                                                                    "|)
// (| " Opcionalmente, puede conectar potenciómetros a los pines de solo   "|)
// (| " lectura A6 y A7 para poder ajustar el ancho del escáner y la       "|)
// (| " velocidad sobre la marcha sin volver a cargar el código. Puede,    "|)
// (| " con solo editar algunas variables aquí al comienzo del código,     "|)
// (| " personalizar este escáner según sus necesidades. ¿No necesitas     "|)
// (| " tantos LED? Cambia los <numLEDs> y los pins[] en los que los has   "|)
// (| " puesto. ¿No quiere ambos o ninguno de los potenciómetros en su     "|)
// (| " proyecto? Setée useSpeedPot o useWidthPot a False y use el valor   "|)
// (| " genérico 2 para el ancho del cursor y 60 ms de retraso para la     "|)
// (| " velocidad. (Puede editar estos valores en las funciones            "|)
// (| " getDelaySpeed() y getCursorWidth() en la parte inferior del código)"|)
// (| "                                                                    "|)
// (| " ¡Un escáner Larson totalmente personalizable y liviano para todos  "|)
// (| " tus proyectos.                                                     "|)
// (| "                                                                    "|)
// (| " Este código de ejemplo es de dominio público.                      "|)
// (| "                                                                    "|)
// (| " Maker: jorgechac©                                                  "|)
// (| " Visita https://jorgechac.blogspot.com/                             "|)
// (| "                                                                    "|)
// (| " Venta de accesorios Arduino/Raspberry Pi Pico/ESP32                "|)
// (| " Whatsapp y Ventas NEQUI +573177295861                              "|)
// (| " Bucaramanga - Colombia                                             "|)
// (| " Simulación https://wokwi.com/projects/341312425454207571           "|)
// ------------------------------------------------------------------------------------------------

int numLEDs=16;
int pins[] = {2,3,4,5,6,7,8,9,10,11,12,A1,A2,A3,A4,A5};
int SpeedPotPin = A6;
int WidthPotPin = A7;
bool useSpeedPot = true;
bool useWidthPot = true;
 
void setup() 
{                
  for (int pin=0; pin < numLEDs; pin++)
  { 
    pinMode(pins[pin], OUTPUT);
  }
}
 
void loop() {
  for (int location = 0; location < numLEDs + getCursorWidth() - 1; location++)  // chasing up
  {
    drawWithDelayAt(location);
  }
  for (int location = numLEDs + getCursorWidth() - 2; location>=0; location--) // chasing down
  {
    drawWithDelayAt(location);
  }
}

void drawWithDelayAt(int loc)
{
    drawScannerAt(loc, HIGH);
    delay(getDelaySpeed());
    drawScannerAt(loc, LOW);
}

void drawScannerAt(int loc, int value)
{
  for (int j = 0; j < getCursorWidth(); j++)
    {
      if (((loc-j) < numLEDs) && ((loc-j) >= 0)) // Bounds checking
        digitalWrite(pins[loc-j], value);
    }
}

int getDelaySpeed()
{
  if (!useSpeedPot)
    return 60;
  int speedvalue = analogRead(SpeedPotPin);
  return map(speedvalue, 0, 1024, 20,400);
}

int getCursorWidth()
{
  if (!useWidthPot)
    return 2;
  int widthvalue = analogRead(WidthPotPin);
  return map(widthvalue, 0, 1024, 1,numLEDs);
}