// ---------------------------------------------------------------------------
// (| " 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);
}
nano:12
nano:11
nano:10
nano:9
nano:8
nano:7
nano:6
nano:5
nano:4
nano:3
nano:2
nano:GND.2
nano:RESET.2
nano:0
nano:1
nano:13
nano:3.3V
nano:AREF
nano:A0
nano:A1
nano:A2
nano:A3
nano:A4
nano:A5
nano:A6
nano:A7
nano:5V
nano:RESET
nano:GND.1
nano:VIN
nano:12.2
nano:5V.2
nano:13.2
nano:11.2
nano:RESET.3
nano:GND.3
led4:A
led4:C
led5:A
led5:C
led6:A
led6:C
led7:A
led7:C
led8:A
led8:C
led9:A
led9:C
led10:A
led10:C
led11:A
led11:C
led12:A
led12:C
led13:A
led13:C
led14:A
led14:C
led15:A
led15:C
led16:A
led16:C
led17:A
led17:C
led18:A
led18:C
led3:A
led3:C
pot1:GND
pot1:SIG
pot1:VCC
pot2:GND
pot2:SIG
pot2:VCC