jueves, 28 de abril de 2016

Array de salidas Arduino

En esta entrada utilizare una variable del tipo Array para guardar los pines de las salidas que utilizare, también utilizare la función switch case.
La aplicación de todo esto será un medidor de potencia que nos indicara el valor de la entrada analógica en función del número de leds encendidos siendo uno el mínimo y diez el máximo.


Comencemos por el código:

Primero declararemos la variable array como un array de enteros y añadiremos los valores que contendrá esta cadena:

   int Leds[]={2,3,4,5,6,7,8,9,10,11};

Luego declaramos otras variables de utilidad:

   int estado;
   int Poten = 0;
   int valorPoten = 0;
   int i;

Ahora configuraremos los pines del array Leds como pines de salida dentro del void setup(), para hacerlo de una manera mas rápida y sencilla utilizare un bucle for para configurar cada uno de los pines:

   void setup()
  {
     for(i=0;i<10;i++) // la variable i la iniciamos en 0 ya que la primera posición del array siempre es        // 0 posición que en nuestro caso equivale al valor 2 este bucle se ejecutara 10 veces con lo que el        // ultimo valor de i sera 9 que coincide con la ultima posición  del array
     {
       pinMode(Leds[i],OUTPUT);
     }
  }

Bien una vez configurados los pines como salidas digitales llega la parte de crea nuestro "indicador de potencia" con led, esto lo haremos dentro de una función propia que ejecutaremos dentro del void loop(). Primero escribiré el código dentro del void loop() y luego creare la función que se encargara de encender los led en la secuencia correcta cada vez que la llamemos desde el void loop:

  void loop()
  {
    valorPoten = analogRead(Poten);// guardamos el valor de la entrada analógica dentro de una               variable
    estado = map(valorPoten,0,1023,0,10);//Convertimos el valor de la variable en valores de 0 a 10
    Secuencia();// Llamamos a la función secuencia
  }

Una vez creado el codigo que se ejecutara en bucle creamos la función Secuencia, esta función es la encargada de crear la secuencia de leds, tendrá como característica que sera del tipo void y no recibirá ningún valor de la función principal ya que la variable estado es de carácter global. Dentro de ella habrá un switch case que sera el encargado de encender los leds en función del valor de estado:

  void Secuencia()
  {
    switch(estado)
    {
      case 0:
      digitalWrite(Leds[0],HIGH);
      for(i=1;i<10;i++)
     {
       digitalWrite(Leds[i],LOW);
      }
      delay(50);
      break;
    case 1:
    for(i=0;i<2;i++)
    {
    digitalWrite(Leds[i],HIGH);
    }
    for(i=2;i<10;i++)
    {
    digitalWrite(Leds[i],LOW);
    }
    delay(50);
    break;
    case 2:
    for(i=0;i<3;i++)
    {
    digitalWrite(Leds[i],HIGH);
    }
    for(i=3;i<10;i++)
    {
    digitalWrite(Leds[i],LOW);
    }
    delay(50);
    break;
    case 3:
    for(i=0;i<4;i++)
    {
    digitalWrite(Leds[i],HIGH);
    }
    for(i=4;i<10;i++)
    {
    digitalWrite(Leds[i],LOW);
    }
    delay(50);
    break;
    case 4:
    for(i=0;i<5;i++)
    {
    digitalWrite(Leds[i],HIGH);
    }
    for(i=5;i<10;i++)
    {
    digitalWrite(Leds[i],LOW);
    }
    delay(50);
    break;
    case 5:
    for(i=0;i<6;i++)
    {
    digitalWrite(Leds[i],HIGH);
    }
    for(i=6;i<10;i++)
    {
    digitalWrite(Leds[i],LOW);
    }
    delay(50);
    break;
    case 6:
    for(i=0;i<7;i++)
    {
    digitalWrite(Leds[i],HIGH);
    }
    for(i=7;i<10;i++)
    {
    digitalWrite(Leds[i],LOW);
    }
    delay(50);
    break;
    case 7:
    for(i=0;i<8;i++)
    {
    digitalWrite(Leds[i],HIGH);
    }
    for(i=8;i<10;i++)
    {
    digitalWrite(Leds[i],LOW);
    }
    delay(50);
    break;
    case 8:
    for(i=0;i<9;i++)
    {
    digitalWrite(Leds[i],HIGH);
    }
    for(i=9;i<10;i++)
    {
    digitalWrite(Leds[i],LOW);
    }
    delay(50);
    break;
    case 9:
    for(i=0;i<10;i++)
    {
    digitalWrite(Leds[i],HIGH);
    }
    delay(50);
    break;
   
  }
}

Aquí abajo os dejo el esquema de cableado y el código completo:
Las resistencias de de 220 Ohm y el potenciómetro es de 10 kOhm.



Código completo:

int Leds[]={2,3,4,5,6,7,8,9,10,11};
int estado;
int Poten = 0;
int valorPoten = 0;
int i;
void setup()
{
  for(i=0;i<10;i++)
  {
    pinMode(Leds[i],OUTPUT);
  }
}

void loop() 
{
  valorPoten = analogRead(Poten);
  estado = map(valorPoten,0,1023,0,10);
  Secuencia();
}
void Secuencia()
{
  switch(estado)
  {
    case 0:
    digitalWrite(Leds[0],HIGH);
    for(i=1;i<10;i++)
    {
    digitalWrite(Leds[i],LOW);
    }
    delay(50);
    break;
    case 1:
    for(i=0;i<2;i++)
    {
    digitalWrite(Leds[i],HIGH);
    }
    for(i=2;i<10;i++)
    {
    digitalWrite(Leds[i],LOW);
    }
    delay(50);
    break;
    case 2:
    for(i=0;i<3;i++)
    {
    digitalWrite(Leds[i],HIGH);
    }
    for(i=3;i<10;i++)
    {
    digitalWrite(Leds[i],LOW);
    }
    delay(50);
    break;
    case 3:
    for(i=0;i<4;i++)
    {
    digitalWrite(Leds[i],HIGH);
    }
    for(i=4;i<10;i++)
    {
    digitalWrite(Leds[i],LOW);
    }
    delay(50);
    break;
    case 4:
    for(i=0;i<5;i++)
    {
    digitalWrite(Leds[i],HIGH);
    }
    for(i=5;i<10;i++)
    {
    digitalWrite(Leds[i],LOW);
    }
    delay(50);
    break;
    case 5:
    for(i=0;i<6;i++)
    {
    digitalWrite(Leds[i],HIGH);
    }
    for(i=6;i<10;i++)
    {
    digitalWrite(Leds[i],LOW);
    }
    delay(50);
    break;
    case 6:
    for(i=0;i<7;i++)
    {
    digitalWrite(Leds[i],HIGH);
    }
    for(i=7;i<10;i++)
    {
    digitalWrite(Leds[i],LOW);
    }
    delay(50);
    break;
    case 7:
    for(i=0;i<8;i++)
    {
    digitalWrite(Leds[i],HIGH);
    }
    for(i=8;i<10;i++)
    {
    digitalWrite(Leds[i],LOW);
    }
    delay(50);
    break;
    case 8:
    for(i=0;i<9;i++)
    {
    digitalWrite(Leds[i],HIGH);
    }
    for(i=9;i<10;i++)
    {
    digitalWrite(Leds[i],LOW);
    }
    delay(50);
    break;
    case 9:
    for(i=0;i<10;i++)
    {
    digitalWrite(Leds[i],HIGH);
    }
    delay(50);
    break;
    
  }
}



No hay comentarios:

Publicar un comentario