Mejorar el código de Arduino con bucles

Mejorar el código de Arduino con bucles

En este capítulo, no vamos a realizar ningún esquema nuevo. Quiero dedicarlo a mejorar el código de Arduino del capítulo anterior con el uso de bucles, de manera que aprendas a escribir código más óptimo, de mayor calidad.

Código para mejorar

Este es el código del capítulo anterior. Lo que hace es mostrar en un LED un mensaje de SOS en código morse.

void setup() {
  // Seleccionamos el Pin digital 7 con salida
  pinMode(7, OUTPUT);
}

void loop() {
  // Mensaje SOS en el pin 7:

  // S en código morse
  digitalWrite(7, HIGH);
  delay(600);
  digitalWrite(7, LOW);
  delay(300);
  digitalWrite(7, HIGH);
  delay(600);
  digitalWrite(7, LOW);
  delay(300);
  digitalWrite(7, HIGH);
  delay(600);
  digitalWrite(7, LOW);
  delay(300);

  // O en código morse
  digitalWrite(7, HIGH);
  delay(1800);
  digitalWrite(7, LOW);
  delay(300);
  digitalWrite(7, HIGH);
  delay(1800);
  digitalWrite(7, LOW);
  delay(300);
  digitalWrite(7, HIGH);
  delay(1800);
  digitalWrite(7, LOW);
  delay(300);

  
  // S en código morse
  digitalWrite(7, HIGH);
  delay(600);
  digitalWrite(7, LOW);
  delay(300);
  digitalWrite(7, HIGH);
  delay(600);
  digitalWrite(7, LOW);
  delay(300);
  digitalWrite(7, HIGH);
  delay(600);
  digitalWrite(7, LOW);
  delay(300);

  // Pausa final más larga para distinguir la vuelta a empezar
  digitalWrite(7, LOW);
  delay(5000);
}

Mejorar el código

Lo primero que vamos a hacer, es declarar una serie de variables antes del setup(). Estas las vamos a poder utilizar durante todo el código.

Variables globales

int pin = 7;
int encendidoCorto = 600;
int encendidoLargo = 1800;
int pausa = 300;

Las variables con int, son de tipo numérico (integers, enteros).

Escribiendo el setup() del código

En el setup(), vamos a poner lo mismo, solo que en lugar de poner el valor del pin, esta vez, haremos referencia a la variable que contiene ese valor, pin.

void setup() {
  pinMode(pin, OUTPUT);
}

Escribiendo nuestra propia función con un bucle

Aquí viene la parte interesante. Vamos a hacer una función con un bucle dentro que sea capaz de repetir los pulsos repetitivos con poco código.

Le damos un nombre a la función, puesto que cada vez que la vamos a llamar, va a ejecutar una letra, la he llamado letra. De argumento, le vamos a pasar una nueva variable, pulso. Esta variable es la que tendrá el valor de encendidoCorto o encendidoLargo según la letra que queramos.

Lo siguiente, es un bucle for, el cual tiene una condición de salida de menor que 3 y un incremento de 1. Esto se traduce en que se va a ejecutar tres veces, cuando "i" valga 0, cuando valga 1 y cuando valga 2. Tres ya no es menor que tres.

Cada ejecución va, primero, a alimentar el pin y se le va a dar un delay() correspondiente al argumento dado en la llamada a la función. Después de encenderse y pasar el delay(), se va a apagar con un delay equivalente a la variable pausa, que es 300 ms. Así acaba la primera ejecución del bucle. Lo hará dos veces más.

void letra(int pulso)
{
  for (int i=0;i<3;i++)
  {
    digitalWrite(pin, HIGH);
    delay(pulso);           
    digitalWrite(pin, LOW);    
    delay(pausa);
  }
}

Llamadas a la función

Ahora solo falta crear las tres llamadas a la función que van a corresponder a cada letra. Además, tenemos el delay final de 5000 ms.

Llamamos a la función que acabamos de crear con el valor de encendidoCorto, es lo mismo que darle un valor de 600 ms. Con esto, se ejecutará la secuencia que hemos creado con el bucle.

Luego, llamamos de nuevo para la letra O. Esta vez, se le pasa el argumento encendidoLargo que equivale a 1800.

Lo mismo hacemos una vez más para la última S.

void loop() {
  // Llamada a la función letra para la letra S
  letra(encendidoCorto);
  // Llamada a la función letra para la letra S
  letra(encendidoLargo);
  // Llamada a la función letra para la letra S
  letra(encendidoCorto);
  
  // Pausa final más larga para distinguir la vuelta a empezar
  digitalWrite(pin, LOW);
  delay(5000);
}

Como puedes ver, esto es más óptimo, pero bastante, más complicado de entender. Es por eso, que preferí explicarlo de la otra forma en el capítulo anterior.

Espero que hayas podido entender todo esto. Si no sabes nada de programación, seguramente te cueste algo más de entenderlo. Solo ves haciendo comparaciones con el otro código y mira el vídeo, quizás te ayude a entenderlo mejor. Además, por supuesto, si te quedan dudas, déjame un comentario.

Código de la práctica completo

Este es el código completo:

int pin = 7;
int encendidoCorto = 600;
int encendidoLargo = 1800;
int pausa = 300;
 
void setup() {
  // Se selecciona el pin para el LED
  pinMode(pin, OUTPUT);
}

// Función para repetir los pulsos
void letra(int pulso)
{
  for (int i=0;i<3;i++)
  {
    digitalWrite(pin, HIGH);
    delay(pulso);           
    digitalWrite(pin, LOW);    
    delay(pausa);
  }
}

void loop() {
  // Llamada a la función letra para la letra S
  letra(encendidoCorto);
  // Llamada a la función letra para la letra S
  letra(encendidoLargo);
  // Llamada a la función letra para la letra S
  letra(encendidoCorto);
  
  // Pausa final más larga para distinguir la vuelta a empezar
  digitalWrite(pin, LOW);
  delay(5000);
}

No te pierdas nada de Arduino. ¡Aquí lo tienes todo!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Arduino uno Entrada anterior Mensaje SOS con un LED en Arduino
Entrada siguiente LED con pulsador en Arduino